Skip to content

Instantly share code, notes, and snippets.

@egrashinagi
Last active February 4, 2020 10:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save egrashinagi/03555ec34c5d736ef0690f853e3350cb to your computer and use it in GitHub Desktop.
Save egrashinagi/03555ec34c5d736ef0690f853e3350cb to your computer and use it in GitHub Desktop.
EcmaStandart Перевод 11.9.3 The Abstract Equality Comparison Algorithm
Алгоритм сравнения
Сравнение x==y , где x и y значения представляют true or false. Эти значения выполнены следующим образом:
1. Если Тип X такой же как тип Y, тогда:
a. Если Тип X undefined возвращает true.
b. Если Тип X Null возвращает true.
c. Если Тип X number тогда
i. если X NaN возвращает false.
ii. если Y NaN возвращает false.
iii.Если X такой же как Number и значение Y возвращает true.
iv. Если X +0 и Y -0 возвращает true.
v. Если X -0 а Y +0 возвращает true.
vi. Возвращает false.
d. Если Тип X String, в этом случае возвращает true, если у X и Y такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях). В противном случае возвращает false.
e. Если Тип X Boolean, возвращает true если X и Y оба true или оба false. В противном случае, возвращает false.
f. Возвращает true если X и Y относятся (ссылаются) к тому же объекту. Иначе возвращает false.
2. Если X Null и Y undefined возвращает true.
3. Если X undefined и Y null возвращает true.
4. Если Тип X -number а тип Y - string, возвращает результат сравнения X==ToNumber(Y).
5. Если Тип X string и Тип Y number, возвращает результат сравнения ToNumber(x) == y.
6. Если Тип X Boolean, возвращает результат сравнения ToNumber(x) == y .
7. Если Тип Y - boolean, возвращает результат сравнения x == ToNumber(y) .
8. Если Тип X тоже string или number и Тип Y - Object, возвращает результат сравнения x == ToPrimitive(y).
9. Если Тип X Object и Тип Y String или Number, возвращает результат сравнения ToPrimitive(x) == y.
10. Возвращает false.
ЗАМЕЧАНИЕ 1. Учитывая вышеизложенное определение равенства:
* Строкое сравнение может быть принудительно: "" + a == "" + b.
* Численное сравнение может быть принудительно: +a == +b.
* Логическое сравнение может быть принудительно: !a == !b.
ЗАМЕЧАНИЕ 2. Операторы равенства поддерживают следующие варианты:
* A != B соответствует !(A == B).
* A == B соответствует B == A, кроме того оценки A и B.
ЗАМЕТКА 3. Оператор равенства не всегда переходный. Например, там может быть две разные String, Object, каждый из которых представляет одну и ту же String значение. Каждый объект String будет считаться равным с таким String значением как the == operator, но два String объекта не будут равны друг другу, например:
new String("a") == "a" and "a" == new String("a")are both true.
new String("a") == new String("a") is false.
ЗАМЕТКА 4. Сравнение строк использует простой тест равенства последовательностей кода единичных значений. Там нет попытки использовать более сложных, семантически ориентированных определений равенства строк или символов и схем упорядочения, определенные в спецификации Unicode. Поэтому значения строки, которые являются канонически эквивалентными согласно стандарту Юникода, могут быть неравными. Фактически этот алгоритм предполагает, что строки уже находятся в нормализованной форме.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment