Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Дэвид Флэнаган (https://javascript.ru/forum/offtopic/7281-dehvid-flehnagan.html)

Niar 31.01.2010 13:37

Логично

micscr 31.01.2010 14:52

Цитата:

Сообщение от Niar (Сообщение 42935)
if (new String('')==false) alert('равно')
Ну а тут false то почему

if (new String('')) - здесь объект сразу приводится к логическому, и по правилам это true
if (new String('')==false) - а тут работает оператор == и правила его работы - особенные (стр 85 все подробно описано)

Niar 31.01.2010 16:00

Да я их даже в тетрадку переписал дня 3 назад. Просто сразу не вкупил

Мараторий 31.01.2010 16:11

Цитата:

Сообщение от micscr (Сообщение 42948)
if (new String('')) - здесь объект сразу приводится к логическому, и по правилам это true
if (new String('')==false) - а тут работает оператор == и правила его работы - особенные (стр 85 все подробно описано)

Я вот чего не очень понимаю. Зачем при сравнении чего-либо с логическим выражением надо это логическое выражение приводить к числу, а не сравниваемый объект приводить к логическому выражению?
Тогда эти две операции были бы эквивалентны:
if(expr) ...
// и
if(expr == true) ...
А в действительности получается, что они не эквивалентны.

Niar 31.01.2010 16:12

А зачем две эквивалентных операции?

Мараторий 31.01.2010 16:23

Цитата:

Сообщение от Niar (Сообщение 42953)
А зачем две эквивалентных операции?

Ну как зачем? По логике вещей эти две операции должны делать одно и то же. Вам так не кажется?
В первый раз я говорю: если выражение правда, то сделать то-то.
Во второй раз я говорю: если выражение равно правде, то сделать то-то.
По мне так это одно и то же.

Niar 31.01.2010 16:24

Нет не кажется

micscr 31.01.2010 16:31

Цитата:

Сообщение от Мараторий (Сообщение 42952)
Я вот чего не очень понимаю. Зачем при сравнении чего-либо с логическим выражением надо это логическое выражение приводить к числу, а не сравниваемый объект приводить к логическому выражению?

Может потому что оператор == изначально нацелен именно на определение равенства разнотипных элементов. И если приводить сложные типы данных сразу к логическому значению теряется много вариантов.
Ведь тут new String('')==false получается: сначала false в 0 потом объект в пустую строку и пустая строка в 0.
Не забываем что своим объектам можно переопределять метод valueOf и кто знает тогда как он будет сравниваться например со строкой или числом.

Мараторий 31.01.2010 16:38

Цитата:

Сообщение от micscr (Сообщение 42956)
Может потому что оператор == изначально нацелен именно на определение равенства разнотипных элементов. И если приводить сложные типы данных сразу к логическому значению теряется много вариантов.
Ведь тут new String('')==false получается: сначала false в 0 потом объект в пустую строку и пустая строка в 0.
Не забываем что своим объектам можно переопределять метод valueOf и кто знает тогда как он будет сравниваться например со строкой или числом.

Убедили. Все встало на свои места.

Цитата:

Сообщение от Niar (Сообщение 42958)
Написали же=) Оператор == нацелен на сравнение различных типов данных.

Предыдущий пост я удалил. Я его писал до того, как это прочел.

Niar 31.01.2010 17:42

Почему в литерале объекта
{L:function(){}}
и
{"L":5}

syntax error, а
var bla={L:function(){}}

и
var bla={"L":5}

нету ошибки?


Часовой пояс GMT +3, время: 19:21.