В наборе тестовых вопросов, составленном cssrain, есть такой вопрос:
<SCRIPT LANGUAGE="JavaScript">
вар а = 0;
вар б = -1;
вар с = 1;
функция утверждения (aVar) {
если (aVar==true) alert(true);
еще предупреждение (ложь);
}
утверждать(а);
утверждать (б);
утверждать (с);
</СКРИПТ>
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Насколько я понимаю, любое логическое значение, отличное от 0, должно быть истинным.
Но правильный вывод этого вопроса: false false true.
Значение (-1==true) является ложным.
Давайте посмотрим на следующий пример:
<SCRIPT LANGUAGE="JavaScript">
вар а = 0;
вар б = -1;
вар с = 1;
функция утверждения (aVar) {
если (aVar) предупреждение (истина);
еще предупреждение (ложь);
}
утверждать(а);
утверждать (б);
утверждать (с);
</СКРИПТ>
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Текущие результаты: ложь, правда, правда.
Здесь мы обнаруживаем, что результаты if(aVar) и if(aVar == true) не совпадают.
Объяснение cssrain в ответе :
if(aVar) и if (aVar==true) дают совершенно разные ответы для отрицательных чисел.
Действительно ли это является причиной отрицательного числа? Рассмотрим следующий пример:
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Почему положительное число 2 также возвращает false? Давайте преобразуем число в логическое значение и посмотрим.
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Ненулевые логические значения здесь действительно истинны, а это означает, что все проблемы сосредоточены на операторе == в 2==true. В принципе очевидно, что == не должен преобразовывать числа в логические значения и затем сравнивать их.
Посмотрите, что говорит ECMA-262 (стр. 80):
6. Если Type(x) имеет логическое значение, верните результат сравнения ToNumber(x) == y.
7. Если Type(y) имеет логическое значение, верните результат сравнения x == ToNumber(y).
То есть логические значения сначала преобразуются в числа, а затем сравниваются. Числовое значение true — 1, false — 0. Таким образом, ни 2, ни -1 не могут быть равны истине.
Посмотрите внимательно на следующий пример:
<SCRIPT LANGUAGE="JavaScript">
вар а = "не определено";
вар б = «ложь»;
вар с = "";
функция утверждения (aVar) {
если (aVar==true) alert(true);
еще предупреждение (ложь);
}
утверждать(а);
утверждать (б);
утверждать (с);
</СКРИПТ>
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Согласно предыдущей идее, true будет преобразовано в 1, поэтому все три утверждения вернут false. Запустите его и убедитесь, что это действительно так.
Затем измените if(aVar==true) на if(aVar).
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Результаты бега на данный момент правдивы, истинны, ложны. Потому что результаты Boolean("undefined"), Boolean("false") и Boolean("") являются true, true и false. Непустые строки преобразуются в логическое значение true.
Наконец, есть пример, объясняющий правила сравнения, когда обе стороны == являются строками и числами.
Окно запуска кода
[Ctrl+A: Советы по выбору всех: сначала вы можете изменить часть кода, а затем нажать «Выполнить»]
Вы обнаружили, что это «001» == true верно?
Потому что true сначала преобразуется в 1. Затем обратитесь к правилам ECMA:
4. Если Type(x) — это число, а Type(y) — это строка, верните результат сравнения x == ToNumber(y).
5. Если Type(x) — это строка, а Type(y) — это число, верните результат сравнения ToNumber(x) == y.
Строка должна быть преобразована в число, а значение Number("001") также равно 1, поэтому результат верен.