[英]Javascript get value from array at index while avoiding undefined if index does not exist?
来自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的最佳或通用做法? 在这种访问数组的特定情况下,避免设置未定义内容的最佳方法是什么?
您可以in
运算符 operator中使用它,该运算符使用条件(三元)运算符?:
检查对象/数组中是否存在属性?:
值或默认值。
这种方法还可以保存虚假的值。
const b = 0 in aa ? a[0] : <something other than undefined>;
您所看到的基本上是一个设计决策。 这就是JavaScript的工作方式。 例如,PHP在某种意义上类似,即访问不存在的索引是警告而不是硬错误。 可能还有其他以这种方式表现的语言示例。
为了解决这个问题:
确实,一种常见的方法是使用b = a[0] || "default"
但是, 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);
JavaScript执行与其他编程语言几乎没有什么不同。 JavaScript不会创建由C,Java之类的语言创建的中间代码(例如,字节代码)。 Javascript的第一阶段是声明阶段,在此阶段,变量在各自的范围内定义。 默认范围是全局范围。 每个函数在javascript中创建自己的范围。
var a = 10;
因此,在第一阶段 ,它将在全局范围内定义“ a”。 请注意,它不会使用值10对其进行初始化。 下一个阶段是初始化阶段,其中将值10分配给变量'a'。 如果没有声明a的任何值,它将被初始化为'undefined' 。
最后,您必须记住,这只是JavaScript的方式。
在将来的JavaScript版本中(当前日期为7/16/18),可以使用无效合并:
代替:
value != null ? value : 'default value';
要么:
value || 'default value'
(在第二个解决方案中,数字零,布尔值false和空字符串都被视为false。非常危险。)
现在我们可以做:
value ?? 'default value';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.