读书频道 > web开发 > Javascript > Effective JavaScript:编写高质量JavaScript代码的68个有效方法
第5条:避免对混合类型使用==运算符
2013-12-07 14:06:33     我来说两句 
收藏    我要投稿   
本书共分为7章,分别涵盖JavaScript的不同主题。第1章主要讲述最基本的主题,如版本、类型转换要点、运算符注意事项和分号局限等。第2章主要讲解变量作用域,介绍此方面的一些基本概念,以及一些最佳实践经验。第  立即去当当网订购

你认为下面表达式的值是什么?

 

对这两个看似无关的值使用==运算符实际上是相等的。就像第3条描述的隐式强制转换一样, 在比较之前,它们都被转换为数字。字符串“1.0e0”被解析为数字1,而匿名对象也通过调用其自身的valueOf方法得到结果true,然后再转换为数字,得到1。

很容易使用这些强制转换完成一些工作。例如,从一个Web表单读取一个字段并与一个数字进行比较。


 

上面这段代码更加清晰,因为它向读者传达了代码到底在做什么样的转换,而不要求读者记住这些转换规则。一个更好的替代方法是使用严格相等运算符。

 

当两个参数属于同一类型时,==和===运算符的行为是没有区别的。因此,如果你知道参数属于同一类型,那么,==和===运算符可以互换。但最好使用严格相等运算符,因为读者会非常清晰地知道:在比较操作中并没有涉及任何转换。否则,你需要读者准确地记住这些强制转换规则以解读代码的行为。

事实上,这些强制转换规则一点也不明显。表1.1包含了==运算符针对不同类型参数的强制转换规则。这些规则具有对称性。例如,第一条规则既适用于null == undefined,也适用于undefined == null。在很多时候,这些转换都试图产生数字。但当它们处理对象时会变得难以捉摸。操作符试图将对象转换为原始值,可通过调用对象的valueOf和toString方法而实现。更令人难以捉摸的是,Date对象以相反的顺序尝试调用这两个方法。

表1.1 ==运算符的强制转换规则
参数类型1 参数类型2 强制转换
null undefined 不转换,总是返回true
null或undefined 其他任何非 null 或undefined的类型 不转换,总是返回false
原始类型:string、 number或boolean Date对象 将原始类型转换为数字;将Date对象转换为原始类型(优先尝试toString方法,再尝试valueOf方法)
原始类型:string、 number或boolean 非Date对象 将原始类型转换为数字;将非Date对象转换为原始类型(优先尝试valueOf方法,再尝试toString方法)
原始类型:string、number或boolean 原始类型:string、 number或boolean 将原始类型转换为数字

==运算符将数据以不同的表现呈现出来,这种纠错有时称为“照我的意思去做”(do what I mean)的语义。但计算机并不能真正地了解你的心思。世界上有太多的数据表现形式,JavaScript需要知道你使用的是哪种。例如,你可能希望你能将一个包含日期的字符串和一个Date对象进行比较。

 

这个例子失败是因为Date对象被转换成一种不同格式的字符串,而不是本例所采用的格式。

 

但是,这种错误是一个更普遍的强制转换误解的“症状”。==运算符并不能推断和统一所有的数据格式。它需要你和读者都能理解其微妙的强制转换规则。更好的策略是显式自定义应用程序转换的逻辑,并使用严格相等运算符。

 

显式地定义转换的逻辑能确保你不会混淆==运算符的强制转换规则,而且免除了读者不得不查找或记住这些规则的麻烦。

 提示

当参数类型不同时,==运算符应用了一套难以理解的隐式强制转换规则。

使用===运算符,使读者不需要涉及任何的隐式强制转换就能明白你的比较运算。

当比较不同类型的值时,使用你自己的显式强制转换使程序的行为更清晰。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:第4条:原始类型优于封装对象
下一篇:第6条:了解分号插入的局限
相关文章
图文推荐
3.12 本章小结
3.10 添加新函数
3.9 递归
3.8 闭包
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站