2016-06-11 2 views
2

В настоящее время я изучаю новые языковые функции, которые входят в JavaScript с ES6.В каких случаях я предпочитаю ES6-карты вместо JavaScript-объектов?

JavaScript-объекты всегда были тем, что я знаю из других языков как хэш-карты или ассоциативные массивы.

Теперь язык имеет карты. Но я спрашиваю себя: действительно ли случаются случаи, когда невозможно реализовать одно и то же, используя объект в качестве структуры данных?

Хорошо, карты имеют несколько удобных дополнительных методов. Тем не менее: я не смог определить прецедент, в котором то же самое нельзя было сделать, используя объект.

Кто-нибудь знает, почему карты стали включены в язык? Или лучше: может ли кто-нибудь показать мне прецедент, в котором мне было бы лучше использовать карту вместо объекта?

+0

Уверенный - когда ключи не являются строками. – zerkms

ответ

2

Объектов хорошо, когда ты используя только строки в качестве ваших ключей. Но Карты позволят вам использовать другие типы данных в качестве ваших ключей. Кроме того, когда вы перебираете свои ключи и значения, у них есть предсказуемый порядок (порядок, в который вы вставили элементы).

Have a look at the MDN here for more information.

+0

Short & sweet. Большое спасибо. – mewi

1

Как часто все это касается более чистой структуры данных и упрощения.

Вот сравнение того, что вы можете сделать с картой против того, что вы можете сделать с обычным объектом

ECMAScript 6

let s = new Set() 
s.add("hello").add("goodbye") 

let m = new Map() 
m.set("hello", 42) 
m.set(s, 34) 
m.get(s) === 34 
m.size === 2 
for (let [ key, val ] of m.entries()) 
    console.log(key + " = " + val) 

ECMAScript 5

var s = {}; 
s["hello"] = true; s["goodbye"] = true; 

var m = {}; 
m["hello"] = 42; 
// no equivalent in ES5 
// no equivalent in ES5 
Object.keys(m).length === 2; 
for (key in m) { 
    if (m.hasOwnProperty(key)) { 
     var val = m[key]; 
     console.log(key + " = " + val); 
    } 
} 
+1

Не могли бы вы определить 's' в своем коде? – trincot

+0

@Der Tieran: В примере ECMAScript 6 s является переменной? Объявлено где-то выше? Сам фрагмент кода не работал. – mewi

+0

Кроме того, в ES5 можно сделать более точную прокрутку объекта: 'Object.keys (m) .forEach (...);' – nils

0

Если вы используете объект как карту, то ключи могут конфликтовать с помощью встроенного в свойствах объектов. Это может быть проблемой, когда ключи считываются от пользователя или какого-либо внешнего источника.

var a = {}; 

// Put value in map 
a['hasOwnProperty'] = 1; 

for(x in a) { 
    // TypeError: a.hasOwnProperty is not a function 
    if(a.hasOwnProperty(x)) { 
     console.log(x); 
    } 
} 
Смежные вопросы