来自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的最佳或通用做法?在这种访问数组的特定情况下,避免设置未定义内容的最佳方法是什么?
答案 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';