“... ...尝试检索一个undefined值会导致TypeError异常。这可以通过&&运算符来避免错误。例如:查询是否有c属性,不应该直接查找a.b.c而是a.b&&a.b.c... ...”
如何理解上面这句话?
关于JavaScript中undefined和null的含义可以看看在下拙作:http://www.cnblogs.com/craftsman-gao/p/4537308.html。
关于JavaScript中的逻辑与(&&),可以从两个不同的层级进行理解:①当操作数都是布尔值的时候,&&对两个值执行布尔与操作;②&&可以对真值(除了后面所说的假值其他的都是真值)和假值(JavaScript中的假值有:false、null、undefined、0、-0、NaN和"")进行布尔与操作,如果两个操作数都是真值则返回第一个真值,否则,至少一个操作数是假值的话,则返回一个假值,因此&&并不总是返回true和false;下面给你举个例子吧:
var a = 333;
var b = 555;
var c = null;
var d = a&&b;//d=555
var e = a&&c;//e=null
我们通常认为&&都是返回布尔值,那是因为它们一般都是出现在条件判断的地方嘛,那种时候比如if(a&&b)因为a&&b的结果是555,555是一个真值,它转换为布尔值就是true了,假值在需要转换为布尔值时就转换为false。
感谢释疑,把分给你了。
但还有点疑问:
var d = a&&b;//d=555
可以是:var d = a&&b;//d=333 吗?
@Coca-code:var d = a&&b;这个表达式首先会计算左操作数a是否为真值,如果a为假值,那么整个表达式肯定也是假值了,所以它就不会再计算右操作数了,直接返回左操作数的值;如果a为真值,那么整个表达式的结果依赖于右操作数的值,所以这个时候就是直接返回右操作数的值了。
昨晚回得问题,貌似没有正面回答你的问题,请允许我补充一下:检测属性c的值之所以要写a.b&&a.b.c,因为要先确定对象a的属性b不是null或undefined(因为查询null或undefined的属性值就会报错啦),如果属性b是null或undefined就直接返回a.b了,不会再去查询对象b的c属性了
@clearbug: 你的答案完美回答了我的问题。
希望以后在js方面多多帮助。
@Coca-code: 博客园气氛挺好的,我也很菜的,以后互相学习啦!
@Coca-code: 关于js我最近写过几篇基础的博客,最近还在写,欢迎来拍砖点评哈