2015-09-05 3 views
1

Глядя на это деструктурирующей уступке (ES6):Пытающее неявное принуждение?

var {a, b} = {a:1, b:2} 
console.log(b); //2 

Очевидно, что a будет 1 и b будет 2.

Babel трактует как:

"use strict"; 
var _a$b = { a: 1, b: 2 }; 
var a = _a$b.a; 
var b = _a$b.b; 
console.log(b); 

OK.

Но, глядя на этот код:

var { x : { y = 10 } } = { x : 15 }; 
console.log(y); //10 

Как вы можете see результат является 10. По словам Кайла Симпсона, здесь подразумевается принудительное принуждение.

Вопрос:

Что такое неявное принуждение, что здесь происходит, и почему/как это y является 10?

+1

Это выглядит как '{expr; } 'рассматривается как собственный кодовый блок,' y' может даже не быть 'var'd, проверить, попадает ли он в область или глобальный объект –

+0

В ночное время я получаю' SyntaxError: missing: after property id'. – Oriol

+0

Не могли бы вы процитировать или связать Кайла Симпсона? – Bergi

ответ

6

Это разрушение с помощью инициализатора по умолчанию. Что происходит:

  1. Объект {x: 15} является деструктурированный на выражение {x: …}
  2. Свойство x согласован
  3. Значение 15 является деструктурированный на выражение {y = 10} (стенография для {y: y = 10}). Для этого она неявно принуждать к объекту - как new Number(15)
  4. свойство y не могут быть согласованы, поскольку номера не один - поэтому значение по умолчанию берется и инициализатор оценивается (10)
  5. Значение 10 присваивается переменной y.

Вы можете также try изменения y к свойству, которое существует на Number.prototype для другого результата.

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