阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS Symbol.isConcatSpreadable

      内置的**Symbol.isConcatSpreadable**符号用于配置某对象作为Array.prototype.concat()方法的参数时是否展开其数组元素。

      Symbol.isConcatSpreadable 属性的属性特性:
      writable
      enumerable
      configurable

      描述

      @@isConcatSpreadable 符号 (Symbol.isConcatSpreadable) 可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:

      • 对于数组对象,默认情况下,用于concat时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置Symbol.isConcatSpreadable可以改变默认行为。
      • 对于类似数组的对象,用于concat时,该对象整体作为新数组的元素,重置Symbol.isConcatSpreadable可改变默认行为。

      示例

      数组

      默认情况下,Array.prototype.concat() 展开其元素连接到结果中:

      var alpha = ['a', 'b', 'c'], 
          numeric = [1, 2, 3]; 
      
      var alphaNumeric = alpha.concat(numeric); 
      
      console.log(alphaNumeric); // 结果: ['a', 'b', 'c', 1, 2, 3]
      
      

      设置Symbol.isConcatSpreadablefalse

      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:

      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 2015 (6th Edition, ECMA-262)Symbol.isconcatspreadableStandardInitial definition.
      ECMAScript Latest Draft (ECMA-262)Symbol.isconcatspreadableDraftNo change.

      参考

      目录
      目录