首页 新闻 赞助 找找看

javascript代码的小小疑问(49)

0
[已解决问题] 解决于 2015-09-30 06:41

“... ...尝试检索一个undefined值会导致TypeError异常。这可以通过&&运算符来避免错误。例如:查询是否有c属性,不应该直接查找a.b.c而是a.b&&a.b.c... ...

 

如何理解上面这句话?

Coca-code的主页 Coca-code | 初学一级 | 园豆:10
提问于:2015-09-29 17:42
< >
分享
最佳答案
0

关于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。

奖励园豆:5
clearbug | 菜鸟二级 |园豆:268 | 2015-09-30 00:02

感谢释疑,把分给你了。

但还有点疑问:

var d = a&&b;//d=555

可以是:var d = a&&b;//d=333   吗?

Coca-code | 园豆:10 (初学一级) | 2015-09-30 06:44

@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 | 园豆:268 (菜鸟二级) | 2015-09-30 08:07

@clearbug: 你的答案完美回答了我的问题。

希望以后在js方面多多帮助。

Coca-code | 园豆:10 (初学一级) | 2015-09-30 09:39

@Coca-code: 博客园气氛挺好的,我也很菜的,以后互相学习啦!

clearbug | 园豆:268 (菜鸟二级) | 2015-09-30 09:43

@Coca-code: 关于js我最近写过几篇基础的博客,最近还在写,欢迎来拍砖点评哈

clearbug | 园豆:268 (菜鸟二级) | 2015-09-30 09:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册