X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Вопрос знатокам, я бы сказал даже, что это вопрос ГУРУ
nikitammf
nikitammf
Topic Starter сообщение 25.6.2010, 16:56; Ответить: nikitammf
Сообщение #1


Уважаемые знатоки, чему равна переменная
[php]var test = ['0'] != false;[/php]Это переменная равна false, что меня очень удивило – ищу причину сего явления
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 25.6.2010, 17:08; Ответить: alexdrob
Сообщение #2


я конечно не ГУРУ ) но а почему должно быть не false?
['0'] = 0
но
0 = false

test = false != false


ответ? они равны, а значит результат проверки false ))
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
Alcorn
сообщение 25.6.2010, 17:16; Ответить: Alcorn
Сообщение #3


[PHP]
alert(0==false); // true
alert(0!=false); // false
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
nikitammf
nikitammf
Topic Starter сообщение 25.6.2010, 17:29; Ответить: nikitammf
Сообщение #4


[PHP]
alert(!!0)//false
alert(!!['0'])//true
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
Alcorn
сообщение 25.6.2010, 18:01; Ответить: Alcorn
Сообщение #5


!!0 тоже самое, что и Boolean(0).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexflasher
alexflasher
сообщение 26.6.2010, 1:27; Ответить: alexflasher
Сообщение #6


(alexdrob @ 25.6.2010, 20:08) *
я конечно не ГУРУ ) но а почему должно быть не false?
['0'] = 0

Потомучто при явном приведении к булеву получаем
alert(Boolean(['0']) != false); //true

А без явного приведения, к булеву приводится не массив, а его единственный элемент (в данном случае).
Лично для меня это тоже странно.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 26.6.2010, 2:55; Ответить: alexdrob
Сообщение #7


(alexflasher @ 26.6.2010, 04:27) *
Потомучто при явном приведении к булеву получаем

а там нет явного приведения, если взять 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');

равны
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
Alcorn
сообщение 26.6.2010, 3:59; Ответить: Alcorn
Сообщение #8


Boolean() = !!
Значение, переданное в качестве параметра, при необходимости, приводится к булевому виду.

Если аргумент не указан или равен:
0,
-0,
null,
false,
NaN,
undefined,
или пустая строка (""),

то объект инициализуется как false. Все остальные значения, включая объекты и строку "false" создают объект с начальным значением true.


[PHP]
alert(!!parseInt('0')); // false // '0' приводится к нулю
alert(!!'0'); // true // строка '0' - нет
[/PHP]

В данном случае строковое значение (кроме пустой строки) параметра !! не инициализируется в false в !!.

А в случае ==, при сравнении операнды неявно приводятся к одному типу, в результате -

[PHP]
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
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexflasher
alexflasher
сообщение 26.6.2010, 14:14; Ответить: alexflasher
Сообщение #9


(alexdrob @ 26.6.2010, 05:55) *
а там нет явного приведения, если взять c++ то выполните
char ch = "5";
int n;
n = ch*5;
и будет ошибка.

а теперь js
var ch = "5";
var n;
n = ch * 3;
что получится? сначала ch приведётся к численному типу, а потом умножится.

Это уже из другой оперы, си++ типизированный язык, а js нет.
Вы попробуйте в си сравнить ['0'] и false, я уверен, что будет тот же результат (нет возможности проверить)


Как я понимаю != не обращает внимания, что второй операнд - булев и начинает сначала приводить массив к стрингу (элементы через запятую), а затем эту стрингу к булеву. Это также объясняет равенство ['3','2'] и 3,2'.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
сообщение 26.6.2010, 15:28; Ответить: alexdrob
Сообщение #10


(alexflasher @ 26.6.2010, 17:14) *
Как я понимаю != не обращает внимания, что второй операнд - булев и начинает сначала приводить массив к стрингу (элементы через запятую), а затем эту стрингу к булеву. Это также объясняет равенство ['3','2'] и 3,2'.

я вам это и хотел сказать)

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыКонтекст окупается - и вы это увидите
Грамотная настройка Директа и Google Ads
71 knezevolk 45205 26.3.2024, 14:14
автор: knezevolk
Горячая тема (нет новых ответов) Во что сегодня инвестировать?
Делимся своими приносящими прибыль вариантами
69 traveliver 4447 25.3.2024, 6:48
автор: Skyworker
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыВо что Вы играете?
399 Vmir 67502 23.3.2024, 12:51
автор: Alexand3r
Открытая тема (нет новых ответов) Mondiad - это глобальная рекламная сеть с широкими возможностями для паблишеров и рекламодателей! [🎁 Эксклюзивный бонус]
15 Mondiad 4196 21.3.2024, 19:30
автор: Mondiad
Открытая тема (нет новых ответов) "Извините, что ожидание затянулось, но не думайте, пожалуйста, что мы про вас забыли. Мы заводим задачи по всем обращениям и контролируем работу над ними самым тщательным образом."
Вопрос
0 kuz999 1188 5.2.2024, 14:06
автор: kuz999


 



RSS Текстовая версия Сейчас: 28.3.2024, 20:48
Дизайн