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 //
var b = 1 + "1" //
2. if语句判断时:
if(100){
alert(100) //会执行
}
if(!0){
alert(0) //不会执行
}
if(!null){
alert(null) //不会执行
}
if(!undefined){
alert(undefined) //不会执行
}
3. 逻辑运算符
alert(100 && 0) //
alert('' || 'ab') //'ab'
alert(!0) //true
alert(!!100) //true
PS: && (逻辑与)和 || 这两逻辑运算符不一定返回布尔值,且都遵循着短路原则。明天单独写一篇随笔好了~
那么我们什么时候使用 == 什么时候使用 === 呢?
答:由于相等 == 和不相等操作符!= 存在类型转换的问题,为了保持代码中数据类型的完整性,红宝书推荐我们尽量使用全等 === 和不全等 != 操作符。而JQuery中有一种这样的写法:
if(obj.a == null){
//相当于 obj.a === null || obj.a === undefined的简写形式
}
除此之外,我们全部使用 ===。
如有错误,欢迎指出探讨。
JS中的“==”与强制类型转换的更多相关文章
- [转载]C++中四种强制类型转换方式
C++中四种强制类型转换方式 原文地址:http://www.cnblogs.com/home123/p/6763967.html 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单( ...
- 关于JS中涉及的常用类型转换及运算符表达式
JS中的常用类型转换(一般用强制转换):1.强制转为整数:parseInt:写法:x = parseInt(x); 2.强制转换位小为:parseFloat:写法:x = parseFloat(x); ...
- PHP:第一章——php中数据类型和强制类型转换
<?php //PHP中的数据类型: //标量类型:布尔型(boolean).整型(integer).浮点型(float).字符串型(string) //复合类型:数组(array).对象(ob ...
- C++中四种强制类型转换区别详解
C++即支持C风格的类型转换,又有自己风格的类型转换.C风格的转换格式很简单,但是有不少缺点的: 1.转换太过随意,可以在任意类型之间转换.你可以把一个指向const对象的指针转换成指向非const对 ...
- js中Math()函数&&数据类型转换
Math()函数: x的y次方:Math.pow(x,y) 取小数点后两位:num.toFixed(2) 数据类型转换: 字符串转换为数字:parseInt(num)转换为整数:parseFloat( ...
- C++中四种强制类型转换方式
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- 《You dont know JS》强制类型转换
强制类型转换 将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况.隐式的情况被称为强制类型转换 在书中,作者还提出一种区分方式: 类型转换发生在静态类型语言的编译阶段,强制类型转换发生在动 ...
- 小猪猪逆袭成博士之C++基础篇(一)数据精度、强制类型转换、变量命名规则
小猪猪逆袭成博士之C++基础篇(一) 关键词: 数据精度.强制类型转换.变量命名规则 综述: 1.大多数编程语言通过两种方式来进一步补充其特征:一是赋予程序员自定义数据类型的权利(C++中的类):二是 ...
- JS在if中的强制类型转换
JS在if中的强制类型转换 众所周知,JS在很多情况下会进行强制类型转换,其中,最常见两种是: 1.使用非严格相等进行比较,对==左边的值进行类型转换 2.在if判断时,括号内的值进行类型转换,转化为 ...
随机推荐
- angular之$on、$emit、$broadcast
1.$scope.$on view事件 //View被加载但是DOM树构建之前时: $scope.$on('$viewContentLoading', function(event, viewConf ...
- CentOS下调整home和根分区大小
由于我们有时候没法预估或者说错误的盘符分区的时候,常常会导致我们后面的操作出现极大的不方便,这里我就记录下一个错误分区后对home和根分区存储空间大小调整的整个过程! ①查看我们现有机器的分区状况 c ...
- Java中线程的实现
在Java中要想实现多线程代码有两种方法,一种是继承 Thread 类,另一种就是实现 Runnable 接口 一.继承 Thread 类 Thread 类是在 java.lang 包中定义的,一个类 ...
- Web.py报错:OSError: No socket could be created -- (('0.0.0.0', 8080):
web.py报错 Python代码: import web urls = ( '/(.*)', 'hello' ) app = web.application(urls, globals()) cla ...
- 21.拉取&删除远程分支
拉取 当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容. 它只会获取数据然后让你自己合并. 然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 ...
- deb文件怎么安装
deb 是 ubuntu .debian 的格式.rpm 是 redhat .fedora .suse 的格式.deb是debian发行版的软件包ubuntu是基于debian 发行的 所有可以用.d ...
- MVC中用NPOI导出Excel相关问题
情形1:可以直接带参数 前端页面: @.ActionLink("导出Excel", "DownLoadExcel", new { 参数名= '参数值' }, n ...
- Linux->apt-包的位置和变更
ubuntu中由apt-get获得的文件包保存在/var/cache/apt/archives: 通过apt-get命令下载的软件包,放在/var/cache/apt/archives 目录下: 下载 ...
- sqlserver根据条件生成插入语句--单表
ALTER proc [dbo].[proc_insert] (@tablename varchar(256),@where varchar(max))asbeginset nocount ondec ...
- node-7.2.1 already installed, it's just not linked
直接在terminal下运行以卸载node和nvm: sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,shar ...