Уважаемые знатоки, чему равна переменная
var test = ['0'] != false;Это переменная равна false, что меня очень удивило – ищу причину сего явления
Вид для печати
Уважаемые знатоки, чему равна переменная
var test = ['0'] != false;Это переменная равна false, что меня очень удивило – ищу причину сего явления
я конечно не ГУРУ ) но а почему должно быть не false?
['0'] = 0
но
0 = false
test = false != false
ответ? они равны, а значит результат проверки false ))
alert(0==false); // true
alert(0!=false); // false
alert(!!0)//false
alert(!!['0'])//true
!!0 тоже самое, что и Boolean(0).
а там нет явного приведения, если взять c++ то выполните
char ch = "5";
int n;
n = ch*5;
и будет ошибка.
а теперь js
var ch = "5";
var n;
n = ch * 3;
что получится? сначала ch приведётся к численному типу, а потом умножится.
В js неявные преобразования виной видимо. например
alert(['3','2']=='3,2');
равны
Цитата:
Boolean() = !!
Значение, переданное в качестве параметра, при необходимости, приводится к булевому виду.
Если аргумент не указан или равен:
0,
-0,
null,
false,
NaN,
undefined,
или пустая строка (""),
то объект инициализуется как false. Все остальные значения, включая объекты и строку "false" создают объект с начальным значением true.
alert(!!parseInt('0')); // false // '0' приводится к нулю
alert(!!'0'); // true // строка '0' - нет
В данном случае строковое значение (кроме пустой строки) параметра !! не инициализируется в false в !!.
А в случае ==, при сравнении операнды неявно приводятся к одному типу, в результате -
alert('000000' == false); // true // строку '000000' приводим к числу, получаем 0 и далее к false, false равно false
alert('000000'.toString() == false); // true // тоже самое
alert('1' == true); // true // '1' приводим к 1 и далее true равно true
alert('111111' == true); // false // '111111' приводим к числу, получаем те же самые 111111, к булевому привести не можем, что соответственно не равно true
Это уже из другой оперы, си++ типизированный язык, а js нет.
Вы попробуйте в си сравнить ['0'] и false, я уверен, что будет тот же результат (нет возможности проверить)
Как я понимаю != не обращает внимания, что второй операнд - булев и начинает сначала приводить массив к стрингу (элементы через запятую), а затем эту стрингу к булеву. Это также объясняет равенство ['3','2'] и 3,2'.