Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 静态数据属性表示 众所周知的符号 Symbol.isConcatSpreadableArray.prototype.concat() 方法会在每个被连接的对象上查找此符号,以确定它是否应该被视为类数组对象并将其展平成其数组元素。

尝试一下

众所周知的符号 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable 的属性属性
可写
可枚举
可配置

描述

[Symbol.isConcatSpreadable] 属性可以定义为自有属性或继承属性,其值为布尔值。它可以控制数组和类数组对象的行为

  • 对于数组对象,默认行为是展开(展平)元素。Symbol.isConcatSpreadable 可以避免在这些情况下展平。
  • 对于类数组对象,默认行为是不展开或展平。Symbol.isConcatSpreadable 可以强制在这些情况下展平。

示例

数组

默认情况下,Array.prototype.concat() 将数组展开(展平)到其结果中

js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // Result: ['a', 'b', 'c', 1, 2, 3]

当将 Symbol.isConcatSpreadable 设置为 false 时,您可以禁用默认行为

js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

numeric[Symbol.isConcatSpreadable] = false;
const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // Result: ['a', 'b', 'c', [1, 2, 3] ]

类数组对象

对于类数组对象,默认行为是不展开。Symbol.isConcatSpreadable 需要设置为 true 才能获得展平的数组

js
const x = [1, 2, 3];

const fakeArray = {
  [Symbol.isConcatSpreadable]: true,
  length: 2,
  0: "hello",
  1: "world",
};

x.concat(fakeArray); // [1, 2, 3, "hello", "world"]

注意:length 属性用于控制要添加的对象属性的数量。在上面的示例中,length:2 表示要添加两个属性。

规范

规范
ECMAScript 语言规范
# sec-symbol.isconcatspreadable

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参见