2015-11-13 4 views
2

ES2015 определяет новый метод на Object, getOwnPropertySymbols. Я использую это, чтобы получить все ключи символов из объекта У меня есть:Что определяет порядок символов, возвращаемых из Object.getOwnPropertySymbols?

let syms = Object.getOwnPropertySymbols(myObj); 

Раньше я работал в предположении, что возвращение порядок был определен путем сортировки версии строки символов. Быстрый тест показал, что это было неправильно:

let obj = {}; 
obj[Symbol('Stack')] = 'Stack'; 
obj[Symbol('Overflow')] = 'Overflow'; 
Object.getOwnPropertySymbols(obj); // [ Symbol(Stack), Symbol(Overflow) ] 

Как это определить? Это порядок, который они добавили в глобальный реестр Symbol, или просто «случайный», как обычный Object.keys?

+0

порядок вставки, так же как и другие свойства, кроме клавиш расширения, которые численно сортируются, но это не символы, а просто вставка. – dandavis

+0

@ dandavis это был ответ, ответьте ниже! Если я пропустил что-нибудь, сообщите мне – SomeKittens

+1

, почему вы это сделаете? – dandavis

ответ

2

Каждый объект JavaScript имеет внутренний трекер с именем OwnPropertyKeys. Это список, который отслеживает все ключи объекта, строки или символа. Когда вы звоните getOwnPropertySymbols, вот что происходит:

  1. Все getOwnPropertySymbols делает это вызов внутренней GetOwnPropertyKeys с (O, Symbol) [spec].
  2. GetOwnPropertyKeys проходит через OwnPropertyKeys, добавляя их в массив, если указанная клавиша является символом (так как мы назвали ее Symbol выше). [spec].
  3. Возвращается массив, который мы создали ранее.

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

let symO = Symbol('Overflow'); 
let symS = Symbol('Stack'); 
let obj = {}; 
obj[symS] = 'Stack'; 
obj[symO] = 'Overflow'; 
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(Stack), Symbol(Overflow) ] 

Даже если мы объявленной символов в обратном порядке, все getOwnPropertySymbols заботится о порядке они были добавлены объект.

Смежные вопросы