Почему _ = $ = + [], ++ _ + '' + $ равен 10?

Читая я находился это выражение:

_=$=+[],++_+''+$

любопытно это действительное выражение в javascript но самое любопытное состоит, в том, что выполнив ее, результат:

10

Я старался находить чувство разлагая выражение, но мне не удалось много.

Почему результат вышеупомянутого выражения равен в 10?

13
задан 18.03.2016, 07:09
2 ответа

Легкий, это выражение

_=$=+[],++_+''+$

Смоги быть написанным более читабельной такой формы

_ = $ = +[], ++_ + '' + $

Что может быть понятен как:

(_ = $ = +[]), (++_ + '' + $)

Что является тем же самым что:

_ = $ = +[];
++_ + '' + $;

Что является тем же самым что:

$ = +[];
_ = $;
++_ + '' + $;

Что, чтобы это читать более легкий, мы сможем называть переменные как:

var1 = +[];                 // +[] fuerza al empty array a volverse number 0
var2 = var1;                // Ahora var1 y var2 valen 0
++var2 + '' + var1;         // ++var2 === 1, 1 + '' === '1' y '1' + 0 === '10'

Что это выполняя шаг шаге:

var1 = 0;
var2 = var1;              
++var2 + '' + var1  
...
var2 = 0;              
++var2 + '' + var1;
...
++var2 + '' + 0;       //var2 === 0
...
1 + '' + 0;
...
'1' + 0;
...
'10';
12
ответ дан 24.11.2019, 14:43

Давайте делать какие-то преобразования. В которое он звонит _ я буду называть это a и в которое он звонит $ я буду называть это b. Просто я изменил имя этих двух переменных, из-за которого Ваше первоначальное выражение сейчас:

a=b=+[],++a+''+b

Под этим эквивалентным выражением:

a =  
   b = + [] 
           , 
             ++a+''+b
  1. Оператор с большим предшествованием - оператор , (запятая). Этот оператор оценивает каждый из Вашего operandos с левой стороны до правой стороны и возвращает стоимость последнего выражения, которое он оценил.
  2. Оцени выражение a = b = +[]. Это выражение - выражение составного ассигнования. Оператор ассигнования = присоедини с правой стороны до левой стороны, следовательно, это выражение должен будь быть оцененным как a = (b = +[])
  3. Выражение b = +[] он распределяет его в переменную b (что должен решать ее первая внутри цепи scope: если он существует, он распределяет ему подходящую стоимость, если он не существует - как в этом примере - он создает так называемое свойство b в глобальном объекте (в браузере он был бы объектом window). В эту переменную он распределяет ему стоимость +[]. Унитарный оператор +он берется за то, чтобы обращать тип информации в целую стоимость. В этом случае, пробует конвертировать пустую договоренность []. Когда в договоренности используется оператор +, Javascript звонит в метод toString() договоренности, возвращая представление в цепи символов контента того же самого. Как договоренность пустая, возвращает цепь ''. Сейчас, стандарт ECMA упоминает, о том, что представление пустой цепи текста, превратив ее в число, - целая стоимость 0, следовательно, выражение b = +[] он распределяет его в b стоимость 0.
  4. Эта стоимость 0 распределен в переменную a, которая, равно как переменная b, если он существует, ему распределяется стоимость, если не, он создается как свойство в глобальном объекте. До сих пор, что было сделано, состояло в том, чтобы создавать две переменные, названные в и b, что считают распределенной стоимость 0, и что существуют в глобальном объекте.
  5. Далее оценивается второй действуя выражения ,: ++a+''+b. Ввиду появления пустой цепи характеров ''. операторы + что появляются, будут действовать прилагая цепи характеров. Этот оператор оценивает с левой стороны до правой стороны.
  6. Во-первых, оцени выражение ++a. Это выражение содержит оператор унитарного увеличения я предопределяю ++: Ваша работа состоит в том, чтобы увеличивать на 1 стоимость переменной и возвращать этот результат. Следовательно, a, чего 0, сейчас 1 и он возвращает эту стоимость.
  7. Оператор + прилагает стоимость, полученную из-за действуя левша (который возвратил целую стоимость 1) с пустой цепью характеров ''. Эта работа продвигает целую стоимость 0 в цепь символов '1'. В конце концов возврати этот результат.
  8. Оператор + прилагает стоимость, полученную из-за действуя левша (который возвратил цепь символов '1' с производя право. Производя право это просто стоимость переменной b, чего 0. Снова, оператор + настойчиво предложи эту целую стоимость цепи символов '0', ввиду связывания. Связывание действуя левши с правом '1' + '0' = '10' и он возвращает этот результат.
  9. В конце концов, поскольку в начале я упомянул, оператор , возврати результат, который последнее выражение возвратило, в этом случае, он возвратит цепь символов '10', которая является результатом, который Вы получаете.
5
ответ дан 24.11.2019, 14:43