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判断时,括号内的值进行类型转换,转化为 ...
随机推荐
- 360浏览器内核控制标签meta说明
浏览器内核控制标签meta说明 背景介绍 由于众所周知的原因,国内的主流浏览器都是双核浏览器:基于Webkit的内核用于常用网站的高速浏览,基于IE的内核主要用于部分网银.政府.办公系统等网站的正常使 ...
- Python爬虫--- 1.1请求库的安装与使用
来说先说爬虫的原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来.这个时候就要用到请 ...
- recommendation baselines
整理recommendation baseline 的实现代码和方法归类: bpr: https://github.com/gamboviol/bpr fpmc: https://github.c ...
- restful课程凌杂知识点
request.post:字典形式数据 request.body:收到的是源数据
- python numpy+mkl+scipy win64 安装
用pip在windows下安装numpy,scipy等库时一般来说都不会很顺利比较好的方式是自己下载对应的whl文件pip install 话不多说上链接 http://www.lfd.uci.edu ...
- pt-mysql-summary
pt-mysql-summary主要用来输出MySQL的基本信息,可以作为数据库巡检以及刚开始熟悉数据库环境时候进行使用: [root@mxqmongodb2 bin]# ./pt-mysql-sum ...
- Redis的系统级命令
文章建立一个统一的认识就是Redis的版本是3.2.8 1:BGREWRITEAOF(bgrewriteaof) 执行一个 AOF文件 重写操作.重写会创建一个当前 AOF 文件的体积优化版本. 即使 ...
- 让NSUserDefaults使用起来像对象一样容易
让NSUserDefaults使用起来像对象一样容易 巧妙的设计,是为了简化开发提升效率而存在. 设计要点: 1. 单例模式 2. 重写setter,getter方法 3. 专门的类来管理单例 使用时 ...
- windows server 2003安装Oracle webtier 32位因环境变量原因报错
在服务中启动Oracle processer manager时报错:错误1053:服务没有及时响应启动或控制请求 原因是本系统还安装过BI和Oracle数据库等产品 解决方法:删除和本次安装无关的环境 ...
- Oracle 时段负载情况
ALTER session SET nls_date_format='yyyy-mm-dd hh24:mi:ss'; SELECT * FROM ( SELECT A.INSTANCE_NUMBER ...