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
以上就是全部相关知识点,感谢大家的阅读和对毛票票的支持。