2013-07-26 5 views
3

я знаю разницу между == и === однако я всегда считал, что if (condition)condition должен был быть оценен против true с использованием строгого равенства (===) и не тип- принудительное равенство (==).В JS если (условие) означает == истинный или === истинный

Смотрите пример:

if (1) { 
    console.log("1"); 
} 

if (1 == true) { 
    console.log("2"); 
} 

if (1 === true) { 
    console.log("3"); 
} 

Она возвращает:

::1 
::2 

Я знаю, что 1 не строго равна true, так как тип отличается, но когда я if (condition) согласно W3C это должен быть строгий тест на равенство (===), который выполняется не для принудительного выравнивания типа ==.

Так почему же он регистрирует 1?

+2

Просьба уточнить **, когда я делаю, если (условие) в соответствии с W3C он должен быть == = not == ** –

+1

http://longgoldenears.blogspot.com/2007/09/triple-equals-in-javascript.html –

+0

Когда я делаю «если (1)» согласно W3C, его следует интерпретировать как «если (1 === true) "вместо" if (1 == true) ", что происходит в Chrome – amandanovaes

ответ

9

if оператор использует condition == true. Это дано в спецификации ECMAScript языка, здесь: http://www.ecma-international.org/ecma-262/5.1/#sec-12.5

Обратите внимание на использовании в ToBoolean() на шаге 2. Это превращает данный аргумент в логическое значение, означающий, что да, типа принуждение имеет место для состояния с if заявления ,

+0

Наконец-то! Ты прав! СПАСИБО БОЛЬШОЕ! – amandanovaes

+3

У меня просто есть комментарий к этому, люди в StackOverflow не читают вопрос правильно, а downvote его так быстро, не понимая ... если вы не поняли вопрос, это ваша проблема, прочитайте снова или сделайте комментарий вместо downvoting. Этот ответ, предоставленный @Serlite, спас меня. Теперь я могу научить своих одноклассников этому поведению по умолчанию, что в моей книге сказано, что значение по умолчанию W3C равно ===. Или книга неправильная или книга говорит о W3C === в причине CSS, поскольку вы сказали мне, что спецификация javascript находится на ECMAS, а не W3C. – amandanovaes

+6

@Glauco: В какой книге указано, что _ по W3C_ по умолчанию '==='? Скажите, пожалуйста, чтобы я мог занести в черный список его на вечность и провести ритуальное жжение, если я когда-либо буду править миром;) –

3

Это эквивалентно condition == true, который определен Спецификация языка ECMAScript

+0

Где бы вы могли подтвердить эту информацию сэр? Если if (condition) означает if (condition == true) вместо if (condition === true) – amandanovaes

+1

@Glauco, не должно быть ясно из всех комментариев, которые вы неправильно прочитали, или что документ, который вы прочитали, неправильно? – Pointy

+0

как @MatteoTassinari sayed Я хочу знать поведение по умолчанию, используемое компилятором, который должен быть компасом значения и типа, а не только значение, когда я делаю if (condition) – amandanovaes

2

В 3 знака равенства означают «равенство без принуждения типа». Используя тройное равенство, значения должны быть одинаковыми по типу.

Difference between == and === in JavaScript

+2

Вы очень правы, но я не думаю, что вы понимаете вопрос –

+2

Я тоже думаю, что вопрос в другом ответе. – Ramsharan

+0

Вы прочитали мой вопрос сэр? Где он говорит: «Я знаю, что 1 не является истинным, потому что тип отличается» – amandanovaes

4

Поскольку === строгий оператор сравнения.

