数组方法

concat

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。

  1. var arr1 = ['a','b','c'];
  2. console.log(arr1);
  3. var arr2 = ['d','e','f'];
  4. console.log(arr2);
  5. var arr3 = arr1.concat(arr2); //["a", "b", "c", "d", "e", "f"]
  6. var arr4 = arr2.concat(arr1); //["d", "e", "f", "a", "b", "c"]
  7. console.log(arr3);
  8. console.log(arr4);

toString

**toString()** 返回一个字符串,表示指定的数组及其元素。

    var arr5 = ['a','b','c','d'];
    var arr6 = [1,2,3,4,5,6,7];
    console.log(arr5.toString()); // a,b,c,d
    console.log(arr6.toString()); // 1,2,3,4,5,6,7

slice

**slice()** 方法返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。

    // slice
    // [start,end) =>  (start,end)
    var arr7 = ['a','b','c','d','f']; 
    var arr8 = arr7.slice(3); // ["c", "d"]
    console.log(arr8);

join

**join()** 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。

    var arr = ['a','b','c','d'];
    var str1 = arr.join('-');
    console.log(str1); // a-b-c-d

split

**split() **方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。

    var arr = ['a','b','c','d'];
    var str1 = arr.join('-');
    console.log(str1); // a-b-c-d
    var arr1 = str1.split('-');
    console.log(arr1); // ["a", "b", "c", "d"]

类数组

类数组定义
  1)拥有length属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理);
2)不具有数组所具有的方法;
类数组vs数组

    Object.prototype.push = Array.prototype.push;
    function test() {
        var arr = [1,2,3,4,5,6,7];
        arguments.push(8); //  不继承=> Array.prototype
        console.log(arguments,arr);
    }   
    test(1,2,3,4,5,6,7)

image.png

    function test() {
        arguments.push(7); //  不继承=> Array.prototype
        console.log(arguments);
    }   
    test(1,2,3,4,5,6,7)

image.png

如何解决

    Object.prototype.push = Array.prototype.push;
    function test() {
        arguments.push(8); //  不继承=> Array.prototype
        console.log(arguments);
    }   
    test(1,2,3,4,5,6,7)

push原理

    Array.prototype.push = function (elem) {
        this[this.length] = elem;
        this.length++;
    }

push面试题

    var  obj ={
        '2':3,
        '3':4,
        'length':2,
        'splice':Array.prototype.splice,
        'push':Array.prototype.push
    }
    obj.push(1);
    obj.push(2);
    console.log(obj);

    //obj[2] = 1;
    //obj[3] = 2;

参考push原理 push根据数组的length属性为索引确定数组位置添加数组元素
此时this.length 等于 2 elem = 1 => this.length 等于 3 elem = 2 => this.length 等于 4
image.png

作业:

1.封装typeof

    function myTypeof(val){
        var type = typeof(val);
        var toStr = Object.prototype.toString;
        var res = {
            '[object Array]': 'array',
            '[object Object]': 'object',
            '[object Number]': 'object number',
            '[object String]': 'object string',
            '[object Boolean]': 'object boolean'
        }
        if(val === null){
            return null;  //先判断是否是null类型因为 null 是特殊的object型 如果是的话就先排除
        }else if(type === 'object'){ //判断是否是引用类型的数据
            var ret = toStr.call(val);  //判断具体的引用类型
            return res[ret]; //返回对象中具体的引用类型
        }else{
            return type; //若不是引用类型的数据 则直接返回type类型数据
        }
    }
    console.log(myTypeof(new Number(1)));

2.数组去重

    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
        Array.prototype.unique = function(){
        var temp = {},
            newArr = [];
        for(var i = 0;i<this.length;i++){
            if(!temp.hasOwnProperty(this[i])){
                temp[this[i]] = this[i];
                newArr.push(this[i]);
            }
        }
        return newArr;
    }
    console.log(arr.unique())

解题思路: 利用键名唯一的特性**hasOwnProperty
设置一个空对象,遍历数组 判断传入的每个数组元素是否为其属性 如果不是则空对象传入此属性
新数组加入此元素.**

字符串去重

         var str = '1122333aaaabbbbb';
        String.prototype.unique = function(){
        var temp = {},
            newArr = '';
        for(var i=0;i<this.length;i++){
            if(!temp.hasOwnProperty(this[i])){
                temp[this[i]] = this[i];
                newArr+=this[i];
            }
        }
        return newArr;
    }
    console.log(str.unique());