Автор Тема: Подводные камни JavaScript  (Прочитано 5342 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Подводные камни JavaScript
« : Ноябрь 20, 2012, 06:56:14 pm »
http://habrahabr.ru/post/159313/

Цитировать
  typeof 5;             //"number",        ок, похоже на правду
  typeof "hello";       //"string"
  typeof true;          //"boolean"
  typeof undefined;     //"undefined"
  typeof {};            //"object".        Пока 5 из 5
  typeof null;          //"object".        WTF?
  typeof function(){};  //"function".      Разве у нас есть тип function?
.....

Вот правильно, что я плюнул на изучение этого гумна.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подводные камни JavaScript
« Ответ #1 : Ноябрь 20, 2012, 07:11:58 pm »
Я большой не любитель js, но немного побуду адвокатом дьявола:

Цитировать
  typeof null;          //"object".        WTF?
А почему бы нет? Собственно я именно что object тут и ожидал увидеть. А что тут может быть еще? Нулевая ссылка же. В жабе будет то же самое. Да и в шарпе.

Цитировать
typeof function(){};  //"function".      Разве у нас есть тип function?
Я хз есть ли в js function (в смысле он там отделяется от объекта вообще или нет), но замечу, что вообще говоря, литералы в ЯП не обязаны иметь обычный тип, применимый к переменным. Скажем в Обероне строковый литерал ("Foo") имеет тип который не соответствует ни одному обычному обероновскому типу переменной. Кстати, а какой в Обероне тип имеет NIL? :-D

Так вот - в данном случае у нас функциональный литерал. И тип у него может быть вот такой вот. Необычный.

Цитировать
Вот правильно, что я плюнул на изучение этого гумна.
Оно гумно, но не в этом месте :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Подводные камни JavaScript
« Ответ #2 : Ноябрь 20, 2012, 07:27:16 pm »
NULL и NIL - это разные вещи. (в сях имхо неудачно название выбрано)
Если в js NULL = NIL, то нафик он вообще нужен в динамическом языке.

NULL обычно означает отсутствие значения, и уменя лично прочно ассоциируется с SQL'ным NULL.
А тип у NULL должон быть NULL  :) Иначе весь смысл теряется.
Результат любой операции с NULL должон быть NULL...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подводные камни JavaScript
« Ответ #3 : Ноябрь 20, 2012, 07:37:18 pm »
NULL и NIL - это разные вещи. (в сях имхо неудачно название выбрано)
Если в js NULL = NIL, то нафик он вообще нужен в динамическом языке.

NULL обычно означает отсутствие значения, и уменя лично прочно ассоциируется с SQL'ным NULL.
А тип у NULL должон быть NULL  :) Иначе весь смысл теряется.
Результат любой операции с NULL должон быть NULL...
Ничего не понял в этом диком смешании nil'ов c null'ами. NULL как его ни назови, хоть nil'ом, это обычно эдакий недоделанный bottom type
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Подводные камни JavaScript
« Ответ #4 : Ноябрь 20, 2012, 07:39:58 pm »
Я хз есть ли в js function (в смысле он там отделяется от объекта вообще или нет), но замечу, что вообще говоря, литералы в ЯП не обязаны иметь обычный тип, применимый к переменным.
В JS нет такого типа.
http://ru.wikipedia.org/wiki/ECMAScript#.D0.A2.D0.B8.D0.BF.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85

Кстати, а какой в Обероне тип имеет NIL? :-D
В обероне все просто и логично. Там NIL для POINTER как 0 для INTEGER :)

Оно гумно, но не в этом месте :-)
Однако меня тошнить начало как раз на всех этих undefined, null, NaN, undeclared....

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подводные камни JavaScript
« Ответ #5 : Ноябрь 20, 2012, 07:51:48 pm »
Я хз есть ли в js function (в смысле он там отделяется от объекта вообще или нет), но замечу, что вообще говоря, литералы в ЯП не обязаны иметь обычный тип, применимый к переменным.
В JS нет такого типа.
http://ru.wikipedia.org/wiki/ECMAScript#.D0.A2.D0.B8.D0.BF.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85
Ну и фик с ним. Открываем доку на typeof, читаем: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof Еще вопросы?

Строковое представление типа вообще никогда волновать не должно. if (typeof foo == "object") писать нельзя никогда, очевидно. Ни в каком языке. Писать надо if (typeof foo == typeof {} ). В этом случае мы не зависим от того какие рюшечки навешают для строкового представления типов.

