展开语法(Spread syntax)
-
可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开
-
可以在构造字面量对象时, 将对象表达式按值键对的方式展开(字面量一般指 [1, 2, 3] 或者 {name: "mdn"} 这种简洁的构造方式)
-
展开语法使用次数不限,但函数传值的限制为25个参数
语法
//函数调用
myFunction(...iterableObj);
//字面量数组构造或 字符串 :
[...iterableObj, '4', ...'hello', 6];
//构造字面量对象时,进行克隆或者属性拷贝(ECMAScript 2018规范新增特性)
let objClone = { ...obj };
用法
1.等价于Function.apply(),传入数组,会被迭代为函数的参数
function func(a,b,c){}
var arr = [1,2,3];
func.apply(null,arr);
//等价于
function func(a,b,c){}
var arr = [1,2,3];
func(...arr);
2.在构造时(此时传值不同于apply,因为它调用的是Call而不是Construct)
function applyAndNew(constructor, args) {
function partial () {
return constructor.apply(this, args);
};
if (typeof constructor.prototype === "object") {
partial.prototype = Object.create(constructor.prototype);
}
return partial;
}
3.构造字面量数组/对象
//拷贝数组
var arr = [1, 2, 3];
var arr2 = [...arr]; // 像是arr.slice()
/*实际上, 展开语法和 Object.assign() 行为一致,
执行的都是浅拷贝(只遍历一层)。
如果想对多维数组进行深拷贝还需要自己写历遍*/
var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift(); // 1
// Now array a is affected as well: [[], [2], [3]]
object.assign(target,src);
//将src(可枚举属性)的值复制到target,并返回target
网友评论