类数组特性
- 可以利用属性名模拟数组的特性
- 可以动态的增加length属性
- 如果强行让类数组调用push方法,则会根据length属性值的位置进行属性值的扩充。
类数组举例
1,arguments
2,一个对象:属性要为索引(数字)属性,必须有length属性,最好加上push
类数组里面最关键的是length属性,类数组中push实现的原理
Array.prototype.push = function (target) {
obj[obj.length] = target;
obj.length++;
}
1
var obj = {
"2" : "a",
"3" : "b",
"length" : 2,
"push" : Array.prototype.push
}
obj.push('c');
obj.push('d');
console.log(obj);
//Object { 2: "c", 3: "d", length: 4, push: push() }
2
var obj = {
"1" : "a",
"2" : "c",
"3" : "d",
"length" : 3,
"push" : Array.prototype.push
}
obj.push('b');
console.log(obj);
//Object { 1: "a", 2: "c", 3: "b", length: 4, push: push() }
3
var obj = {
"0" : 'a',
"1" : 'b',
"2" : 'c',
name :"abc",
age : 123,
length : 3,
push : Array.prototype.push,
splice :Array.prototype.splice
}
类数组的好处就是把数组和对象的好处拼到一起,
但是并不是所有的数组方法都能用,除非你自己添加
封装typeof方法
//1,分两类,原始值和引用值
//2,区分引用值
function type (target){
var ret = typeof(target);
var template = {
"[object Array]" : "array",
"[object Object]" : "object",
"[object Number]" : "number-object",
"[object String]" : "string-object",
"[object Boolean]" : "boolean-object"
}
if(target === null){
return "null";
}else if(ret == 'object'){//引用值:数组,对象,包装类
var str = Object.prototype.toString.call(target);
return template[str];
}else{
return ret;//原始值:直接用typeof来区分
}
}
数组去重(要求在原型链上编程)
var arr = [1,1,1,1,2,2,2,2,2];
//利用对象的一个属性只能对应一个值的特性来去重
//var obj = {
// "1" : 'abc',
// "2" : 'abc,
//}
"1"-->undefined
"1"-->"abc"
"2"-->undefined
"2"-->"abc"
//新建一个对象,遍历数组里面的每一个值拿来当做对象的一个属性,如果该属性已经存在了值,那就跳过,继续找下一个值。
//看它是不是为对象在对象里面已经有了值,如果没有值,那就把数组里面的这个值作为该对象的一个新的属性。
//最后输出对象的所有属性就是去掉数组里面重复的值。
Array.prototype.unique = function () {
var temp = {}; //新建一个空对象
var arr = []; //新建一个空数组,用来返回 去重后的结果
var len = this.length;
for(var i = 0; i < len; i++){
if (!temp[this[i]] ) { //this[i]表示arr[i]表示数组里面的每一个值
//temp[this[i]]表示对象里面的这个属性(数组里面的值)的值是不是undefined,如果是undefined,就说明这要添加到该对象里面为一个新的属性。
//所以这个地方就是!temp[this[i]],表述如果它是!undefined == true就要给它赋值,然后push到去重数组里面去。
temp[this[i]] = 'abc';
arr.push(this[i]);
}
}
return arr;
}