JavaScript展开操作符(Spread operator)详解
你可以通过展开操作符(Spreadoperator)...扩展一个数组对象和字符串。展开运算符(spread)是三个点(…),可以将可迭代对象转为用逗号分隔的参数序列。如同rest参数的逆运算。
用于数组
以数组为例,首先创建一个数组,
consta=[1,2,3], b=[4,5,6];
你可以轻松赋值一个数组:
constc=[...a]//[1,2,3]
你还可以轻松拼接两个数组:
constd=[...a,...b]//[1,2,3,4,5,6]
也可以如下拼接
constd=[...a,4,5,6]//[1,2,3,4,5,6]
如果要把一个数组b的元素全部插入到数组a的后面(不生成新数组),可以这样操作:
consta=[1,2,3]; a.push(...b);
如果要把一个数组b的元素全部插入到数组a的前面(不生成新数组),可以这样操作:
consta=[1,2,3]; a.unshift(...b);
类数组对象变成数组
可以通过展开运算符把类数组对象变成真正的数组:
varlist=document.getElementsByTagName('a');
vararr=[..list];
用于对象
展开操作符同样可以用于对象。可以通过以下方式clone一个对象:
constnewObj={...oldObj}
注意:如果属性值是一个对象,那么只会生成一个指向该对象的引用,而不会深度拷贝。也就是说,展开运算符不会递归地深度拷贝所有属性。并且,只有可枚举属性会被拷贝,原型链不会被拷贝。
还可以用于merge两个对象。
constobj1={a:111,b:222};
constobj2={c:333,d:444};
constmerged={...obj1,...obj2};
console.log(merged);//->{a:111,b:222,c:333,d:444}
当然也可以适用于以下的情况:
constothers={third:3,fourth:4,fifth:5}
constitems={first:1,second:1,...others}
items//{first:1,second:2,third:3,fourth:4,fifth:5}
如果merge的多个对象有相同属性,则后面的对象的会覆盖前面对象的属性,比如
constobj1={a:111,b:222};
constobj2={b:333,d:444};
constmerged={...obj1,...obj2};
console.log(merged);//->{a:111,b:333,d:444}
constobj1={a:111,b:222}
constmerged={a:222,...obj1};
console.log(merged);//->{a:111,b:333}
constobj1={a:111,b:222}
constmerged={...obj1,a:222};
console.log(merged);//->{a:222,b:333}
用于字符串
通过展开操作符,可以把一个字符串分解成一个字符数组,相当于
consthey='hey' constarrayized=[...hey]//['h','e','y']
以上代码相当于:
consthey='hey'
constarrayized=hey.split('')//['h','e','y']
用于函数传参
通过展开操作符,可以通过数组给函数传参:
constf=(foo,bar)=>{}
consta=[1,2]
f(...a)
constnumbers=[1,2,3,4,5]
constsum=(a,b,c,d,e)=>a+b+c+d+e
constsum=sum(...numbers)
用于具有Iterator接口的对象
具有Iterator接口的对象Map和Set结构,Generator函数,可以使用展开操作符,比如:
vars=newSet();
s.add(1);
s.add(2);
vararr=[...s]//[1,2]
function*gen(){
yield1;
yield2;
yield3;
}
vararr=[...gen()]//1,2,3
如果是map,会把每个key和value转成一个数组:
varm=newMap(); m.set(1,1) m.set(2,2) vararr=[...m]//[[1,1],[2,2]]
注意以下代码会报错,因为obj不是一个Iterator对象:
varobj={'key1':'value1'};
vararray=[...obj];//TypeError:objisnotiterable
以上就是全部相关知识点,感谢大家的阅读和对毛票票的支持。