考虑以下company
对象:
var employee = {
empID: 45435,
salary: 44000,
title: "Janitor",
firstName: "Richard",
lastName: "Stallman"
}
var department = {
name: "Maintenance",
building: "H",
room: 404,
departmentLead: employee
}
var company = {
name: "Bluth's Original Frozen Banana Stand",
revenue: 'always',
maintenanceDept: department
}
如果我想访问该对象的title
属性,则employee
可以通过以下方式引用它:
var title = company.maintenanceDept.departmentLead.title;
但是,如果departmentLead
为undefined
,TypeError
则会抛出a。因此,在访问之前,我必须编写一个测试title
:
if(company &&
company.maintenanceDept &&
company.maintenanceDept.departmentLead &&
company.maintenanceDept.departmentLead.title){ ... }
这是最好的方法吗?显然,此示例是人为设计的,因为我company
在使用它之前就已对其进行了定义,所以我知道它是title
存在的。对于company
从AJAX调用返回的对象,不能说相同的话。一个解决方案我一直在使用一直以:
// Edit: I've been informed adding properties to Object.prototype is not a smart thing to do...so don't do this
Object.prototype.propertyWithPath = function (path) {
var keys = path.split('.');
var parent = this;
var child;
for (var i = 0; i < keys.length; i++) {
child = keys[i];
if (parent[child] === undefined) {
return undefined;
}
parent = parent[child];
}
return parent;
};
除了性能下降外,使用这种方法与替代方法相比还有其他缺点吗?
您可以选择进行内联测试,也可以使用与显示的功能相似的功能。(但请参见以下问题的评论:切勿在上添加可枚举的属性Object.prototype
。请改用非原型函数。)
请注意,测试不一定是if
,您可以执行以下操作:
var title = company &&
company.maintenanceDept &&
company.maintenanceDept.departmentLead &&
company.maintenanceDept.departmentLead.title;
title
undefined
因为JavaScript的&&
运算符非常强大,所以它要么是(或另一个falsey值),要么是标题:如果左侧的值为falsey,则返回该值;否则为false。否则,它返回右侧的值。它并不总是返回true
或false
因为它会在许多其他语言。所以5 && 7
是7
; 0 && 7
是0
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句