Javascript 条件变量存在,不存在时返回错误

Javascript 条件变量存在,不存在时返回错误,javascript,Javascript,我有一个带有参数_的函数。理想情况下,我希望它能够包含一个或多个不同的JSON格式的值,而不需要它们全部存在。我构造了一系列条件来检查这一点,下面是集合中的一个片段,因为它及其原型抛出了下面的错误。我如何检查_参数[location][area]是否存在,而不抛出错误,也不使用try…catch,因为这将导致巨大的冗余 我想使用的是以下代码,或者一些变体,只要它仍然是一个三元语句: this.area = typeof _parameters["location"]["area"] !== 'u

我有一个带有参数_的函数。理想情况下,我希望它能够包含一个或多个不同的JSON格式的值,而不需要它们全部存在。我构造了一系列条件来检查这一点,下面是集合中的一个片段,因为它及其原型抛出了下面的错误。我如何检查_参数[location][area]是否存在,而不抛出错误,也不使用try…catch,因为这将导致巨大的冗余

我想使用的是以下代码,或者一些变体,只要它仍然是一个三元语句:

this.area = typeof _parameters["location"]["area"] !== 'undefined' ? _parameters["location"]["area"] : this.location["area"];
对于傻笑,我也尝试过这些:

this.area = _parameters["location"]["area"] !== undefined ? _parameters["location"]["area"] : this.location["area"];

if(_parameters["location"]["area"]) {
    alert(true);
} else {
    alert(false);
}
但是,它们都返回以下错误,并且从未看到警报菜单:

"Uncaught TypeError: Cannot read property 'area' of undefined"
这会引发相同的错误,但会优雅地解决:

try {
   _parameters["location"]["area"]; 
} catch (e) {
    alert(e);
}
编辑 为了清楚起见,这里有一些_参数可能包含的选项,以及我试图生成的结构的想法:

this.name = _parameters["name"] !== undefined ? _parameters["name"] : this.name;
this.gender = _parameters["gender"] !== undefined ? _parameters["gender"] : this.gender;
this.location = {
    area : typeof _parameters["location"]["area"] !== 'undefined' ? _parameters["location"]["area"] : this.location["area"],
    x : _parameters["location"]["x"] !== undefined ? _parameters["location"]["x"] : this.location["x"],
    y : _parameters["location"]["y"] !== undefined ? _parameters["location"]["y"] : this.location["y"]
};

应该能够通过一个简单的检查来确定是否设置了_参数[location]

虽然这可以缩短为:

this.area = (_parameters["location"] && _parameters["location"]["area"]) ? _parameters["location"]["area"] : this.location["area"];

由于未定义的属性在条件中计算为false。

应该能够通过简单的检查来确定是否设置了_参数[location]

虽然这可以缩短为:

this.area = (_parameters["location"] && _parameters["location"]["area"]) ? _parameters["location"]["area"] : this.location["area"];
因为未定义的属性在条件中计算为false。

在检查区域之前,需要检查位置。试试这个:

this.area = _parameters["location"] && _parameters["location"]["area"] ? _parameters["location"]["area"] : this.location["area"];
您还应该能够使用点符号进行财产访问:

this.area = _parameters.location && _parameters.location.area ? _parameters.location.area : this.location.area;
在检查区域之前,您需要检查位置。试试这个:

this.area = _parameters["location"] && _parameters["location"]["area"] ? _parameters["location"]["area"] : this.location["area"];
您还应该能够使用点符号进行财产访问:

this.area = _parameters.location && _parameters.location.area ? _parameters.location.area : this.location.area;

完美的谢谢有没有什么功能上的原因让我们更喜欢点符号而不是括号中的符号?它们在语义上是等价的。点表示法具有更少的语法噪音,并且是更惯用的JavaScript。如果属性名包含连字符或其他非法字符,那么数组表示法非常有用,但是点表示法更易于阅读。太好了!谢谢有没有什么功能上的原因让我们更喜欢点符号而不是括号中的符号?它们在语义上是等价的。点表示法具有更少的语法噪音,并且是更惯用的JavaScript。如果属性名称包含连字符或其他非法字符,则数组表示法非常有用,但如果不是这样,点表示法往往更易于读取。