我在野外遇到过这个javascript代码,我无法准确理解它的作用及其工作原理:
// Ensure its bool.
options.something = (!(options.something === false));
据我所知,options.something只是设置为false的反面。上述之间是否有任何功能差异而只是做以下事情?
options.something = true;
JSHint和JSLint在原始代码上恰当地给出了“混淆使用'!'”警告。
答案 0 :(得分:3)
有趣的一段代码。 options.something
分配false
的唯一方法是它本身是否为假。
让我们分解一下:
(!(options.something === false)) =>
(!(false === false)) =>
(!true) =>
false
因此,在当天结束时,代码确保options.something为true或false,并且唯一的方法是false,如果它实际上是值false
(未定义,null, 0等。)。
另一方面,如果它以其他任何东西开头(例如undefined,null,0等),它将是值true
。
答案 1 :(得分:1)
它实际上不是一个切换,它是一个检查值是一个布尔值。
从里到外阅读。
内括号询问是否有错误。如果是表达式的值为true(false确实等于false)。取消(! true
)的否定值,返回布尔值false
。
如果某些内容为真,则内部表达式为false true != false
。取消(! false
)的结果,结果为true
。
好的,那么如果某些内容未定义怎么办?未定义将评估为false,因为false === false表达式为true。否定(! true
)返回false
。
所以任何真实的东西都返回true,未定义或false值总是返回false。