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

时间:2014-05-24 00:29:33

标签: javascript

我有一个参数_parameter的函数。理想情况下,我希望它能够包含一个或多个不同的JSON格式值,而不需要它们全部存在。我构建了一系列条件来检查这个,下面是集合中的一个片段,因为这个(及其原型)抛出了下面的错误。 如何查看_parameters["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);
}

但是,这两个都返回以下错误,并且没有看到alert()菜单:

"Uncaught TypeError: Cannot read property 'area' of undefined"

这会抛出相同的错误,但会优雅地解析:

try {
   _parameters["location"]["area"]; 
} catch (e) {
    alert(e);
}

修改 为清楚起见,以下是_parameter可能包含的一些选项,以及我试图制作的结构概念:

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"]
};

2 个答案:

答案 0 :(得分:2)

应该能够通过简单检查为它添加前缀,以查看是否设置了_parameters["location"]

this.area = (_parameters["location"] && typeof _parameters["location"]["area"] !== 'undefined') ? _parameters["location"]["area"] : this.location["area"];

虽然这可以缩短为:

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

由于undefined属性在条件数中评估为false

答案 1 :(得分:2)

在检查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;