当使用序号访问不存在的密钥时,如何转义错误



下面代码的结果是Cat且未定义。*如果密钥不存在,则结果将是"不存在";未定义";。

var animals = {"mammals":["Cat","Dog","Cow"]};
var groupA  = animals.mammals[0];
var groupB  = animals.birds;
console.log(groupA );
console.log(groupB);

然而,下面代码的结果是";错误";而不是";未定义";。

*未捕获的类型错误:无法读取未定义(读取"0")的属性

var animals = {
"mammals": ["Cat", "Dog", "Cow"]
};
var groupA = animals.mammals[0];
var groupB = animals.birds[0];
console.log(groupA);
console.log(groupB);

如果键有一个不存在的序数;未定义的"?

您可以使用可选的链接

可选的链接运算符(?.)使您能够读取位于连接对象链深处的属性的值,而无需检查链中的每个引用是否有效。

var animals = {
"mammals": ["Cat", "Dog", "Cow"]
};
var groupA = animals.mammals?.[0];
var groupB = animals.birds?.[0];
console.log(groupA);
console.log(groupB);

您需要首先评估属性,请参阅以下内容:

var animals = {"mammals":["Cat","Dog","Cow"]};
var groupA  = animals.mammals[0];
var groupB  = (animals.birds || [])[0];

您可以检查属性并使用三进制显式设置该值:

var animals = {
"mammals": ["Cat", "Dog", "Cow"]
};
var groupA = animals.mammals ? animals.mammals[0] : undefined;
var groupB = animals.birds ? animals.birds[0] : undefined;
console.log(groupA);
console.log(groupB);

在第二种情况下:birds本身在对象动物上是未定义的。未定义的重音属性引发错误。

这就像做undefined[0]。使用可选的链接

var animals = {
"mammals": ["Cat", "Dog", "Cow"]
};
var groupA = animals.mammals?.[0];
var groupB = animals.birds?.[0];
console.log(groupA);
console.log(groupB);

使用try。。。catch块来捕获异常并根据需要进行处理(围绕任何您认为可能引发错误的内容):

const animals = {
"mammals": ["Cat", "Dog", "Cow"]
};
let groupA, groupB, groupC;
groupA = animals.mammals[0];
groupB = animals.birds;
try {
groupC = animals.birds[0];
} catch (error) {
console.error(
"'animals.birds' is undefined, so we cannot access property '0'."
);
}
console.log(groupA);
console.log(groupB);
console.log(groupC);

最新更新