js类数组 + 封装typeof方法 + 数组去重

类数组特性

  1. 可以利用属性名模拟数组的特性
  2. 可以动态的增加length属性
  3. 如果强行让类数组调用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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43623871/article/details/88791728