身為 javaScript 工程師,聽到 key pair value 第一個一定想到 Object。那跟同樣是 Key pair value 的 Map 有什不一樣呢?
建立 object 有下列幾種方法
// 1 literal
// 最常見到也是最推薦的
let objLiteral = {
id: 1,
name: 'Hannah'
}
// 2 by constructor
// 比較不建議因為效能較差
let objConstructor = new Object()
objConstructor['id'] = 1;
// 3 using Object.prototype.create
// 通常用在繼承別人的 prototype
let objCreate = Object.create(null);
Object.defineProperty(objCreate, 'id', {
value: 1
})
Map 只有一種
//Empty Map
let map1 = new Map()
// have value when define
let map = new Map([['id',1], ['name','Hannah']]);
實務上我們的確可以用 Object 來模擬 Map
class myMap{
constructor(){
this.items = {}
}
set (key, value) {
this.items[key] = value;
};
delete (key) {
if(this.has(key)){
delete this.items[key];
return true;
}
return false;
};
has (key) {
return this.items.hasOwnProperty(key)
};
get (key) {
return this.has(key) ? this.items[key] : undefined;
};
clear () {
this.items = {}
};
size () {
return Object.keys(this.items).length;
};
keys () {
return Object.keys(this.items);
};
values () {
return Object.values(this.items);
};
};
const dictionary = new myMap();;
dictionary.set('Mark', 'mark@gmail.com');
dictionary.set('Ivy', 'ivy@gmail.com');
dictionary.set('Mary', 'mary@gmail.com');
console.log(dictionary.values())
這在使用上多了一些限制,你可能要寫很多額外程式去處理功能需求。就算 ES6 的 Object key type 不只 String,但 key 還是必須是 simple types。不然你試試 obj 當 key 看看 ~~
而 Map 前一章有提過 key 值可以接受任何 type
可以看連結 Object.keys 效率並沒有很好,但你若用 for in 去抓值,可能會抓到父層的值 (當然你可以用 es6 for of 啦 js 夠熟悉 )
var myObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(myObj )); // console: ['2', '7', '100']
var myMap =new Map([[100,'a'],[2,'b'], [7, 'c' ]])
myMap.keys() // {100, 2, 7}
var map = new Map([[1,2],[3,4]]);
console.log(map instanceof Object); //true
var obj = new Object();
console.log(obj instanceof Map); //false
看來 Map 似乎都比 Object 好,那我們就可以不用 Object ? No No No
var obj = {
id: 1,
name: "It's Me!",
print: function(){
return `Object Id: ${this.id}, with Name: ${this.name}`;
}
}
console.log(obj.print());//Object Id: 1, with Name: It's Me.
如有錯誤或需要改進的地方,拜託跟我說。
我會以最快速度修改,感謝您
歡迎追蹤我的部落格,除了技術文也會分享一些在矽谷工作的甘苦。
印象中Vue還沒支援Set和Map的reactivity,
上次有個data適合用Set,
結果出bug找了半天才發現Vue尚未支援。
好像在哪裡看到Vue3才會支援。
以我理解 Set Map 都是原生語法,照理說只要瀏覽器支援,不管你用甚麼前端框架都應該支援
稍微看了一下 Vue 似乎是有 Vue.set(this.b,'first','first') 的東西。這我就不知道支援程度了
但假如是用 new Set() 應該都 ok 才對
不知道有沒有回答道 XD
那個set 跟js的set不一樣