Symbol.isConcatSpreadable
>内置的 Symbol.isConcatSpreadable 符号用于配置某对象作为 Array.prototype.concat() 方法的参数时是否展开其数组元素。
尝试一下
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];
let alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric);
// Expected output: Array ["a", "b", "c", 1, 2, 3]
numeric[Symbol.isConcatSpreadable] = false;
alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric);
// Expected output: Array ["a", "b", "c", Array [1, 2, 3]]
描述
Symbol.isConcatSpreadable 符号可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:
- 对于数组对象,默认情况下,用于 concat 时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置
Symbol.isConcatSpreadable可以改变默认行为。 - 对于类似数组的对象,用于 concat 时,该对象整体作为新数组的元素,重置
Symbol.isConcatSpreadable可改变默认行为。
Symbol.isConcatSpreadable 的属性特性 | |
|---|---|
| 可写 | 否 |
| 可枚举 | 否 |
| 可配置 | 否 |
示例
>数组
默认情况下,Array.prototype.concat() 展开其元素连接到结果中:
js
var alpha = ["a", "b", "c"],
numeric = [1, 2, 3];
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果:['a', 'b', 'c', 1, 2, 3]
设置Symbol.isConcatSpreadable为false:
js
var alpha = ["a", "b", "c"],
numeric = [1, 2, 3];
numeric[Symbol.isConcatSpreadable] = false;
var alphaNumeric = alpha.concat(numeric);
console.log(alphaNumeric); // 结果:['a', 'b', 'c', [1, 2, 3] ]
Array-like 对象
对于类数组 (array-like) 对象,默认不展开。期望展开其元素用于连接,需要设置 Symbol.isConcatSpreadable 为 true:
js
var x = [1, 2, 3];
var fakeArray = {
[Symbol.isConcatSpreadable]: true,
length: 2,
0: "hello",
1: "world",
};
x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
规范
| 规范 |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.isconcatspreadable> |