2014-10-30 3 views
9

При попытке в полной мере понять разницу между оператором равенства и оператором идентификации я столкнулся с article в MSDN, который объясняет, что они оба делают с точки зрения их внутренней работы, но у меня все еще было несколько сомнений и решил создать блок-схему, чтобы у меня была лучшая картина. Теперь мой вопрос: правильная ли эта блок-схема? или я что-то упускаю?вычисление оператора равенства javascript

Также я понимаю, что оператор идентичности (===) будет работать практически так же, но без попытки конвертировать A и B в логическое число или строку на первом шаге. Это верно?

Вы можете увидеть изображение here тоже:

enter image description here

Ok здесь это реальная вещь, это вопрос принципов;)

enter image description here

+0

Хорошая работа с диаграммой! –

+4

Нет «оператора идентичности», однако существует строгий оператор равенства (равенства). Если ваш вопрос: «* делает модель блок-схемы абстрактным алгоритмом сравнения, который используется для' == 'operator *», ответ «Нет». Лучшее место для начала - спецификация: [* Алгоритм сравнения абстрактного равенства *] (http://ecma-international.org/ecma-262/5.1/#sec-11.9.3). – RobG

+0

Вы можете сравнить статью [* MSDN *] (http://msdn.microsoft.com/en-us/library/ie/ky6fyhws%28v=vs.94%29.aspx) с эквивалентом на [* MDN * ] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators). – RobG

ответ

4

это блок-схема верный?

Нет. Для создания блок-схемы вы должны использовать спецификацию ECMAScript для Abstract Equality Comparison Algorithm. ToBoolean, конечно, не первый шаг (он не используется в любой).

или я что-то упускаю?

Да, много.

Также я понимаю, что оператор идентичности (===) будет работать практически так же, но без попытки конвертировать A и B в логическое число или строку на первом шаге. Это верно?

Strict Equality Comparison Algorithm почти идентичен Abstract Equality Comparison Algorithm, есть разница только если типы аргументов различны, и в этом случае есть четкий порядок, в котором типы сделаны равные перед выполнением сравнения.

+0

Отлично, хороший ответ! – Overlord

+0

", и в этом случае существует точный порядок, при котором типы становятся равными перед сравнением". На самом деле, нет. Для строгого сравнения типы вообще не равны. Если они не равны, ответ просто * false *. – Octopus

+0

@ Octopus - этот комментарий применяется к абстрактному алгоритму равенства, а не к строгу (который, как вы говорите, не конвертирует типы). – RobG

-2

- это эта блок-схема правильно?

Нет. Помимо того, что он выглядит ужасно, он вводит в заблуждение и частично ошибается.

Я что-то не хватает?

Да. Первый шаг: «попробуйте преобразовать A и B в логический, строка или номер» неверно - это не первый шаг в equality comparison algorithm. Кроме того, когда нужно преобразовать какую из переменных в какой тип?

Затем следующим шагом должно быть различие типов, а не повторное задание одинаковых значений определенного типа.

«Последний» шаг «Могут ли они (типы) быть принуждены к любой из последних 5 ситуаций? -> Типы принуждения« не хватает деталей. Все детали. Что является наиболее важной частью сравнения небрежного равенства:

  • Какие типы могут быть принудительно?
  • Какие типы будут принуждаться к чему?
  • Как действует принуждение значений?

И нет, после принуждения алгоритм в значительной степени начинается в начале, а не с вопросом о строках.

Также я понимаю, что оператор идентичности (===) будет работать практически так же, но без попытки конвертировать A и B в логическое число или строку на первом шаге.

Это первый шаг не является очевидным в самом алгоритме, так Нет, в самом деле, === работает так же , за исключением последнего шага, который принуждает значения в другие типы - вместо false, возвращается.

Редактировать: Ваша вторая диаграмма является точной (правильной), хотя она по-прежнему содержит некоторые нечетные решения по размещению.

Смежные вопросы