2023年7月10日 星期一

改變 Array.concat() 的特性

 改變 Array.concat() 的特性

前言

  最近學習 Symbol 時發現它可以改變Array.concat() 的特性,在此把學習的過程做紀錄。

 

內容

  範例如下

let strAr = [ 'a' , 'b' , 'c' ];
let numAr1 = [ 1 , 2 , 3 ];
let numAr2 = [ 4 , 5 , 6 ];
console.log( strAr.concat(numAr1) );//["a", "b", "c", 1, 2, 3]
//
numAr1[ Symbol.isConcatSpreadable ] = false;
console.log( strAr.concat(numAr1) );//["a", "b", "c", [1, 2, 3]]
console.log( strAr.concat(numAr2) );//["a", "b", "c", 4, 5, 6]


範例開頭先示範一次正常的 Array.concat() ,接著透過 Symbol.isConcatSpreadable 這個 Symbol 來存取 Array 的特性,改變後再次 Array.concat() 後發現 Array 不會被展開了!要注意這個改變特性是針對個別的 Array 來修改,所以與 numAr2 執行 Array.concat()  又再次展開了。Symbol 可以用來改變改變 Function 的行為,用起來雖然優美,但這是不是也代表著以後這些 Funciton 不能認定它只有一種行為,個人認為透過提供新的 Method 或讓 Function 可以用參數來調整行為的做法是比較好的。


參考資料

[ developer.mozilla.org ] Symbol.isConcatSpreadable

沒有留言:

張貼留言