JS中的“==”与强制类型转换

JavaScript中有“==”与“===”,那么他们有何区别呢?

对于基本数据类型, ===  (!==)只有当两个变量的类型和值都相等时,才返回true;而 == (!=)则会对变量进行强制类型转换,只要转换后的值相等,则换回true。

下面结合代码讲一下在转换不同的数据类型时,相等 == 和不相等 != 操作符遵循的强制转型基本规则

1. 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值:false转换为0,而true转换为1;

false == 0   //true
true == 1   //true
true == 3   //false

2. 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

"123" == 123   //true

3. 如果一个操作数是对象,另一个操作数不是,则调用对象的valueof ()方法,用得到的基本类型值按照前面的规则进行比较;

var a = [ 1 , 2 , 3 ]
alert(a == "1,2,3")   //true, a.valueOf()为"1,2,3"

需要注意的是:

a. null和undefined是相等的,null和undefined不能转换成其他任何值;

null == undefined   //true
undefined == 0   //false
null == 0   //false
undefined == false   //false
null == false   //false

b. 如果有一个操作数是NaN,则相等操作符 == 返回false,而不相等操作符 != 返回true。

tips:即使两个操作数都是NaN,相等操作符 == 也返回false;因为按照规则, NaN不等于NaN。

NaN == NaN   //false
NaN != NaN   //true
NaN == 0   //false

c. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true;否则,返回false。

var obj = new Object()
var obj1 = new Object()
var obj2 = obj
alert(obj == obj1) //false
alert(obj == obj2) //true
alert(obj === obj1) //false

那么除此之外,还有什么情况下JS代码需要对变量进行强制转型呢?

  1. 字符串拼接时:

var a = 1 + 1   // 2
var b = 1 + "1"   //11

  2. if语句判断时:

if(100){
    alert(100)   //会执行
}
if(!0){
    alert(0)   //不会执行
}
if(!null){
    alert(null)   //不会执行
}
if(!undefined){
    alert(undefined)   //不会执行
}

  3. 逻辑运算符

alert(100 && 0)   //0
alert(‘‘ || ‘ab‘)   //‘ab‘
alert(!0)   //true
alert(!!100)   //true

  PS: && (逻辑与)和 || 这两逻辑运算符不一定返回布尔值,且都遵循着短路原则。明天单独写一篇随笔好了~

那么我们什么时候使用 == 什么时候使用 === 呢?

  答:由于相等 == 和不相等操作符!= 存在类型转换的问题,为了保持代码中数据类型的完整性,红宝书推荐我们尽量使用全等 === 和不全等 != 操作符。而JQuery中有一种这样的写法:

if(obj.a == null){
    //相当于 obj.a === null || obj.a === undefined的简写形式
}

除此之外,我们全部使用 ===。

如有错误,欢迎指出探讨。

原文地址:https://www.cnblogs.com/YiNongLee/p/9261153.html

时间: 2025-01-10 19:21:16

JS中的“==”与强制类型转换的相关文章

关于JS中涉及的常用类型转换及运算符表达式

JS中的常用类型转换(一般用强制转换):1.强制转为整数:parseInt:写法:x = parseInt(x); 2.强制转换位小为:parseFloat:写法:x = parseFloat(x); 3.检测类型:x = parseInt(x);       alert(typeof(true)); JS中常用的运算符表达式:1.逻辑运算符(布尔型):&& 并 :|| 或 :! 非 : 2.比较运算符:==(等于) :!=(不等于) : > :< :>=(大于等于) :

C++中4种强制类型转换

不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类

C++中四种强制类型转换的区别

使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast和const_cast.1.static_cast    用法:static_cast<type_id> (expression)    该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法:    (1)用于类层次结构中基类和派生类之间指针或引用的转换    进行上行转换(把派生类的指针或引用转换成基类表示)是安全的 

C++中四种强制类型转换方式

类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序

js中Math()函数&amp;&amp;数据类型转换

Math()函数: x的y次方:Math.pow(x,y) 取小数点后两位:num.toFixed(2) 数据类型转换: 字符串转换为数字:parseInt(num)转换为整数:parseFloat(num)转换为浮点数:

小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则

小猪猪逆袭成博士之C++基础篇(一) 关键词: 数据精度.强制类型转换.变量命名规则 综述: 1.大多数编程语言通过两种方式来进一步补充其特征:一是赋予程序员自定义数据类型的权利(C++中的类):二是讲一些有用的功能封装成库函数提供给程序员使用(C++提供的函数和标准库). 2.C++是一种静态数据类型语言,他的类型检查发生在编译时,而另外一些语言例如Python是在运行时检查数据类型的. 基础篇主要分为六个部分,通过这六个部分我们将了解C++的基本知识.通过这些基本语法知识就足够在OJ平台上A

Js中的假值_ES5中定义的ToBoolean方法强制类型转换后值为false

你不知道的Javascript(中)--ToBoolean javascript中的值可以分为以下两类: 1.可以被强制类型转换为false的值 2.其他(被强制类型转换为true的值) 假值---以下是js的ES规范中定义了的假值: undefined null false +0.-0和NaN ""-空字符串 假值的不二强制类型转换结果为false.一般除假值以外的都是真值. 假值对象--封装了假值的对象 eg: var a=new Boolean(false); var b=new

JS在if中的强制类型转换

这个属于很基础了,但是却很有用,需要的补个坑吧: JS在很多情况下会进行强制类型转换,其中,最常见两种是: 1.使用非严格相等进行比较,对==左边的值进行类型转换: 2.在if判断时,括号内的值进行类型转换,转化为布尔值: 强制转换为false的四种情况 在if中进行强制转换为false的情况只有四种,分别是: 1.数字0 2.NaN 3.空字符串 4.null或undefined But:这里存在2中特殊情况,数组和对象(因为,在上述条件下恒为true),改如何判断呢? 其实也简单:前者arr

JS中的强制类型转换

<script type="text/javascript">   /*    * 强制类型转换    * 指的是将一个数据类型强制转换为其他的数据类型    * 类型转换主要指,将其他的数据类型,转换为String,Number,Boolean    *     */      /*    * 将其他的数据类型转换为String    * 方式一:    * 调用被转换数据类型的tostring()方法    * 该方法不会影响原变量,它会将转换的结果返回    * 但是