你的位置:首页 > 软件开发 > Java > [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

[Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

发布时间:2016-05-09 17:00:06
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的。为什么呢?请看《[Effective JavaScript笔记]第3条:当心隐式的强制转换》 因为这个会在比较之前对两个值都进行隐式转 ...

[Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

“1.0e0”=={valueOf:function(){return true;}}

是值是多少?

[Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

这两个完全不同的值使用==运算符是相等的。为什么呢?请看《[Effective JavaScript笔记]第3条:当心隐式的强制转换》

因为这个会在比较之前对两个值都进行隐式转换。字符串“1.0e0”被解析成1,而{valueOf:function(){return true;}}会通过调用自身的valueOf进行转化得到true,然后再转化为数字,得到1;

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

var today=new Date();

if(form.month.value == (today.getMonth()+1)&&

    form.day.value==today.getDate()){

          //….

}

但实际上,它只是显式地使用Number函数或者一元运算符+将值转换为数字。

var today=new Date();

if(+form.month.value == (today.getMonth()+1)&&

   +form.day.value==today.getDate()){

           //….

}

上面的这段代码更清晰地传达了在做什么样的转换。

更好的方法是用严格相等运算符

var today=new Date();

if(+form.month.value === (today.getMonth()+1)&&

   +form.day.value===today.getDate()){

         //….

}

注:当两个参数属于同一类型时,==和===没有区别。最好是用严格相等运算符===,可以清晰表达比较,并不涉及到转换。

==运算符针对不同类型参数的强制转换规则:

  • 1、null  ==    undefined     说明:不转换总是返回true
  • 2、null或undefined  ==   其他任何非null或undefined的类型   说明:不转换,总是返回false
  • 3、原始类型:string、number或boolean ==  Date对象  说明:将原始类型转换为数字,将Date对象转换为原始类型(优先尝试toString方法,再尝试valueOf方法)
  • 4、原始类型:string、number或boolean ==  非Date对象   说明: 将原始类型转换为数字,将非Date对象转换为原始类型(优先尝试valueOf方法,再尝试toString方法)
  • 5、原始类型:string、number或boolean ==  原始类型:string、number或boolean   说明:将原始类型转换为数字

==运算符将数据以不同的表现呈现出来,但计算机并不能真正地了解你的选择,因为有太多的数据表现形式,js需要知道你使用的是哪种。

例如:

[Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

这里的date转换成了“Mon May 09 2016 00:00:00 GMT+0800 (中国标准时间)”这种格式。

==不能推断和统一所有的数据格式。它需要你理解其微妙的强制转换规则。最好的策略是显式自定义应用程序转换的逻辑,并使用严格相等运算符===

function toYMD(date){

原标题:[Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

关键词:JavaScript

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。