Кстати, а какой в Обероне тип имеет NIL? :-D
В обероне все просто и логично. Там NIL для POINTER как 0 для INTEGER :)
Нифига себе просто и логично. А для REAL что? А для char? Откровенно говоря, в этом месте С++ уже более строг чем Оберон - там таки есть nullptr, который к интам не приводится.

Оно гумно, но не в этом месте :-)
Однако меня тошнить начало как раз на всех этих undefined, null, NaN, undeclared....
А меня начинает тошнить еще на этапе динамической типизации. Это как голой жопой на мороз.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Подводные камни JavaScript
« Ответ #6 : Ноябрь 20, 2012, 07:54:39 pm »
NULL и NIL - это разные вещи. (в сях имхо неудачно название выбрано)
Если в js NULL = NIL, то нафик он вообще нужен в динамическом языке.

NULL обычно означает отсутствие значения, и уменя лично прочно ассоциируется с SQL'ным NULL.
А тип у NULL должон быть NULL  :) Иначе весь смысл теряется.
Результат любой операции с NULL должон быть NULL...
Ничего не понял в этом диком смешании nil'ов c null'ами. NULL как его ни назови, хоть nil'ом, это обычно эдакий недоделанный bottom type

В сях нету типа Null. Есть только значение Null для указателей, которые не указывают ни на один объект.
Т.е. это тупо define для нулевого указателя. И как бэ тип мы проверяем у указателя....
В JS есть тип Null, и это уже несколько другое.
Если это "пустой" объект, то нафик он нужен вообще этот Null? Зачем его в язык вводить?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подводные камни JavaScript
« Ответ #7 : Ноябрь 20, 2012, 08:00:44 pm »
NULL и NIL - это разные вещи. (в сях имхо неудачно название выбрано)
Если в js NULL = NIL, то нафик он вообще нужен в динамическом языке.

NULL обычно означает отсутствие значения, и уменя лично прочно ассоциируется с SQL'ным NULL.
А тип у NULL должон быть NULL  :) Иначе весь смысл теряется.
Результат любой операции с NULL должон быть NULL...
Ничего не понял в этом диком смешании nil'ов c null'ами. NULL как его ни назови, хоть nil'ом, это обычно эдакий недоделанный bottom type

В сях нету типа Null. Есть только значение Null для указателей, которые не указывают ни на один объект.
Т.е. это тупо define для нулевого указателя. И как бэ тип мы проверяем у указателя....
В JS есть тип Null, и это уже несколько другое.
Если это "пустой" объект, то нафик он нужен вообще этот Null? Зачем его в язык вводить?
Ну, это он был давно тупо дефайном, с тех пор несколько поменялось :-) Особенно в плюсах. (у nullptr есть тип nullptr_t который нифига не int). (алсо в тех сях, где оно тупо дефайн, он конечно же не один такой. C точки зрения типа. )

А как что и зачем - описано по ссылке в вики.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Подводные камни JavaScript
« Ответ #8 : Ноябрь 20, 2012, 08:05:24 pm »
Ну и фик с ним. Открываем доку на typeof, читаем: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof Еще вопросы?

Строковое представление типа вообще никогда волновать не должно. if (typeof foo == "object") писать нельзя никогда, очевидно. Ни в каком языке. Писать надо if (typeof foo == typeof {} ). В этом случае мы не зависим от того какие рюшечки навешают для строкового представления типов.

Тык это и странно. Типа нет, но есть хрен знает каким способом полученное строковое представление.
Это вынос мозга если вдуматься.
Почему бы тогда для Array не возвращать строковое представление?  :)



valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Подводные камни JavaScript
« Ответ #9 : Ноябрь 20, 2012, 08:13:04 pm »
Ну и фик с ним. Открываем доку на typeof, читаем: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof Еще вопросы?

Строковое представление типа вообще никогда волновать не должно. if (typeof foo == "object") писать нельзя никогда, очевидно. Ни в каком языке. Писать надо if (typeof foo == typeof {} ). В этом случае мы не зависим от того какие рюшечки навешают для строкового представления типов.
Тык это и странно. Типа нет, но есть хрен знает каким способом полученное строковое представление.
Это вынос мозга если вдуматься.
Почему бы тогда для Array не возвращать строковое представление?  :)
Не-е, вынос мозга это вот это: http://www.youtube.com/watch?v=kXEgk1Hdze0
:-D
Y = λf.(λx.f (x x)) (λx.f (x x))