美文网首页
5.避免对混合类型使用 == 运算符

5.避免对混合类型使用 == 运算符

作者: Somnusochi | 来源:发表于2017-12-12 17:11 被阅读0次
"1.0e0" == { valueOf:function() { return true; } }; // true

在比较之前它们都被转换为数字,字符串"1.0e0"被解析为数字1,而匿名对象也通过调用自身的valueOf方法得到结果true,然后再转换为数字,得到1。
很容易使用这些强制转换完成一些工作。

var today = new Date();
if (form.month.value == (today.getMonth() + 1) && form.day.value == today.getDate()){
  // happy birthday!
  // ...
}
// 等效于
var today = new Date();
if (+form.month.value == (today.getMonth() + 1) && +form.day.value == today.getDate()){
  // happy birthday!
  // ...
}
// 等效于
var today = new Date();
if (+form.month.value == (today.getMonth() + 1) && +form.day.value == today.getDate()){
  // happy birthday!
  // ...
}
// 当两个参数属于同一类型时,==和===运算符的行为是没有区别的,如果参数属于同一类型,那么==和===运算符可以互换,但最好使用严格相等运算符。

== 运算符的强制转换规则

参数类型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 将原始类型转换为数字

== 运算符并不能推断和统一所有的数据格式

var date = new Date("2017/12/12");
data == "2017/12/12"; // false
date.toString(); // "Tue Dec 12 2017 00:00:00 GMT+0800 (CST)"

更好的策略是显式自定义应用程序转换的逻辑,并使用严格相等运算符

function toYMD(date) {
 var y = date.getYear() + 1900, // 年从1900开始计数
      m = date.getMonth() + 1, // 月从0开始计数
       d = date.getDate();
 return y + "/" + (m < 10 ? "0" + m : m) + "/" + (d < 10 ? "0" + d : d); 
}
toYMD(date) === "2017/12/12"; // true
// 显式地定义转换的逻辑能确保你不会混淆 == 运算符的强制转换规则,而且免除了读者不得不查找或记住这些规则的麻烦。

提示

  • 当参数类型不同时,== 运算符应用了一套难以理解的隐式强制转换规则。
  • 使用 === 运算符,使读者不需要涉及任何隐式强制转换就能明白你的比较运算。
  • 当比较不同类型的值时,使用你自己的显式强制转换使程序的行为更清晰。

相关文章

  • 5.避免对混合类型使用 == 运算符

    在比较之前它们都被转换为数字,字符串"1.0e0"被解析为数字1,而匿名对象也通过调用自身的valueOf方法得到...

  • sizeof 运算符和size_t 类型

    sizeof运算符 sizeof运算符可以计算出指定类型的变量所占用的字节数, 应当对 类型名称变量数组 使用 s...

  • 运算符

    2.实例 3.赋值运算符 4.比较运算符 5.三元运算符格式:数据类型 X ? Y : Z; 6.逻辑运算符 ~...

  • 多态中的引用类型转换

    .instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。 A instanceof B,A是...

  • Dart知识点汇总

    1.数据类型 2.字符串类型 3.list集合类型 4.map类型 5.类型判断 6.布尔类型 7.运算符 条件判...

  • JavaScript的typeof运算符的可能结果有哪些?

    typeof运算符用来检测给定变量的数据类型。对一个值使用typeof运算符可能的返回值有: "undefined...

  • 1213学习总结

    1.类型转化: 2.位运算符 3.赋值操作符 4.逻辑运算符和条件运算符 5.运算符优先级 6.C语言的三大结构

  • 看看sass和less会遇到的问题吧

    sass的混合指令 mixin 混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比...

  • JS 运算符技巧

    【本文会持续更新!】 1. 转换成数字 + 运算符 使用 +运算符可以把其他类型转换成数字类型,但在使用时要注意表...

  • 运算符重载与友元函数

    运算符重载 C++允许将运算符重载到用户定义的类型,例如,使用+将两个类对象相加。 重载运算符要使用运算符函数: ...

网友评论

      本文标题:5.避免对混合类型使用 == 运算符

      本文链接:https://www.haomeiwen.com/subject/beigixtx.html