Порядок оценки в случае утверждения с ES6 деструктуризации

1

Недавно я наткнулся на новую функцию 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?

  • 2
    ({undefinedProp: es6Magic} = car) возвращает пустой объект Object {} . Итак, это не ложь ..
  • 0
    боюсь, ты не сможешь так разрушить. Кроме того, что вы присваиваете, а не проверяете, первая часть проверки анализируется как объект, а не как синтаксический сахар, который разрушает
Теги:
ecmascript-6
destructuring

3 ответа

3
Лучший ответ

Если я наберу это в моей консоли:

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]
  • 0
    Этот последний объект Объект существует, потому что Автомобиль существует?
  • 2
    Да, это в буквальном смысле является car объект.
1

Консоль показывает undefined поскольку объявление переменной ничего не возвращает, объявляет переменную.

Вторая версия работает, потому что {foo: bar} интерпретируется как литерал объекта, который вы назначаете. Это возвращает объект, который является правдивым. Я ожидал бы, что для того чтобы выпустить ошибку, которую она делает в консоли:

Uncaught SyntaxError: Недействительная цель назначения деструкции

Литерал не должен быть действительной целью, но транспилер, скорее всего, нарушит это.

  • 0
    Все прекрасно в моем примере кода. Не уверен, что вы ссылаетесь. Вы можете уточнить?
1

Оператор if выполняется, потому что вы в основном выполняете assignment внутри оператора if который всегда возвращает assigned значение, которое в этом случае равно {} которое вычисляется как true.

var b

if(b={}){console.log("what!!")}

function a(){
  var car={}
  return {undefinedProp: es6Magic} = car;
}

console.log(a())
  • 0
    Не работает с undefined = undefined, так что это не так.
  • 0
    в основном это «если» значение того, в чем вы делаете это (а undefined является ложным)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню