2015-08-10 2 views
-1

Я прошел через синтаксис деструктурирования массива, который хорошо понятен.Синтаксис деструкции объекта - ES6

Что именно мы делаем ниже, когда говорим var {p, q} = o;?

Is p и q в var {p, q} различной от свойств o, т.е. 'p' и 'q'? Если да,

Почему var {a, b} = o; не работает?

> var o = {p: 42, q: true}; 
    undefined 
> p 
    ReferenceError: p is not defined 
> q 
    ReferenceError: q is not defined 
> o['p'] 
    42 
> o['q'] 
    true 
> var {p, q} = o; 
    undefined 
> p 
    42 
> q 
    true 
> var {a, b} = o; 
    undefined 
> a 
    undefined 
> b 
    undefined 

* Примечание: Я узнал, что ключи словаря являются строковых литералов в JavaScript *

+0

'var {p, q} = o;' === 'var p = o.p;' и 'var q = o.q;' это будет работать, только если переменные имеют одинаковое имя. –

+0

@Kitler Это не своеобразная концепция? Какая концепция языка программирования выведена для обеспечения такого объекта? Есть ли другой язык, который делает такие странные вещи?Я думаю, что деструктурирование скрыто от python. – overexchange

+2

Weird очень субъективен, это общий шаблон для назначения значений атрибутам из объекта, где совпадает имя, эта концепция взята из coffeescript iirc. –

ответ

4
var o = {p: 42, q: true}; 
    var {p, q} = o; 

Здесь var {p,q} = o просто сокращение для var {p:p , q:q} = o

Рассмотрим это.

 var o = { key : "value" }; 
     var { key : local_var } = o ; 
     local_var === o["key"] // true 

Если опустить local_var и написать var {key} = o; новая переменная ключ будет создан с «ключом» idenifier., Так же, как делают var key = o["key"]

Таким образом, в вашем примере, что это как делать

 var p = o["p"] ; //42 
     var q = o["q"]; //true 
     var a = o["a"]; // undefined 
     var b = o["b"]; //undefined 

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

+0

'var o = {p: 42, q: true};', а затем 'var {a: var1, b: var2} = o;' это не работает. '' a'' и '' b'', '' p'' и '' q'' являются строковыми литералами. – overexchange

4

Это потому, что, используя синтаксис для объекта разрушающих, имена, используемые в выражении LHS ({a, b}) используются. как ключи в выражение RHS (o). Поскольку a и b не являются объектами o, это не работает (возвращается undefined).

Соответствующий раздел в спецификации для этого находится в Runtime Semantics: DestructingAssignmentEvaluation под AssignmentProperty: Инициализатор идентификации Идентификатор (второй от последнего). AssignmentProperty - ваши ab ... отдельно), и. StringValue a - 'a' и используется в качестве ключа для получения значения от o (эквивалент o['a'] в этом случае).

Это будет работать, если вы могли бы сделать:

var {p:a, q:b} = o; 

который использует AssignmentProperty: PropertyName: AssignmentElement (последняя запись), которая использует имя Собственость (p) и элемент присваивания (a).

+1

См. Также http://es6-features.org/#ObjectMatchingDeepMatching, http://www.ecma-international.org/ecma-262/6.0/index.html#sec-destructuring-assignment. – kay

+0

'a' и' b' являются идентификаторами. 'p' и' q' являются идентификаторами в 'var {p, q}'. Но '' p'' и '' q'' являются свойствами (ключами) в dicitonary 'o', которые являются строковыми примитивными литералами. что вы подразумеваете под именем соответствия? – overexchange

+0

'p' &' q' - свойства 'o'. На них можно ссылаться как строковые ключи с использованием символа 'object ['key']' ('o ['p']') или через ноту 'object.key' (' o.p'). В любом случае это не связано с этой проблемой. Глобальные переменные 'p' &' q' не играют никакой роли в этом сценарии. – Amit

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