JavaScript中类似于Python的KeyError异常的对应方法是什么?

13
我正在尝试访问JavaScript对象中的某个成员。为此,我需要尝试几个键值。
例如,Object ['text / html'] 将为我提供HTML文档的导出链接。然而,并非每种类型的对象都具有text/html 键值对。
在Python中,我会使用Try-Catch块解决这个问题,带有异常。如果在JavaScript中可以做类似的事情,例如在Try-Catch块中使用异常,那将是很好的。
但是,如果存在替代方法,而不是Try-Catch块,以实现相同的最终目标,我也想了解它们。
编辑:
我更喜欢使用异常而不是函数。我之所以这样做,是因为可能没有text/html键,但它应该在那里。在这种情况下,异常似乎更合适。

3
在 JavaScript 中,如果缺少键(key),则会返回 undefined,但不会抛出错误。 - Ashwini Chaudhary
3
相关链接:https://dev59.com/ZnNA5IYBdhLWcg3wF5qO#1098955 - Ashwini Chaudhary
@Pointy 好的,那提供了一种做事情的方式,但我能用异常吗? - Games Brainiac
1
@GamesBrainiac 我认为 JavaScript 不喜欢EAFP方法,那么你为什么想要一个异常呢? - Ashwini Chaudhary
@hcwhsa 主要是因为它确实是一个异常情况。关键字应该在那里,但实际上并没有。这种情况很可能发生。因此,我认为在这种情况下使用异常更加合适。 - Games Brainiac
显示剩余4条评论
2个回答

19
JavaScript在读取或写入不存在的属性时不会生成异常。在读取未定义属性时,它只返回undefined。在写入未定义属性时,它只创建该属性。
你可以创建自己的函数来测试属性是否存在,如果不存在,则抛出异常(但你必须每次调用该函数),但JS本身不会像你所要求的那样产生异常。
如果你想测试javascript对象中的一个键是否存在,你可以使用以下结构和in运算符:
var obj = {};
var key = "test";

if (key in obj) {
    // key exists
} else {
    // key doesn't exist
}

如果您尝试读取不存在的键,则会将 undefined 作为值返回。
var obj = {};
var value = obj.test;

alert(value === undefined);

in 运算符比测试 undefined 更能告诉你键是否存在,因为 undefined 是一个合法的键值。


在许多情况下,如果您控制键具有的值,并且存在的键永远不会有 falsey 值,则还可以检查键是否具有 truthy 值:

var obj = {};
var obj.test = "hello";

if (obj.test) {
    // key exists and has a truthy value
}

如果您想确保对象本身具有该属性,而不是从其继承的任何原型,则可以执行以下操作:
var obj = {};
var obj.test = "hello";

if (obj.hasOwnProperty(test)) {
    // key exists on the object itself (not only on the prototype)
}

感谢您提供为什么不能使用异常的原因。我希望我能传达我为什么需要它的原因。此外,感谢您的答案,它已经足够满足我的需求了。 - Games Brainiac
3
7年后...这个问题可能已经被解决了...但我要补充一点,myObj.noKeyHere.noKeyHereEither会导致一个TypeError错误。 - Danny

0

请阅读!

被接受的答案是正确的,但省略了一些要点。

1)访问嵌套对象

正如评论中指出的那样,当键在对象中不存在时,Javascript返回undefined

然而,如果您需要访问对象内部的对象(或数组、函数),那么这将会出现问题。

let a = {};
let userName = 'js'
let data = a.response[userName];


因为我们试图读取一个未定义的属性,而这个属性实际上不存在,所以你会收到一个 TypeError。
VM187:2 Uncaught TypeError: Cannot read properties of undefined (reading 'js')
    at <anonymous>:2:22

2 回答问题

Python原则"先行动,后请求谅解" - 解释在JavaScript(和PHP,虽然你没有问,但是...)中实际上大部分情况下都很好用。当然,有一些差异或某些情况下差异很重要,但对于大多数使用情况来说是相同的

所以这就是你应该怎么做:

try {
    let data = a.key1.key2['whatever'].nested.damn.object;
    console.log(data)
} catch (error) {
    let data = "noope"; 
    console.log(data);

}


正如您所看到的,在Javascript中,您并不真正关心错误类型(在大多数情况下,当然还有其他情况需要考虑)。这几乎就像Python中的任何东西一样。

try:
   a = "hello" + 1 + {} + [] # crazy stuff here
except BaseException as bleh:
   print(str(bleh))

文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接