return String vs Integer vs undefined vs null

时间:2011-12-20 15:50:01

标签: javascript

为什么javascript更喜欢在任何其他选择中返回String

请考虑以下代码段。

var arr = ['Hello1', 'Hello2', 'Hello3'];

Array.prototype.item = function(x) {
   return this[x] || null || 'aïe' || 12 || undefined ;
};

console.log( arr.item(43) ); // returns aïe

我故意调用了一个不存在的数组元素。

但我无法理解为什么arr.item(43)会返回String?为什么不nullundefined甚至12

6 个答案:

答案 0 :(得分:25)

因为this[x]undefined,这是假的,所以null

||运算符返回它找到的第一个“truthy”值,并在此时停止其评估。

如果未找到“truthy”值,则返回上次评估的操作数的结果。

总共有6个“假”值。他们是......

  1. false
  2. undefined
  3. null
  4. ""
  5. NaN
  6. 0
  7. Everything else被认为是真实的。

    因此,您的表达式将被评估为......

    //   v--falsey            v--truthy! return it!
    ((((this[x] || null) || 'aïe') || 12) || undefined);
    //               ^--falsey         ^--------^---these are not evaluated at all
    

    或者你可以这样看:

    (
      (
        (
          (this[x] || null) // return null
                /* (null */ || 'aïe') // return 'aïe' and stop evaluating
                                    || 12) 
                                          || undefined);
    

答案 1 :(得分:5)

声明

return this[x] || null || 'aïe' || 12 || undefined ;

将从左到右评估子表达式,并将返回未评估为 false 的第一个子表达式。不存在的元素根据定义评估为 false ,因为它未定义,null false 。这使得字符串成为第一个非 false 子表达式,这就是你得到的。

答案 2 :(得分:3)

代码a || b大致相当于a ? a : b,或者这个稍微冗长的代码:

if (a) {
    result = a;
} else {
    result = b;
}

由于||left-associative,表达式a || b || c的评估结果为(a || b) || c


因此,简单来说,这意味着链接时||运算符会返回第一个“truthy”操作数,或者是最后一个元素。

当您缺少值时,此功能可用于提供默认值:

var result = f() || g() || defaultValue;

您可以将其读作:获取f()的结果。如果它是一个假值,那么尝试g()。如果这也给出了假值,则使用defaultValue

答案 3 :(得分:1)

字符串是or或链中的第一个truthy值。 Simples

答案 4 :(得分:1)

因为它是按从左到右的顺序进行评估。

如果您要修改为:

return this[x] || null || 12 || 'aïe' || undefined ;

你的回答是12。

答案 5 :(得分:0)

return this[x] || null || 'aïe' || 12 || undefined不会返回其中一个。它应该返回表达式this[x] || null || 'aïe' || 12 || undefined的结果 - 我相信它将返回一个布尔值。