比如有对象:
var a = {
b:{
c:{
d:{
}
}
}
}
使用的时候比如
var param = a.b.c.d;
但是一旦其中c或者d不存在就会报错。
一般的方式是逐层检查,但是代码很不优雅。
有什么更好的方式呢?
如果服务端给你的是像你描述的那样多层的数据结构,先问他一句:“非得这样吗?”
开发之前沟通充分,确定合理的数据结构,对于提高效率有事半功倍的作用。
在现实应用中,不能保证永远都能拿到“舒服”的数据结构,所以前端代码上也要想办法处理。以下是一些建议,供参考。
a.b.c
这种方式访问对象的属性,这样的方式有这样几个缺点:最最主要的缺点:过多的使用这种方式会导致代码的混乱。因为 JavaScript 里对象的属性大多是可以“随时随地”读写的,所以在对属性进行赋值操作时,应该格外慎重。稍有不慎,很可能会出现在一处修改了某属性的值,导致“很远”的另一处使用到了这个属性的代码出错。一旦这样的代码体积庞大起来,维护的难度就蹭蹭蹭像火箭一样往上升。
性能问题:每次访问 a.b.c
时,引擎都要先检查这几件事:a 是否存在 => a 是否对象 => a.b 是否存在 => a.b 是否对象 => a.b.c 是否存在
,如果以上都为真,才会对 a.b.c
进行操作。尽管以现在的计算机的计算能力,这带来的性能损失可能并不明显,但毕竟是对计算资源的浪费。建议的做法是在闭包内为 a.b
创建引用,然后通过引用来访问 a.b.c
。
下面是一个简单的示例:
http://jsbin.com/lipeguvese/3/edit?js,console
直接把代码贴下面,方便大家批评修改:
var Factory = function(data){
this.initialize(data);
};
Factory.prototype = {
initialize: function(data){
this.data = data;
this.setup();
},
setup: function(){
var data = this.data,
a = data.a,
d = data.d,
e = data.e;
// 把 data.a 属性交给 handleA 处理
this.handleA(data.a);
// 对 data 的其他属性的处理
d.push(4);
d = d.slice(1);
e = e.toUpperCase();
data.e = e;
},
handleA: function(a){
// 把 a.b 交给 handleB 处理
this.handleB(a.b);
// 对 a 的其他属性的处理
// ...
},
handleB: function(b){
// 把 b.c 交给 handleC 处理
this.handleC(b.c);
// 对 b 的其他属性的处理
// ...
},
handleC: function(c){
data.c = c + 100;
},
output: function(){
console.log(this.data);
}
};
// 假设约定的数据格式如下
var data = {
a: {
b: {
c: 111
}
},
d: [1,2,3],
e: 'string property value'
};
// 处理数据
var f = new Factory(data);
f.output();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。