#javascript
This question already has answers here: Преобразование скалярных типов при сравнении JavaScript (2 ответа) Closed 2 года назад. [] == ![] // -> true. Может кто-то объяснить как это работает
Ответы
Ответ 1
Описание алгоритма сравнения x == y http://es5.javascript.ru/x11.html#x11.9.3 [] == ![] typeof([]) - object typeof(![]) - boolean "7. Если Type(y) – Boolean, вернуть результат сравнения x == ToNumber(y)." 1.1. ToNumber(y) -> ToNumber(![]) -> ToNumber(false) (почему false смотреть тут http://es5.javascript.ru/x11.html#x11.4.9) -> 0 (почему 0 смотреть тут http://es5.javascript.ru/x9.html#x9.3) На данном этапе сравнение имеет вид x == 0 или [] == 0 и мы снова выполняем основной алгоритм сравнения: "9. Если Type(x) – Object и Type(y) –либо String, либо Number, вернуть результат сравнения ToPrimitive(x) == y." ToPrimitive(x) -> ToPrimitive([]) (правило вычисления примитивов тут http://es5.javascript.ru/x9.html#x9.1, а для объектов тут http://es5.javascript.ru/x8.html#x8.12.8): "Если внутренний метод [[DefaultValue]] объекта O вызывается без подсказки, он ведет себя так, как если бы подсказка была Number, кроме случаев, когда O – объект Date (см. 15.9.6), и в этой ситуации он ведет себя, как если бы подсказка была String." И так как valueOf для массива возвращает пустой массив (подсказка Number, шаги 1-2), то к нему применяется toString (подсказка Number, шаги 3-4), что вернёт в итоге пустую строку "". На данном этапе сравнение имеет вид "" == 0 и мы снова выполняем основной алгоритм сравнения: "5. Если Type(x) – String и Type(y) – Number, вернуть результат сравнения ToNumber(x) == y." ToNumber("") == 0. ToNumber("") -> 0 так как "MV StringNumericLiteral ::: [empty] равно 0." отсюда http://es5.javascript.ru/x9.html#x9.3.1. Наконец-то получем 0 == 0, что и даёт нам true.Ответ 2
Объект всегда true, => не массив это false (логическое преобразование) Получаем сравнение разных типов => применяется численное преобразование Пустой массив преобразуется к 0, false тоже к 0Ответ 3
В JavaScript array массив представлен в виде объекта console.log(typeof({})); console.log(typeof([])); Сравнивать обьекты и функции в джаваскрипте не возможно с помощью оператора сравнения Но есть способ как это сделать с помощью JSON.stringify x = [1,2,3]; y = [1,2,3]; z = [1,2,3,4,5]; console.log(JSON.stringify(x) === JSON.stringify(y) ); console.log(JSON.stringify(x) === JSON.stringify(z) ); А также с помощью болле сложного кода на js (ссылка) Дополнительно Операторы сравнения в JavaScript == equal to === equal value and equal type != not equal !== not equal value or not equal type > greater than < less than >= greater than or equal to <= less than or equal to ? ternary operator типы данных в JavaScript
Комментариев нет:
Отправить комментарий