不是布尔值但使用||

时间:2017-10-23 11:41:32

标签: javascript logical-operators

以下代码获取不同浏览器的窗口大小。

<!DOCTYPE html>
<html>
<body>

    <p id="demo"></p>

    <script>
    var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
    var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;

    var x = document.getElementById("demo");
    x.innerHTML = "Browser inner window width: " + w + ", height: " + h + ".";
    </script>

</body>
</html>

我想问window.innerWidth或document.documentElement.clientWidth等..它们不是布尔值,我该如何使用||申报变量? w / h是数字,如果我执行以下操作就好了:

var k = aaa || bbb || 45;

k应该是一个数字,这是非法的,对吧? 那么第一段代码怎么可以工作呢? 感谢〜

2 个答案:

答案 0 :(得分:2)

这是因为Javascript中falsytruthy值的概念。

如果您在布尔上下文中使用它们,则

0nullundefined都会评估为false。因此,您可以进行如上所述的分配 - var k的值将是第一个真正的变量。

var k = aaa || bbb || 45;

如果aaa是真实的(所以,数字或某个定义的值),那么k就会成为那个,或者如果它是真的那就变成b,否则它就变成了数字45

答案 1 :(得分:0)

我意识到你现在很可能已经得到了答案,但我仍然会发布一个答案,因为: a。这个问题很重要,肯定会有足够数量的未来观众。 b。其他答案并未解释ToBoolean||之间的关系 c。我必须更改并添加太多if我是编辑另一个答案,所以...


在JavaScript中,||&&逻辑运算符都会强制将其操作数强制转换为boolean,如果它们不是布尔值,则使用抽象ToBoolean操作。

您可以使用ToBoolean构造函数或隐式Boolean转换来查看此!!操作的效果:

Boolean(foo);
!!foo;

上面两行中的任何一行都会将foo转换为布尔值。

但他们是怎么做到的?

很简单:如果变量foonullundefinedNaN0,或""(您也可以说false,但这很明显),它将成为false;在所有其他情况下,它将变为true

false强制(可以由上述任一行执行)之后变为ToBoolean的值被称为&#34;虚假值&#34;。你能猜出调用true操作后变为ToBoolean的值是什么?

以下是一些ToBoolean操作的示例:

&#13;
&#13;
const foo = "abc";

console.log(!!foo); // Prints out "true"
console.log(Boolean(foo)); // Same thing as above

const bar = "";
const baz = undefined;

console.log(Boolean(bar)); // Prints out "false"
console.log(Boolean(baz)); // Prints out "false"

/* Prints out "abc", because both "bar" and "baz" will become "false" after "||" coerces them to "boolean"*/
console.log(bar || baz || foo);
&#13;
&#13;
&#13;


因此,在您的示例中,如果aaa是&#34; falsy&#34;我在上面列出的值,JavaScript将跳过它并转到||的下一个操作数,如果该操作数不是假值,它将由||选择。

作为旁注,||将永远停留在第一个&#34; truthy&#34;值,如果没有真值,它将选择最后一个操作数。

<小时/> Here是指向ToBoolean的链接。