Falsy?和&&运算符导致0返回0而不是NaN?

时间:2011-10-02 15:21:52

标签: javascript return-value nan return-type

我读到有时候&&运算符用于“短路”JavaScript,认为返回值0为0而不是NaN,因为0是JavaScript中的错误数字。我一直在四处寻找这一切意味着什么。有人可以向外行解释吗?

例如:

function sign(number) {    
    return number && number / Math.abs(number); }

如果number为0,则返回0。

3 个答案:

答案 0 :(得分:6)

这听起来像我之前看到的答案,但现在找不到(链接会有所帮助),但你在这里得到了错误的结局。

鉴于以下情况:

foo = 0 ;
bar = foo && 2 / foo;

在第二行,将评估foo。它是0,因此是假值。 &&foo)的左侧将被退回并分配给bar

现在,如果我们有foo = 1

foo = 1 ;
bar = foo && 2 / foo;

同样,将评估foo。这是一个真正的值,因此&&的右侧将被评估并返回。 2 / foo2,因此2已分配给bar

“短路”只是意味着只要&&的一部分失败,它就会返回失败的部分,而不会向右边评估任何内容。

答案 1 :(得分:4)

在JavaScript中,布尔运算符&&||不一定返回布尔值。相反,他们会看到他们论点的“真实性”,并可能因此而短路。某些值如0,空字符串""null都是“假的”。

短路只是意味着跳过表达式右侧的评估,因为左侧足以提供答案。

例如:var result = 100 / number;之类的表达式会在NaN时为您提供number = 0,但是:

var result = number && 100 / number;

由于0是假的,因此会向您NaN而不是0。在布尔上下文中false && anythingfalse,因此评估右侧没有意义。类似地:

// supposed msg is a potentially empty string
var message = msg || "No message";

如果字符msg不为空(真实),则会msg,因为true || anythingtrue。如果msg 为空,则会显示"No message instead"

答案 2 :(得分:1)

我想我理解你的意思,然而,事实并非如此。

var some_bool = (func_a() && func_b());

现在,当func_a返回false时,func_b确实没有被调用。但是,当它返回NaN(就像0,等于false)时,它仍然返回false!