Javascript从索引处的数组获取值,同时如果索引不存在则避免未定义?

时间:2018-07-13 06:21:38

标签: javascript arrays types error-handling undefined

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

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

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

在Python中,我可以做类似的事情:

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

b永远不能设置为undefined,这将防止以后发生潜在的奇怪事件。我用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中,有没有避免将某些内容设置为undefined的最佳或通用做法?在这种访问数组的特定情况下,避免设置未定义内容的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

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

此方法还可以保存falsy个值。

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

答案 1 :(得分:1)

您看到的基本上是设计决定。这就是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);

答案 2 :(得分:1)

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

var a = 10;

因此,在第一阶段中,它将在全局范围内定义“ a”。请注意,它不会使用值10对其进行初始化。下一阶段是初始化阶段,其中将值10分配给变量'a'。如果未声明a的任何值,它将被初始化为 'undefined'

最后,您必须记住它只是JavaScript的方式。

答案 3 :(得分:0)

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

代替:

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

或者:

value || 'default value'

(在第二个解决方案中,数字零,布尔值false和空字符串都被视为false。非常危险。)

现在我们可以做到:

value ?? 'default value';

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