+ Ответить в теме
Показано с 1 по 10 из 10

Тема: Вопрос знатокам, я бы сказал даже, что это вопрос ГУРУ

  1. #1

    Вопрос знатокам, я бы сказал даже, что это вопрос ГУРУ

    Уважаемые знатоки, чему равна переменная
    var test = ['0'] != false;
    Это переменная равна false, что меня очень удивило – ищу причину сего явления

  2. #2
    Местный alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее Аватар для alexdrob
    Регистрация
    08.09.2009
    Адрес
    Краснодарский край
    Сообщений
    6,488
    я конечно не ГУРУ ) но а почему должно быть не false?
    ['0'] = 0
    но
    0 = false

    test = false != false


    ответ? они равны, а значит результат проверки false ))

  3. #3
    Модератор Alcorn - весьма и весьма положительная личность Alcorn - весьма и весьма положительная личность Аватар для Alcorn
    Регистрация
    13.06.2009
    Адрес
    Россия, Владивосток
    Сообщений
    1,880

    alert(0==false); // true
    alert(0!=false); // false
    ASP.NET, Oracle

  4. #4

    alert(!!0)//false
    alert(!!['0'])//true

  5. #5
    Модератор Alcorn - весьма и весьма положительная личность Alcorn - весьма и весьма положительная личность Аватар для Alcorn
    Регистрация
    13.06.2009
    Адрес
    Россия, Владивосток
    Сообщений
    1,880
    !!0 тоже самое, что и Boolean(0).
    ASP.NET, Oracle

  6. #6
    Цитата Сообщение от alexdrob Посмотреть сообщение
    я конечно не ГУРУ ) но а почему должно быть не false?
    ['0'] = 0
    Потомучто при явном приведении к булеву получаем
    alert(Boolean(['0']) != false); //true

    А без явного приведения, к булеву приводится не массив, а его единственный элемент (в данном случае).
    Лично для меня это тоже странно.

  7. #7
    Местный alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее Аватар для alexdrob
    Регистрация
    08.09.2009
    Адрес
    Краснодарский край
    Сообщений
    6,488
    Цитата Сообщение от alexflasher Посмотреть сообщение
    Потомучто при явном приведении к булеву получаем
    а там нет явного приведения, если взять 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');

    равны

  8. #8
    Модератор Alcorn - весьма и весьма положительная личность Alcorn - весьма и весьма положительная личность Аватар для Alcorn
    Регистрация
    13.06.2009
    Адрес
    Россия, Владивосток
    Сообщений
    1,880
    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
    Последний раз редактировалось Alcorn; 26.06.2010 в 05:29.
    ASP.NET, Oracle

  9. #9
    Цитата Сообщение от alexdrob Посмотреть сообщение
    а там нет явного приведения, если взять 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'.

  10. #10
    Местный alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее alexdrob обеспечил(а) себе прекрасное будущее Аватар для alexdrob
    Регистрация
    08.09.2009
    Адрес
    Краснодарский край
    Сообщений
    6,488
    Цитата Сообщение от alexflasher Посмотреть сообщение
    Как я понимаю != не обращает внимания, что второй операнд - булев и начинает сначала приводить массив к стрингу (элементы через запятую), а затем эту стрингу к булеву. Это также объясняет равенство ['3','2'] и 3,2'.
    я вам это и хотел сказать)

+ Ответить в теме

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 03.02.2010, 15:44
  2. ОС-вопрос =)
    от Ramster в разделе Флейм и оффтопик
    Ответов: 21
    Последнее сообщение: 20.01.2010, 19:17
  3. вопрос
    от andruha в разделе Анимация / Flash
    Ответов: 1
    Последнее сообщение: 03.04.2008, 16:46

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения