首页 > 试题广场 >

请你说说事件扩展符用过吗(...),什么场景下

[问答题]
请你说说事件扩展符用过吗(...),什么场景下
推荐

得分点

等价于apply的方式、将数组展开为构造函数的参数、数组字符串连接、浅拷贝

参考答案

标准回答

展开语法(Spread syntax), 可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。常见的场景:等价于apply的方式、将数组展开为构造函数的参数、字面量数组或字符串连接不需要使用concat等方法了、构造字面量对象时,进行浅克隆或者属性拷贝

加分回答

只能用于可迭代对象

在数组或函数参数中使用展开语法时, 该语法只能用于 可迭代对象:

var obj = {'key1': 'value1'};
var array = [...obj]; // TypeError: obj is not iterable

剩余语法(剩余参数)

剩余语法(Rest syntax) 看起来和展开语法完全相同,不同点在于, 剩余参数用于解构数组和对象。从某种意义上说,剩余语法与展开语法是相反的:展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来并“凝聚”为单个元素。

function f(...[a, b, c]) {
  return a + b + c;
}
f(1)          // NaN (b and c are undefined)
f(1, 2, 3)    // 6
f(1, 2, 3, 4) // 6 (the fourth parameter is not destructured)

延伸阅读

等价于apply的方式

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction.apply(null, args);

有了展开语法,可以这样写:

function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);

所有参数都可以通过展开语法来传值,也不限制多次使用展开语法。

function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);

将数组展开为构造函数的参数:

var dateFields = [1970, 0, 1]; // 1970年1月1日
var d = new Date(...dateFields);

数组连接

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes']; 
// ["head", "shoulders", "knees", "and", "toes"]

数组拷贝(copy):浅拷贝

var arr = [1, 2, 3];
var arr2 = [...arr]; // like arr.slice()
arr2.push(4);

连接多个数组

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
var arr3 = [...arr1, ...arr2];

构造字面量对象时使用展开语法

var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };

var clonedObj = { ...obj1 };
// 克隆后的对象: { foo: "bar", x: 42 }

var mergedObj = { ...obj1, ...obj2 };
// 合并后的对象: { foo: "baz", x: 42, y: 13 }
编辑于 2021-09-15 11:59:37 回复(0)

合并数组

与解构赋值结合

函数的返回值

字符串

实现了 Iterator 接口的对象

Map 和 Set

发表于 2022-05-24 16:40:43 回复(0)
合并数组,数组赋值,函数返回值,类数组转数组。
发表于 2024-05-15 14:50:53 回复(0)