• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • Symbol.isConcatSpreadable

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


    描述

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

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

    示例

    数组

    默认情况下,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"]