2014-01-07 4 views
5

Я играю с некоторым JavaScript и нашел что-то странное.Что такое «===!» оператор делает?

Этот код предупреждает «ложь», но не дает синтаксических ошибок. Кто-то может объяснить, почему добавление одного или даже многих !!! после === не приводит к каким-либо ошибкам?

var i = void 0; 
var b = i ===! void 0 ? "true" : "false"; 
alert(b);//display false but no syntax errors.. 
+1

'!' Отрицает следующий оператор, даже если следующий оператор является '!' –

+1

И почему это должно быть? '!' просто отрицание, поэтому несколько '!' будут просто инвертировать друг друга –

ответ

11

Пробела ничего не значит, так

var b = (i === (!void 0)) ? "true" : "false"; 

которого

var b = (i === true) ? "true" : "false"; 

MDN Operator Precedence

+0

Хорошо, я понимаю. Спасибо за ответ и за ссылку – Merlin

+0

Для ясности я могу также включить 'i === true; // false' (возможно, скобки вокруг него) –

5

! просто отрицание, и это правоассоциативное, в отличии от большинства других операторов, поэтому он просто отрицает все, что перед ним

Это, по существу эквивалентно

var b = i ===(!void 0) ? "true" : "false";

Так в основном, вы можете иметь столько ! сек перед чем-то, как вы хотите, и это не будет иметь значение, так !!!!!!!!!!!!!false, будет оценивать к истине, потому что это то же самое, как !(!(!(!(!(!(!(!(!(!(!(!(!false))))))))))))

+0

@ user2864740 haha, whoops, я тестировал это на странице, где 'i' был предварительно определен – scrblnrd3

+3

Я просто предположим, что вы ввели правильное число'! (...) 'и upvote :) –

+3

@AdamRackis Я приложил большие усилия, чтобы поместить в нужное количество парнеров – scrblnrd3

2

Смотрите эту таблицу, которая может помочь объяснить:

!0 // true 
!!0 // false 
!!!!!!0 // false, showing that !s are simply prefixes 
! 0 // true, showing whitespace is irrelevant 
0 === !0 // false 
0 ===! 0 // false 
0 ===!!! 0 // false 
Смежные вопросы