首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议82:不要直接检索对象属性值

关灯直达底部

检索对象中包含的值有两种形式。

❑当属性名为任意字符形式,或者无法确定属性名时,采用在后缀中括住一个字符串表达式的方式。采用这种方式比较安全,例如:


obj["first-name"]


❑如果字符串表达式是一个常数,并是一个合法的JavaScript标识符而并非保留字,那么也可以用点(.)表示法代替。优先考虑使用点表示法,因为它更紧凑且可读性更好,例如:


obj.obj_1.Obj_2


注意,如果尝试检索一个并不存在的成员元素的值,将返回一个undefined值,例如:


obj["middle-name"];//undefined

obj.middle_name;//undefined

obj["FIRST-NAME"];//undefined


读者可以使用||运算符为对象属性设置默认值,当对象属性值未定义时,以默认值进行传递,例如:


var middle=obj["middle-name"]||"(none)";

var status=obj.status||"unknown";


由于JavaScript在检索一个undefined值时将会导致TypeError异常,所以建议读者不要直接检索对象属性值。为了稳妥起见,不妨考虑通过&&运算符来避免此类错误,例如:


obj.obj_1;//undefined

obj.obj_1.model;//抛出"TypeError"异常

obj.obj_1&&obj.obj_1.model;//undefined


在上面代码中,先检索obj.obj_1是否存在,如果存在,则进一步检索obj.obj_1包含的属性值。如果直接去读取obj.obj_1.model属性值,那么有可能会发生异常。