Javascript a=b=c заявления
Я искал в интернете, но не смог найти соответствующие критерии поиска, поэтому я подумал, что это будет лучшее место, чтобы спросить.
У меня есть заявление JS, говорящее
document.location.hash = this.slug = this.sliceHashFromHref(href)
Как это работает??
6 ответов
Это оценивается справа налево. т.е.
document.location.hash = this.slug = this.sliceHashFromHref(href)
означает выход / значение this.sliceHashFromHref(href)
назначен на this.slug
а затем document.location.hash
,
Как это работает??
a = b
может рассматриваться как утверждение и выражение.
Результатом выражения является b
,
Другими словами,
a = b = c;
который можно записать как
a = (b = c);
эквивалентно
b = c;
a = b;
Таким образом, ваш код эквивалентен:
this.slug = this.sliceHashFromHref(href);
document.location.hash = this.slug;
Будьте в курсе объема переменных!
var A = B = C = 3; //A is local variable while B & C are global variables;
var A = 3 , B = 3, C = 3;// A B C are local variables;
Довольно просто... Он присваивает результат от вызова this.sliceHashFromHref(href)
как для document.location.hash
а также this.slug
поэтому оба свойства (переменные) содержат одно и то же значение после выполнения строки.
В Javascript (и некоторых других языках, которые получают свой синтаксис из C), присваивание оценивает элемент справа от символа = и присваивает его переменной слева. Элемент справа может сам по себе быть заданием с оператором =. То, что происходит, оценивается самое правое выражение, значение присваивается средней переменной, а затем это значение присваивается переменной слева.
Короче говоря, это просто способ присвоить значение нескольким переменным одновременно.
На самом деле ответ Ма Хереса имеет здесь очень важное значение. также этот ответ относится к аналогичному вопросу: этот вопрос включает в себя несколько вещей:
- hoist: переменные поднимаются перед выполнением блочного кода;
=
порядок назначения: он идет справа налево;- глобальный контекст: в нестрогом режиме, когда переменная не определена, она переходит в глобальный контекст; но выбрасывает в режиме "использовать строгий";
example1:
;(function Anonymous(){
var a = b = {};
console.log(a==b); //true
})();
a
был поднят вAnonymous
объем исполнения.b
будет назначен как{}
, но потому чтоb
не определено,b
назначается глобальному контекстуwindow
, затемwindow.b
назначен{}
; затемwindow.b = {}
return
s{}
,локальная переменная
a
назначается как {}.
Поэтому здесь происходит несколько интересных вещей: local variable a
и global variable b
оба указывают на один и тот же объект {}
так они ==
а также ===
; помни это {}=={}
дает false
иначе.
Примечание: если в строгом режиме:
;(function Anonymous(){
'use strict'
var a = b = {}; //Uncaught ReferenceError: b is not defined
})();
это последовательное назначение не будет работать так же, как...