Symbol.isConcatSpreadable 屬性

admin發表於2017-04-24

物件的Symbol.isConcatSpreadable屬性等於一個布林值。

表示該物件使用Array.prototype.concat()時,是否可以展開。

更多關於Symbol的內容可以參閱JavaScript Symbol一章節。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼
let arr = ["螞蟻部落", 4, "青島市南區"];
let ant = ["前端教程"];
console.log(ant.concat(arr,"ES6教程"));
console.log(arr[Symbol.isConcatSpreadable]);

從上面的程式碼可以看出,陣列arr是可以展開的,Symbol.isConcatSpreadable屬性此時的返回值是undefined,和返回true是一樣的效果,都是表示可以展開。

[JavaScript] 純文字檢視 複製程式碼
let arr = ["螞蟻部落", 4, "青島市南區"];
let ant = ["前端教程"];
arr[Symbol.isConcatSpreadable] = false;
console.log(ant.concat(arr, "ES6教程"));
console.log(arr[Symbol.isConcatSpreadable]);

可以顯式設定此屬性值為false,這時候對應的陣列就不可以展開。

[JavaScript] 純文字檢視 複製程式碼
let obj = {length: 2, 0: "螞蟻部落", 1:"青島市南區"};
console.log(["前端教程", "分享互助"].concat(obj, "ES6教程"));
obj[Symbol.isConcatSpreadable] = true;
console.log(["前端教程", "分享互助"].concat(obj, "ES6教程"));

對於類陣列而言,預設情況下,Symbol.isConcatSpreadable屬性值為false,不過可以顯示設定為true。

[JavaScript] 純文字檢視 複製程式碼
class A1 extends Array {
  constructor(args) {
    super(args);
    this[Symbol.isConcatSpreadable] = true;
  }
}
class A2 extends Array {
  constructor(args) {
    super(args);
    this[Symbol.isConcatSpreadable] = false;
  }
}
let a1 = new A1();
a1[0] = 3;
a1[1] = 4;
let a2 = new A2();
a2[0] = 5;
a2[1] = 6;
console.log([1, 2].concat(a1).concat(a2));

對於一個類來說,Symbol.isConcatSpreadable屬性必須寫成例項的屬性。

類A1是可展開的,類A2是不可展開的。