ошибки компиляции ofxmotiontracker ofxaddon

Так много ответов выполняют половину работы. Да, !!X можно было бы читать как «правду X (представленную как логическое)». Но !!, по сути, не так важен для выяснения того, является ли одна переменная (или даже если многие переменные) правдивыми или ложными. !!myVar === true совпадает с myVar. Сравнение !!X с «реальным» булевым не очень полезно.

То, что вы получаете с помощью !!, - это возможность проверить правдивость нескольких переменных друг против друга (

То есть ...

  • 0 === false - [

    ]

    f11].

  • !!0 === false is true.

Вышеприведенное не так полезно. if (!0) дает вам те же результаты, что и if (!!0 === false). Не думайте о хорошем случае для приведения переменной в boolean, а затем в сравнении с «истинным» булевым.

См. «== и! =» из направления JSLint (примечание : Crockford немного перемещает свой сайт, эта ссылка может умереть в какой-то момент) для немного о том, почему:

Операторы == и! = Действительно применяют принуждение до сравнения. это плохо, потому что это приводит к тому, что значение «\ t\r\n» == 0 является истинным, что может маскировать ошибки типа. JSLint не может достоверно определить, правильно ли используется ==, поэтому лучше не использовать == и! = вообще и к способы используют более надежные операторы === и! ==.

Если вам все равно, что значение является правдивым или ложным, используйте короткую форму. Вместо (foo != 0)

просто скажите (foo)

и вместо (foo == 0)

скажите (!foo)

blockquote>

Обратите внимание, что есть некоторые неинтуитивные случаи , где булев будет отбрасываться на число (true передается в 1 и false в 0) при сравнении булевых с a номер. В этом случае !! может быть умственно полезным. Хотя, опять же, это случаи, когда вы сравниваете небулевое значение с жестким типизированным логическим выражением, которое является imo серьезной ошибкой. if (-1) по-прежнему остается здесь.

╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
║               Original                ║    Equivalent     ║  Result   ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1 == true) console.log("spam")   ║ if (-1 == 1)      ║ undefined ║
║ if (-1 == false) console.log("spam")  ║ if (-1 == 0)      ║ undefined ║
║   Order doesn't matter...             ║                   ║           ║
║ if (true == -1) console.log("spam")   ║ if (1 == -1)      ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam      ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam")           ║ if (truthy)       ║ spam      ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝

И все становится еще сумасшедшим в зависимости от вашего двигателя. WScript, например, выигрывает приз.

function test()
{
    return (1 === 1);
}
WScript.echo(test());

Из-за какой-то исторический джив Windows , который выведет -1 в поле сообщения! Попробуйте в командной строке cmd.exe и посмотрите! Но WScript.echo(-1 == test()) все равно дает вам 0 или WScript false. Осмотрите. Это ужасно.

Сравнение правды:)

Но что, если у меня есть два значения, мне нужно проверить равную правду / фальсификацию?

Представьте, что у нас есть myVar1 = 0; и myVar2 = undefined;.

  • myVar1 === myVar2 - 0 === undefined и, очевидно, неверно.
  • !!myVar1 === !!myVar2 является !!0 === !!undefined и правда! Та же правдивость! (В этом случае обе «имеют правдоподобие фальши».)

Таким образом, единственное место, где вам действительно нужно использовать «логические переменные», было бы, если бы у вас была ситуация где вы проверяете, имеют ли обе переменные ту же правду, не так ли? То есть, использует !!, если вам нужно убедиться, что два vars являются правдивыми или ложными (или нет), то есть равной (или нет) правдоподобности.

Я не могу придумать отличный, непринужденный случай использования для этого. Возможно, у вас есть «связанные» поля в форме?

if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
    errorObjects.spouse = "Please either enter a valid name AND age " 
        + "for your spouse or leave all spouse fields blank.";
}

Итак, теперь, если у вас есть правдивость как для , так и для фальшивого имени и возраста супруга, вы можете продолжить. В противном случае у вас есть только одно поле со значением (или очень ранним браком), и вам нужно создать дополнительную ошибку в вашей коллекции errorObjects.


EDIT 24 Oct 2017:

Сторонние библиотеки, ожидающие явных булевых значений

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

Для instance, False в JSX (React) имеет особое значение , которое не срабатывает при простой ложности. Если вы попытались вернуть что-то вроде следующего в вашем JSX, ожидая int в messageCount ...

{messageCount &&

You have messages!
}

... вы можете быть удивлены, увидев, что React render a 0, когда у вас есть нулевые сообщения. Вы должны явно вернуть false для JSX не для рендеринга. Вышеприведенный оператор возвращает 0, который JSX радостно делает, как и должно. Он не может сказать, что у вас не было Count: {messageCount &&

Get your count to zero!
} (или что-то менее надуманное).

  • Одно исправление включает в себя bangbang, который принуждает 0 к !!0, который является false: {!!messageCount &&
    You have messages!
    }
  • Документы JSX предлагают вам быть более ясными, писать код с комментариями и использовать сравнение, чтобы заставить логическое. {messageCount > 0 &&
    You have messages!
    }
  • Мне удобнее манипулировать ложностью с тройным - {messageCount ?
    You have messages!
    : false}

Имейте в виду, что этот является соглашением JSX , а не один, присущий JavaScript.

Но если вы видите странные 0 s в вашем обработанном JSX, подумайте об управлении слабым фальшивом.

0
задан JRulle 19 February 2015 в 16:56
поделиться