【问题标题】:Javascript get value from array at index while avoiding undefined if index does not exist?Javascript从索引处的数组中获取值,同时避免如果索引不存在未定义?
【发布时间】:2018-12-21 11:01:54
【问题描述】:

来自 Python,看到这个 JavaScript 对我来说很奇怪:

a = []
b = a[0] 
b === undefined // returns true

在 Python 中,a[0] 会引发索引错误,并且会阻止您继续操作并可能在未来遇到更多错误。 B 永远不会设置为未定义。

在 Python 中,我可以执行以下操作:

a = [1, 2, 3]
try:
    b = a[5]
except IndexError:
    print('Index out of range')

b 永远不能设置为未定义,这将防止以后发生潜在的奇怪事情。我在 JavaScript 中处理这个问题的最佳方法是什么?我倾向于尝试这样的事情:

a = []
b = a[0] || <something other than undefined>

如果 a 应该是一个对象列表,它可能是:

a = []
b = a[0] || {} // set b to empty object instead of undefined

我认为在 JavaScript 中处理这个问题的一种常见方法是进一步处理它:

a = []
b = a[0]

if (b) {
    // do something if b is defined
}

// or 

if (!b) {
    // do something if b is undefined 
}

在 JavaScript 中是否有避免将某些内容设置为未定义的最佳或常见做法?在这种访问数组的特定情况下,避免将某些内容设置为未定义的最佳方法是什么?

【问题讨论】:

  • const b = a[0] || &lt;something other than undefined&gt; 非常好,并且经常完成。 IMO 这是更简洁的方式,以避免重新分配b。 (不必要的重新分配通常是不受欢迎的)

标签: javascript arrays types error-handling undefined


【解决方案1】:

您可以使用in operator 运算符来检查对象/数组中是否存在属性,并使用conditional (ternary) operator ?: 作为值或某个默认值。

这种方法也保存了falsy 值。

const b = 0 in aa ? a[0] : <something other than undefined>;

【讨论】:

    【解决方案2】:

    您所看到的基本上是一个设计决策。这就是 JavaScript 的工作原理。例如,在访问不存在的索引是警告而不是硬错误的意义上,PHP 是相似的。可能还有其他语言示例具有这种行为。

    要解决这个问题:

    一种常见的方法确实是使用b = a[0] || "default",但是要注意具有虚假但不是未定义值的行为,例如:

    var myarray = [ 0, null, "" ];
    
    var a = myarray[0] || "default[0]";
    var b = myarray[1] || "default[1]";
    var c = myarray[2] || "default[2]";
    var d = myarray[3] || "default[3]";
    
    console.log(a, b, c, d);

    如果您想在允许使用虚假值的同时严格检查未定义,请明确:

        var myarray = [ 0, null, "" ];
    
        var a = myarray[0] !== undefined ? myarray[0] : "default[0]";
        var b = myarray[1] !== undefined ? myarray[1] : "default[1]";
        var c = myarray[2] !== undefined ? myarray[2] : "default[2]";
        var d = myarray[3] !== undefined ? myarray[3] : "default[3]";
    
        console.log(a, b, c, d);

    【讨论】:

      【解决方案3】:

      JavaScript 执行与其他编程语言略有不同。 JavaScript 不会创建像 C、Java 这样的语言创建的中间代码(例如字节码)。 Javascript 的第一个阶段是声明阶段,其中变量在各自的范围内定义。默认范围是全局范围。每个函数在 javascript 中创建自己的范围。

      var a = 10;
      

      所以在第一阶段,它将在全局范围内定义“a”。请注意,它没有用值 10 对其进行初始化。下一个阶段是初始化阶段,其中 10 的值被分配给 var 'a'。如果 a 没有声明任何值,它将被初始化为 'undefined'

      最后你必须记住,这正是 JavaScript 的工作方式。

      【讨论】:

        【解决方案4】:

        在 JavaScript 的未来版本(当前日期 7/16/18)中应该可以使用无效合并:

        代替:

        value != null ? value : 'default value';
        

        或者:

        value || 'default value'
        

        (数字零、布尔假和空字符串在第二种解决方案中都被认为是假的。非常危险。)

        现在我们可以这样做了:

        value ?? 'default value';
        

        文档:https://github.com/tc39/proposal-nullish-coalescing

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          • 2012-12-08
          • 1970-01-01
          • 2015-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多