if (1 === true) { //they are of a different type 

Вы пробовали этот

if (0) { // This fails 
    console.log("1"); 
} 

потому что 0 = off, negative, no, false повсеместно. проверить это Why is 0 false?

в то время как в то время как при использовании ===

if(1 === true) //It looks for type 1 as number and true as boolean 

ES5 spec defines the following algorithm:

enter image description here

+0

Значит ли это, что он пытается сравнить числовое значение с логическим? Который вернет false. – Pais

+0

@ Пай, да, ты прав.'===' принадлежит ** ассоциативности ** слева направо **. поэтому он будет проверять, как вы упомянули. – Praveen

5

Javascript a.k.a. ECMAScript не регулируется W3C, а ECMA. Вы можете прочитать спецификацию here. Что вас интересует, это раздел this, который определяет, как обрабатываются выражения в операциях if. Время выполнения должно вызывать toBoolean по значению выражения; что любой тип будет преобразован в логическое.

Поэтому он ведет себя как ==.

+0

Возможно, ваш ответ, пожалуй, единственный, кто отвечает на мои вопросы. Но я не нашел раздел в указанной вами ссылке, подтверждающей, что поведение по умолчанию равно ==, а не === – amandanovaes

+2

Поведение задается как ** «Если ToBoolean (GetValue (exprRef)) истинно ...» ** , Это спецификация языка, а не учебник. Они не используют термин «' == '». 'ToBoolean()' - это метод преобразования любого типа в логическое, то есть происходит преобразование типа, что означает, что он ведет себя как '==' *. – deceze

+0

Большое вам спасибо. Вы мне очень помогли. – amandanovaes

3

Как вы получаете эту информацию из книги по CSS, автор, скорее всего, ссылаясь на правила CSS, как это:

[if IE]body 
{/* only for IE*/ 
    [if IE 6] background: url('get_real.gif'); 
    [if gt IE 6] background: url('nogood_browser.png'); 
} 
[if Webkit]body 
{/*Only webkit browsers get this bg*/ 
    background: url('webkit_bg.png'); 
} 
[if Gecko]body 
{/*Gecko-based browsers get this*/ 
    background: url('foxy.png'); 
} 

Кроме этого - на JS:

Мое предположение было у вас есть идея from the place all mis-information comes from. Пожалуйста, ради тебя и моих, don't use w3schools.

в случае if (condition), где condition следует читать expression, чтобы быть правильным, оно должно быть truthy, если выражение состоит из одного значения. В случае, если вы сравниваете 2 выражения, то условное выражение true или false, основываясь на том, как сравнить два операнда

одного операнда:

if (1)//truthy 
if (undefined) //falsy 

Это потому, что Boolean(1) === true и Boolean(undefined) === false
После того, как вы приведете второй операнд:

if ('0' == 0)//=== true 
if ('0' === 0)// === false 

это потому, что === тип и Проверка ценности, которую вы, очевидно, уже знаете. Точно так же нет никакой путаницы:

Если вы хотите быть уверены, что у вас есть правильная информация: Проверьте язык ECMAScript функции, а не какой-то третий ресурс партии:here's the link

1

Truthy: Что-то, которое приводится в TRUE. Falsey: То, что оценивается как ЛОЖЬ.

1 правдиво, 0 ложно.

Объект любого вида (включая функции, массивы) всегда правдивый.

Все они ложные: неопределенные, null, NaN, 0, "" (пустая строка) и false.

Следовательно, в вашем первом состоянии if (1)... журналы 1, потому что 1 правдиво.

=== конкретно тесты для равенства типов, которые отличаются от проверки правды.

0

Я нашел раздел в документации ECMA по адресу ToBoolean, который используется в инструкции if.

Чтобы подвести итог:

Номер: Результат является ложным, если аргумент равен +0, -0 или NaN; в противном случае результат верен.

0

Примечание: есть простой способ преобразования выражения в булево и используется !! оператор. Для примера
!! 1 истинно
!! {} истинно
!! "" является ложным и !!«ASDF» истинно
так я всегда чувствую себя комфортно преобразования выражения в логическое значение, а затем позволить их в единую, если тест сравнения

if (1) { // !!1 is true and anything non-zero is true even -ve numbers just like c language 
    console.log("1"); 
} 

if (1 == true) { //!! 1 is true and we are not checking type only two equals (==) 
    console.log("2"); 
} 

if (1 === true) { //!! 1 is true but the type is number which is obviously not a Boolean type 
    console.log("3"); 
} 
Смежные вопросы