扩展运算符/展开运算符和使用与扩展

266 阅读2分钟

扩展运算符/展开运算符

语法

函数调用

myFunction(...iterableObj);

字面量数组构造或字符串

myFunction(...iterableObj);

构造字面量对象时,进行克隆或者属性拷贝

let objClone = { ...obj };

作用

扩展运算符允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展。

对象扩展运算符

对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中

对象拷贝

    let obj = {                         
        'a': 1,                       
        'b': 2                        
    };                                     
    let newObj = {...obj};              
    console.log(newObj); // {'a':1,'b':2}

运算符后可以跟自定义属性

    let obj = {
        'a': 1,
        'b': 2
    };                                           
    let newObj = {...obj,'c':3};              
    console.log(newObj); // {'a':1,'b':2,'c':3}

如果自定义属性与被扩展的对象同名,则同名属性会被覆盖

    let obj = {                         
        'a': 1,                       
        'b': 2                        
    };                                     
    let newObj = {...obj,'a':3};        
    console.log(newObj); // {'a':3,'b':2}

扩展运算符对对象实例的拷贝属于浅拷贝(拷贝对象的引用)

    let obj = {                                     
        'a': 1,                                   
        'b': 2,                                   
        'c':{                                      
            d:3                                
        }                                          
    };                                                 
    let newObj = {...obj};                          
    obj.c.d = 4;                                     
    console.log(newObj); // {'a':1,'b':2,'c':{'d':4}}

对象结构

    let {x,y,...z} = {         
        x: 1,                
        y: 2,                
        a: 3,                
        b: 4                 
    }                             
    console.log(x); // 1        
    console.log(y); // 2        
    console.log(z); // {a:3,b:4}

数组扩展运算符

数组拷贝

    let arr1 = [1,2,3];         
    let arr2 = [...arr1];       
    console.log(arr2); // [1,2,3]

将字符串转换为数组

    console.log([..."abcd"]); 
    // ['a','b','c','d']

将伪数组转换为数组

    function foo(){                           
        let args = [...arguments];      
        console.log(args); // [1,2,3,4,5]
    }                                          
    foo(1,2,3,4,5);                            

代替apply

    // ES5写法                         
    Math.max.apply(null,[1,2,3]); // 3 
    // ES6                              
    Math.max(...[1,2,3]); // 3         

数组分割

    let [a,...b] = [1,2,3,4]; 
    console.log(b); // [2,3,4] 

数组合并

    let arr1 = [3,4];                 
    let arr2 = [1,2,...arr1,5,6];     
    console.log(arr2); // [1,2,3,4,5,6]

变量交换

    let x = 1;             
    let y = 2;             
    [x,y] = [y,x];          
    console.log(x,y); // 2,1

与解构赋值结合

    let [a,b,c,d,e] = "hello";
    console.log(a); //"h"       
    console.log(b); //"e"       
    console.log(c); //"l"       
    console.log(d); //"l"       
    console.log(e); //"o"       

实例

多维数组扁平化

    let arr = [1, [2, [3, [4, 5]]]];    
    function flatArr(arr) {                  
        let isArr = (item) => {       
            return Array.isArray(item)
        }                                  
        while (arr.some(isArr)) {        
            arr = [].concat(...arr)  
        }                                  
        return arr;                       
    }                                          
    console.log(flatArr(arr)); // [1,2,3,4,5]