Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Массив эквивалентен не массиву в JavaScript. [дубликат]

#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

Комментариев нет:

Отправить комментарий