2010-06-17 3 views
5

Почему бы кто-то использовать такое выражениеЧто означает это выражение "!!"

if(!!window.JSON) alert('exists'); 

вместо просто

if(window.JSON) alert('exists'); 

?

Есть ли другое использование для "!!" вещь ?

+0

несколько негативов, хотя понять, что вот почему. Если вы продолжаете использовать if (!! (!!) !!! (!) !! obj) в своем коде, только вы можете его поддерживать (если вам повезет) - я не безрассудно! – simendsjo

+1

см. Http: // stackoverflow.com/questions/1406604/what-do-the-operator-double-exclamation-point-mean-in-javascript/1407769 # 1407769; и вы правы, в этом случае это избыточно, поскольку 'if()' уже преобразуется в boolean – Christoph

ответ

1

! это логическое отрицание! это логическое отрицание, применяемое дважды, то есть логический идентификатор

Я бы предположил, что код, который вы читаете, просто безвреден (хотя и путающе) избыточным.

+0

Да, но не вопрос включает в себя неявный тип-литье из объекта в boolean? –

15

!! будет просто вызывать логическое преобразование, не нужно вообще, чтобы использовать эту конструкцию с if заявления, а также в первом фрагменте, преобразование объекта, в логическое значение не имеет смысла, это будет всегда верно.

только значения, которые могут сподвигнуть к false являются null, undefined, NaN, 0 и пустая строка и конечно false все остальное будет принуждать к true.

Когда имеет смысл использовать !!, когда вы хотите, чтобы убедиться, чтобы получить логический результат, например, при использовании логических && и || операторов.

Эти операторы могут возвращать значение операнда, а не логический результат, например:

true && "foo"; // "foo" 
"foo" || "bar" ; // "foo" 

Представьте у вас есть функция, что тестовые два значения, и вы ожидаете, логический результат:

function isFoo() { 
    return 0 && true; 
} 

isFoo(); // returns 0, here it makes sense to use !! 

Edit: Глядя на ваши изменения, if (!!window.JSON) просто лишними, как я уже говорил раньше, потому что if statement само по себе сделает т он boolean conversion internally, когда вычисляется выражение условия.

+0

Похоже, вы хотели написать что-то вроде 'function isFoo (obj) {return obj & & true;} isFoo (0);' в последнем примере :) или 'return !! obj & & true;' – Znarkus

+0

'false &&" foo "' оценивает значение * false *. – Gumbo

+0

@Gumbo: Да, была опечатка s/false/true, @ Znarkus, да, просто что-то для пояснительных целей;) Спасибо, ребята ... – CMS

2

Вероятно, они пытаются передать объект в логическое. Применяя к объекту логический оператор (!), он становится bool, но на самом деле не хочет отрицания, поэтому они применяют второй для отмены первого.

2
// !! = boolean typecasting in javascript 

var one = 1 
var two = 2; 

if (one==true) app.alert("one==true"); 
if (!!one==true) app.alert("!!one==true"); 

if (two==true) app.alert("two==true"); // won't produce any output 
if (!!two==true) app.alert("!!two==true"); 
+0

Вот почему вы должны использовать '===' и явно бросать:' = = 'правила преобразования типов - это что-то вроде WTF – Christoph

1

Его логическое преобразование, обеспечивающее преобразование в boolean в первый раз, а затем возврат к исходному значению.

Однако он используется неправильно здесь и будет только действительно актуально, если вы назначаете его в другую переменную - по соображениям производительности

var isJSON = (!!window.JSON); 

if (isJSON) doX; 
if (isJSON) doY; 
if (isJSON) doZ; 
Смежные вопросы