比如有对象:
var a = {
b:{
c:{
d:{
}
}
}
}
使用的时候比如
var param = a.b.c.d;
但是一旦其中c或者d不存在就会报错。
一般的方式是逐层检查,但是代码很不优雅。
有什么更好的方式呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
确定合理的数据结构
如果服务端给你的是像你描述的那样多层的数据结构,先问他一句:“非得这样吗?”
开发之前沟通充分,确定合理的数据结构,对于提高效率有事半功倍的作用。
不怕层级多,只要层级分明
在现实应用中,不能保证永远都能拿到“舒服”的数据结构,所以前端代码上也要想办法处理。以下是一些建议,供参考。
1. 不要频繁地跨层操作数据。
首先应该尽量避免用
a.b.c
这种方式访问对象的属性,这样的方式有这样几个缺点:a.b.c
时,引擎都要先检查这几件事:a 是否存在 => a 是否对象 => a.b 是否存在 => a.b 是否对象 => a.b.c 是否存在
,如果以上都为真,才会对a.b.c
进行操作。尽管以现在的计算机的计算能力,这带来的性能损失可能并不明显,但毕竟是对计算资源的浪费。建议的做法是在闭包内为a.b
创建引用,然后通过引用来访问a.b.c
。2. 为每一层数据设置专门的处理方法。
利用 JavaScript 面向对象的特性来编程,专门设置一个方法来处理对象的某个属性,确保其他地方在访问这个属性时,它的值一定符合某个约定的格式。
下面是一个简单的示例:
http://jsbin.com/lipeguvese/3/edit?js,console
直接把代码贴下面,方便大家批评修改:
拿我前幾天重構+擴充的辭典舉例,詞典的數據是高度層次化的,且每一層的數目不定,這時候代碼若不分層,將會成爲噩夢。
雖然我沒有像樓上那樣寫很多方法單獨處理每一層的數據,而是很瀟灑地寫了一個上百行的函數,但是由於技巧的使用,層與層之間的關係很清晰,基本獨立,也很容易重構成單獨的函數。這種寫法對於簡單的程序,或者剛開始寫的時候是再好不過了,開發效率非常高。
技巧就是:
https://github.com/bumfo/moedict-server/blob/master/index.html?ts=4
层级能少当然好。
不过再怎么约定优化,多层级依然是会出现的.作为个体可能英明神武,群体内也总有些队友要呵呵的:)。何况,网络7层协议,哪位可以帮我减少一层呢。
所以,我们还是回到问题本身好点。
a.b.c.d 直达语义核心,很好。需要担心的异常情况,既然都说异常了,直接用异常处理即可。异常是分离正常代码和错误处理的好方法(好像废话
function d_value(){
try {
return a.b.c.d;
}
catch(err) {
result = nil;
}
}
80386 就已经直接支持异常了,没必要如同c一样,亦步亦趋的去检查了。这样的if ,? 样式的错误处理,该过时了。
使用 CoffeeScript:
a?.b?.c?.d
Source
var level3 = (((test || {}).level1 || {}).level2 || {}).level3;
或
brototype