Показать сообщение отдельно
  #10 (permalink)  
Старый 12.11.2012, 06:04
Профессор
Отправить личное сообщение для Почемучкин Посмотреть профиль Найти все сообщения от Почемучкин
 
Регистрация: 11.05.2011
Сообщений: 241

eirnvn,
Есть такие хорошие штуки, как typeof и alert, которые помогут тебе разобраться. Например:
alert("для false:" + typeof false);
alert("для null:" + typeof null);
Цитата:
JS - первый язык программирования, который я изучаю.
ИМХО, JavaScript не лучший язык для изучения логических выражений (впрочем, C/C++/Java - тоже тут не идеал). Дело в том, что в JavaScript все запутано. И тебя, как только начинающего программировать, это соответственно может сильно запутать. Корни растут из принятого в Си порядка, где все, что 0 - эквивалентно false, а все, что не ноль - эквивалентно true.

null - это отдельный тип данных в Javascript, признак отсутствия конкретного значения у существующей переменной или свойства (вернее, неопределенное значение, пустота);
undefined - значит, что такой переменной или свойства не существует или они не инициализированы;
Вообще, с переводом значений на русский язык у null и undefined не все гладко. Я написал как их надо понимать, а не формально правильно.
NaN - "не-число", то есть оно-то имеет тип Number, но это значение указывает, что в переменной отсутствует числовое значение;
false - ложь, указывает, что результат отрицательный (в смысле - не такой как ожидается).
0 - как я говорил, еще со времен Си (а скорее еще со времен досишных - с двоичного кодирования) означает false в логических выражениях.
Еще есть проблема преобразования строк в логические выражения.
Например, пустая строка или строка с пробелами и переносами строк - аналогична false в логических выражениях:
alert("  \n \f" == false);


А еще.... между этими "отрицающими" значениями сложные взаимоотношения. Несмотря на то, что все они в логических выражениях заменяют false, тем не менее они могут быть не равны друг другу при прямом сравнении:
alert(false == null);

NaN никогда не равно само себе!
alert(NaN == NaN);

и т.д....

Чтобы избежать неочевидных преобразований в сравнениях, лучше использовать === вместо ==, потому что при === и !== сравниваются и значения, и типы, и никаких преобраований не происходит.

В общем, ты понял, что в JavaScript с логическими выражениями все очень запутано. Это потому, что его пытались сделать неформальным, проще в использовании, чем более формальные языки типа C++ и Java, да и ведь это был изначально лишь вспомогательный скрипт, без претензий на большие задачи. Отсюда и "непродуманность", хотя если ее изучить, то пользоваться JS удобнее и проще, чем "старшими товарищами".

Кроме typeof и === хорошо еще для проверки типов использовать такие штуки:
Object.prototype.toString.call(...)
instanceof
var AR = []; //массив
alert( typeof AR );
alert( Object.prototype.toString.call( AR ) );
alert( AR instanceof Array );
alert( Object.prototype.toString.call( null ) );

Цитата:
Далее, если мы присваиваем null || false эелементу ДОМ:
elem = null - мы уничтожаем элемент.
А elem = false?
Можно ли так вообще делать, когда?
Объект уничтожается только после того, как все ссылки на него будут уничтожены.
То есть как только всем переменным, которые хранили на него ссылки будут присвоены другие значения (не обязательно их уничтожать - достаточно присвоить любые значения, чтобы ссылка на наш объект потерялась). После этого он превращается в мусор, которым займется сборщик мусора, когда придет время, и удалит его из памяти.

Последний раз редактировалось Почемучкин, 12.11.2012 в 06:48.
Ответить с цитированием