Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться: false, null?? (https://javascript.ru/forum/misc/33098-pomogite-razobratsya-false-null.html)

eirnvn 09.11.2012 23:06

Помогите разобраться: false, null??
 
JS - первый язык программирования, который я изучаю.
Помогите разобраться правильно ли я понимаю:
Мы можем присвоить функции (или методу) null или false:
func = null || func = false
Есть ли какая-то разница?
Что это означает НА САМОМ ДЕЛЕ:
null - совсем уничтожает func как delete?
а false - это эквивалент return false в функции или нет? Что-то другое?

Далее, если мы присваиваем null || false эелементу ДОМ:
elem = null - мы уничтожаем элемент.
А elem = false?
Можно ли так вообще делать, когда?
Если где-то об этом говорится в учебнике, дайте, ссылочку, пожалуйста .

eirnvn 11.11.2012 11:59

Не могу там найти ответ на свой вопрос((

Dim@ 11.11.2012 12:21

Цитата:

Сообщение от eirnvn
func = null || func = false
Есть ли какая-то разница?

да
Цитата:

Сообщение от eirnvn
null - совсем уничтожает func как delete?

нет
Цитата:

Сообщение от eirnvn
а false - это эквивалент return false в функции или нет?

нет
Цитата:

Сообщение от eirnvn
elem = null - мы уничтожаем элемент.

это не так
Цитата:

Сообщение от eirnvn
А elem = false?

тоже самое

так как всё о чем вы говорите основано на ссылках, вы не уничтожаете ни элемент, ни функцию, вы просто убираете с переменных ссылки на них

nerv_ 11.11.2012 12:50

Цитата:

Сообщение от eirnvn
JS - первый язык программирования, который я изучаю.

соболезную :)
Цитата:

Сообщение от eirnvn
Есть ли какая-то разница?

null - отсутствие значения
false - значение ЛОЖЬ

Цитата:

Сообщение от eirnvn
а false - это эквивалент return false в функции или нет? Что-то другое?

булева значения существует всего два:
1. true
2. false
где бы в коде программы ты их не встретил, они останутся булевыми значениями

http://learn.javascript.ru/variable-types

eirnvn 11.11.2012 12:55

Спасибо, что ответили
Цитата:

Сообщение от eirnvn
func = null || func = false
Есть ли какая-то разница?
да
Какая, если можно на примере?
Цитата:

Сообщение от eirnvn
null - совсем уничтожает func как delete?
нет
function func () {lalalala;}
func = null;
Ссылка уничтожится, но функция ни в какой другой переменной не останется. То, что она все-таки где-то (где?) осталась на что-то может повлиять?
Цитата:

Сообщение от eirnvn
а false - это эквивалент return false в функции или нет?
нет
какая же разница между func = null || func = false???
Цитата:

Сообщение от eirnvn
elem = null - мы уничтожаем элемент.
это не так
Сообщение от eirnvn
А elem = false?
тоже самое
elem = null - ок, уничтожаем ссылку
elem = false - тоже уничтожаем ссылку?
Почему тогда при elem = false,
одна и та же программа зависает, при
elem = null работает как надо?

Gvozd 11.11.2012 13:04

Цитата:

Сообщение от eirnvn
Какая, если можно на примере?

Это два разных значения.
После присваивания значения, переменная просто равна новому значению
func = null;
alert(func + ', ' + (func === null) + ', ' + (func === false))
func = false;
alert(func + ', ' + (func === null) + ', ' + (func === false))

Цитата:

Сообщение от eirnvn
Ссылка уничтожится, но функция ни в какой другой переменной не останется. То, что она все-таки где-то (где?) осталась на что-то может повлиять?

Если функция нигде больше не видна, то сборщик мусора удалит ее.
Если же осталась хоть одна ссылка, оставшаяся случайно, то функция будет существовать, и сборщик мусора ее не удалит.
Это чревато утечками памяти

Gvozd 11.11.2012 13:12

Цитата:

Сообщение от eirnvn
какая же разница между func = null || func = false???

Вы просто записываете в переменную конкретное значение.
Начиная с этого момента func это не функция, а просто переменная с заданным значением.
Что использовать - зависит от ситуации.

false противопоставляется true.
То есть если вы ходите возвращать да-нет, то это нужный вариант

null противопоставляется любому объекту

Цитата:

Сообщение от eirnvn
elem = null - ок, уничтожаем ссылку
elem = false - тоже уничтожаем ссылку?
Почему тогда при elem = false,
одна и та же программа зависает, при
elem = null работает как надо?

null !== false
Вот и все
Видимо она правильно обрабатывает null(вполне логичное отсутствие функции), и неверно обрабатывает false

eirnvn 11.11.2012 13:13

Цитата:

Сообщение от eirnvn
JS - первый язык программирования, который я изучаю.
соболезную
Соболезнования не принимаются:(((:))))
Цитата:

Сообщение от eirnvn
Есть ли какая-то разница?
null - отсутствие значения
false - значение ЛОЖЬ
Это ясно, спасибо, что напомнили, пытаюсь еще раз применить это к функции и элементу
Цитата:

Сообщение от eirnvn
а false - это эквивалент return false в функции или нет? Что-то другое?
булева значения существует всего два:
1. true
2. false
где бы в коде программы ты их не встретил, они останутся булевыми значениями
Вроде это и так ясно. Это уход от ответа или такой тонкий намек, что мне не понять)))???? Вот человек выше прямо сказал - не return false и точка.

eirnvn 11.11.2012 13:25

Спасибо за ясность

Цитата:

null противопоставляется любому объекту

Сообщение от eirnvn
elem = null - ок, уничтожаем ссылку
elem = false - тоже уничтожаем ссылку?
Почему тогда при elem = false,
одна и та же программа зависает, при
elem = null работает как надо?
null !== false
Вот и все
Видимо она правильно обрабатывает null(вполне логичное отсутствие функции), и неверно обрабатывает false
Только там не функция была, а элемент, который еще в ДОМ

Почемучкин 12.11.2012 06:04

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?
Можно ли так вообще делать, когда?
Объект уничтожается только после того, как все ссылки на него будут уничтожены.
То есть как только всем переменным, которые хранили на него ссылки будут присвоены другие значения (не обязательно их уничтожать - достаточно присвоить любые значения, чтобы ссылка на наш объект потерялась). После этого он превращается в мусор, которым займется сборщик мусора, когда придет время, и удалит его из памяти.


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