Недавно я наткнулся на новую функцию Javascript Destructuring, доступную с ES6.
Обнаружилась странная ситуация, когда я не совсем уверен в том, что происходит. Надеюсь, вы, ребята, поможете мне понять.
Если я наберу это в моей консоли:
var car={}
var {undefinedProp: es6Magic} = car;
Я получаю неопределенное. Похоже на меня, поскольку автомобиль не имеет определенного свойства.
Но если я использую оператор If вокруг него, я получаю другой и неожиданный результат:
function testPriorities() {
var car = {}
if ({
undefinedProp: es6Magic
} = car) {
console.log('how do i even get here', es6Magic);
}
}
Что за черт?
Почему es6Magic назначается неопределенным значением и он все равно возвращает true?
Какие правила применяются при выполнении оператора if?
Если я наберу это в моей консоли:
var car={} var {undefinedProp: es6Magic} = car;
Я получаю неопределенное.
Но не потому, что es6Magic
имеет неопределенное значение (это значит, я имею в виду, что это не причина). Это потому, что объявления переменных не имеют значения результата, а ваш полный фрагмент не имеет результата (в отличие от операторов выражения).
Но если я использую оператор If вокруг него, я получаю другой и неожиданный результат:
var car = {} if ({undefinedProp: es6Magic} = car) { console.log('how do i even get here', es6Magic); }
Наверное, это правда, потому что
car
существует, но почему он отличается от консоли?
Фактически вы все равно получите undefined
результат из последнего оператора после вывода console.log
.
И да, условие if
оценивает правдоподобное значение, потому что car
существует - то, что всегда делают выражения назначения. Это даже не имеет ничего общего с деструктуризацией, … = car
всегда вычисляется в правой части car
независимо от того, что левой стороны цели выражение руки.
Вы также можете попробовать
> var car = {}, es6Magic;
undefined
> ({undefinedProp: es6Magic} = car); // no 'var' - plain assignment!
[object Object]
car
объект.
Консоль показывает undefined
поскольку объявление переменной ничего не возвращает, объявляет переменную.
Вторая версия работает, потому что {foo: bar}
интерпретируется как литерал объекта, который вы назначаете. Это возвращает объект, который является правдивым. Я ожидал бы, что для того чтобы выпустить ошибку, которую она делает в консоли:
Uncaught SyntaxError: Недействительная цель назначения деструкции
Литерал не должен быть действительной целью, но транспилер, скорее всего, нарушит это.
Оператор if выполняется, потому что вы в основном выполняете assignment
внутри оператора if
который всегда возвращает assigned
значение, которое в этом случае равно {}
которое вычисляется как true
.
var b
if(b={}){console.log("what!!")}
function a(){
var car={}
return {undefinedProp: es6Magic} = car;
}
console.log(a())
({undefinedProp: es6Magic} = car)
возвращает пустой объектObject {}
. Итак, это не ложь ..