From 01b0e12ba27b5069248fd09235e9a7143915ee30 Mon Sep 17 00:00:00 2001 From: Irvin Date: Wed, 16 Feb 2022 02:02:49 +0800 Subject: remove `notranslate` class in zh-CN --- .../reference/operators/spread_syntax/index.html | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'files/zh-cn/web/javascript/reference/operators/spread_syntax') diff --git a/files/zh-cn/web/javascript/reference/operators/spread_syntax/index.html b/files/zh-cn/web/javascript/reference/operators/spread_syntax/index.html index 0397ee8e96..3f21c5b960 100644 --- a/files/zh-cn/web/javascript/reference/operators/spread_syntax/index.html +++ b/files/zh-cn/web/javascript/reference/operators/spread_syntax/index.html @@ -20,15 +20,15 @@ translation_of: Web/JavaScript/Reference/Operators/Spread_syntax

函数调用:

-
myFunction(...iterableObj);
+
myFunction(...iterableObj);

字面量数组构造或字符串:

-
[...iterableObj, '4', ...'hello', 6];
+
[...iterableObj, '4', ...'hello', 6];

构造字面量对象时,进行克隆或者属性拷贝(ECMAScript 2018规范新增特性):

-
let objClone = { ...obj };
+
let objClone = { ...obj };

示例

@@ -38,19 +38,19 @@ translation_of: Web/JavaScript/Reference/Operators/Spread_syntax

如果想将数组元素迭代为函数参数,一般使用{{jsxref( "Function.prototype.apply")}} 的方式进行调用。

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

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

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

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

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

使用 new 关键字来调用构造函数时,不能直接使用数组+ apply 的方式(apply 执行的是调用 [[Call]] , 而不是构造 [[Construct]])。当然, 有了展开语法, 将数组展开为构造函数的参数就很简单了:

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

如果不使用展开语法, 想将数组元素传给构造函数, 实现方式可能是这样的:

-
function applyAndNew(constructor, args) {
+
function applyAndNew(constructor, args) {
    function partial () {
       return constructor.apply(this, args);
    };
@@ -96,7 +96,7 @@ console.log(new myConstructorWithArguments);
 
 

没有展开语法的时候,只能组合使用 push, splice, concat 等方法,来将已有数组元素变成新数组的一部分。有了展开语法,  通过字面量方式, 构造新数组会变得更简单、更优雅:

-
var parts = ['shoulders', 'knees'];
+
var parts = ['shoulders', 'knees'];
 var lyrics = ['head', ...parts, 'and', 'toes']; 
 // ["head", "shoulders", "knees", "and", "toes"]
 
@@ -105,7 +105,7 @@ var lyrics = ['head', ...parts, 'and', 'toes'];

数组拷贝(copy)

-
var arr = [1, 2, 3];
+
var arr = [1, 2, 3];
 var arr2 = [...arr]; // like arr.slice()
 arr2.push(4);
 
@@ -115,7 +115,7 @@ arr2.push(4);
 
 

提示: 实际上, 展开语法和 {{jsxref("Object.assign()")}} 行为一致, 执行的都是浅拷贝(只遍历一层)。如果想对多维数组进行深拷贝, 下面的示例就有些问题了。

-
var a = [[1], [2], [3]];
+
var a = [[1], [2], [3]];
 var b = [...a];
 b.shift().shift(); // 1
 // Now array a is affected as well: [[2], [3]]
@@ -125,28 +125,28 @@ b.shift().shift(); // 1
 
 

{{jsxref("Array.concat")}} 函数常用于将一个数组连接到另一个数组的后面。如果不使用展开语法, 代码可能是下面这样的:

-
var arr1 = [0, 1, 2];
+
var arr1 = [0, 1, 2];
 var arr2 = [3, 4, 5];
 // 将 arr2 中所有元素附加到 arr1 后面并返回
 var arr3 = arr1.concat(arr2);

使用展开语法:

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

{{jsxref("Array.unshift")}} 方法常用于在数组的开头插入新元素/数组.  不使用展开语法, 示例如下:

-
var arr1 = [0, 1, 2];
+
var arr1 = [0, 1, 2];
 var arr2 = [3, 4, 5];
 // 将 arr2 中的元素插入到 arr1 的开头
 Array.prototype.unshift.apply(arr1, arr2) // arr1 现在是 [3, 4, 5, 0, 1, 2]

如果使用展开语法, 代码如下:  [请注意, 这里使用展开语法创建了一个新的 arr1 数组,  {{jsxref("Array.unshift")}} 方法则是修改了原本存在的 arr1 数组]:

-
var arr1 = [0, 1, 2];
+
var arr1 = [0, 1, 2];
 var arr2 = [3, 4, 5];
 arr1 = [...arr2, ...arr1]; // arr1 现在为 [3, 4, 5, 0, 1, 2]
 
@@ -157,7 +157,7 @@ arr1 = [...arr2, ...arr1]; // arr1 现在为 [3, 4, 5, 0, 1, 2]

浅拷贝(Shallow-cloning, 不包含 prototype) 和对象合并, 可以使用更简短的展开语法。而不必再使用 {{jsxref("Object.assign()")}} 方式.

-
var obj1 = { foo: 'bar', x: 42 };
+
var obj1 = { foo: 'bar', x: 42 };
 var obj2 = { foo: 'baz', y: 13 };
 
 var clonedObj = { ...obj1 };
@@ -173,7 +173,7 @@ var mergedObj = { ...obj1, ...obj2 };
 
 

提示: 不能替换或者模拟 {{jsxref("Object.assign()")}} 函数:

-
var obj1 = { foo: 'bar', x: 42 };
+
var obj1 = { foo: 'bar', x: 42 };
 var obj2 = { foo: 'baz', y: 13 };
 const merge = ( ...objects ) => ( { ...objects } );
 
@@ -191,7 +191,7 @@ var mergedObj = merge ( {}, obj1, obj2);
 
 

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

-
var obj = {'key1': 'value1'};
+
var obj = {'key1': 'value1'};
 var array = [...obj]; // TypeError: obj is not iterable
 
-- cgit v1.2.3-54-g00ecf