[JavaScript]我對 Object key 的錯誤認知
我原本一直以為假若使用 Array 或者 Object 當作另一個 Object 的 key 時,會使用他們的 reference,直到我遇到了 bug 並且簡單做了測試
以下為測試的例子,使用的環境為 Node.js
,關注的焦點是 Object 被當作 key 時的情況
// Case Array
const arr1 = [1, 3];
const arr2 = [2, 4];
const obj1 = {};
obj1[arr1] = 3;
obj1[arr2] = 4;
console.log(obj1); // { '1,3': 3, '2,4': 4 }
// Case Object
const keyObj1 = { a: 3 };
const keyObj2 = { b: 4 };
const obj2 = {};
obj2[keyObj1] = 3;
obj2[keyObj2] = 4;
// !! issue happened
console.log(obj2); // { '[object Object]': 4 }
從上面的例子可以知道,不論是 Array 或者 Object 都不會使用各自的 reference 當作 key 。 Array 的值會整個被拿來使用,Object 則會變成 `[object Object]'
請觀察 Case Object,當將 4
assign 至 obj2[keyObj2]
時,由於 key 都是一樣的 '[object Object]'
所以會直接將上一行的 assign 給蓋掉,於是 obj2
中,會只有最後一次 assign 的結果
結論
- Object 會把所有的 key 的 type 都變成 string
- 若 key 是 Array 或者 Object ,他並不會使用他們的 reference
- 若使用 Array 當 key , Array 整體都會被當成 key
- 若使用 Object 當 key,所有的 key 都會變成
'[object Object]'
,並且都是同一個 key - Object 不適合也不應該當 key,若需要 Object 當 key 時,可以考慮用
Map
跟 Leetcode 138 有關