неявное принуждение в javascript

Я пересматриваю неявное принуждение в javascript и понял, что что-то упустил из виду и мне нужно разъяснение по этому поводу.

if

var a = "5";
var b = 5;

и a==b вернет true.

Но есть два возможных способа, которыми a==b может дать истинное принуждение, верно? Это либо 5 == 5, либо '5' == '5'. Так что же на самом деле происходит для приведенного выше примера?


person tnkh    schedule 07.08.2019    source источник
comment
Приведение типов при сравнении с использованием == реализовано на основе этой спецификации ECMAScript: ecma-international.org/ecma-262/5.1/#sec-11.9.3   -  person Sergiu Paraschiv    schedule 07.08.2019
comment
проверьте это   -  person Krishna Prashatt    schedule 07.08.2019


Ответы (3)


Ответ находится в алгоритме сравнения абстрактного равенства в спецификации, а именно:

  1. Если Type(x) — это String, а Type(y) — это Number, вернуть результат сравнения! ToNumber(x) == y.

(! перед ToNumber(x) не означает отрицание, это обозначение спецификации, утверждающее, что ToNumber(x) никогда не приведет к резкому завершению.)

Это числовое сравнение, "5" преобразуется в 5, после чего выполняется сравнение.

person T.J. Crowder    schedule 07.08.2019
comment
Могу я узнать, какова цель символа резкого завершения? Выглядит запутанным для меня в первую очередь. - person tnkh; 07.08.2019
comment
@tnkh — это описано здесь: Аналогично префикс ! используется для указания того, что последующий вызов абстрактной или синтаксически управляемой операции никогда не вернет внезапное завершение и что вместо возвращаемого значения операции следует использовать поле [[Value]] результирующей записи завершения. Перейдите по ссылке, чтобы увидеть длинную версию того, каким должен быть этот ! при явном утверждении. :-) - person T.J. Crowder; 07.08.2019

Основываясь на абстрактном алгоритме сравнения на равенство, сначала будут предприняты попытки преобразовать операнды в числа. Таким образом, будет предпринята попытка преобразовать строку '5' в число 5.

Взгляните на шаги 6 и 7 в abstract алгоритм равенства. Независимо от того, какой тип представлен для числа, операнд для числа будет преобразован в число.

person Rajaprabhu Aravindasamy    schedule 07.08.2019

Это описано здесь:

Спецификации EcmaScript 2019 – Сравнение абстрактного равенства

Сравнение x == y, где x и y — значения, дает истинное или ложное значение. Такое сравнение выполняется следующим образом:

1) Если тип (x) совпадает с типом (y), то верните результат выполнения строгого сравнения равенства x === y.

2) Если x равно null, а y не определено, вернуть true.

3) Если x не определено, а y равно null, вернуть true.

4) Если Type(x) — это число, а Type(y) — это строка, вернуть результат сравнения x == ! ToNumber(y).

5) Если Type(x) — это String, а Type(y) — это Number, вернуть результат сравнения! ToNumber(x) == y.

(...)

Таким образом, строка преобразуется в число, а затем сравнивается.

Это можно доказать с помощью следующего кода:

"" == 0 // true
0 == "" // true

Оба возвращают true, потому что пустая строка преобразуется в число 0.

Если бы это было наоборот, 0 стал бы "0" (для того, чтобы 0 == "0" также был истинным), и сравнение с пустой строкой вернуло бы false

person Pac0    schedule 07.08.2019
comment
Просто FWIW, это довольно старая спецификация, на которую можно ссылаться. Это ЕС2015. Мы сейчас на ES2019, но в целом я бы посоветовал ссылаться на живую спецификацию. . - person T.J. Crowder; 07.08.2019
comment
@T.J.Crowder, хорошая мысль, я использую свою жесткую ссылку в закладках, пора обновить - person Pac0; 07.08.2019