javascript中!=、!==、==、===操作符总结
JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符。
在相等运算符中对应 ===
、!==
和 ==
、!=
。
先举个栗子
var str = '1'
var num0 = 0
var num1 = 1
var blT = true
var blF = false
var nul = null
var und = undefined
console.log(str == num1) // true
console.log(str == blT) // true
console.log(blT == num1) // true
console.log(blF == num0) // true
console.log(nul == und) // true
console.log(str === num1) // false
console.log(str === blT) // false
console.log(blT === num1) // false
console.log(blF === num0) // false
console.log(nul === und) // false
相等操作符(==
)会为两个不同类型的操作数进行类型转换,然后进行严格比较。
严格相等操作符(===
),一般也叫做全等操作符。会先判断类型,再比较值是否相等。
类型转换
类型转换的途径:
类型(x) | 类型(y) | 结果 |
---|---|---|
undefined | null | true |
字符串 | 数字 | toNumber(x) == y |
布尔值 | 数字 | toNumber(x) == y |
对象 | 字符串/数字 | toPrimary(x) == y |
对于两个类型不同的操作数比较。
- 字符串、布尔值都会先转换成数字类型,再做比较。
toNumber(x)
- 对于复杂数据类型,会先将其转换为原始值,之后,再根据上一个规则比较。
x = toPrimary(obj) ==> toNumber(x)
而,如何转成原始类型值呢,一般都会自动通过自带的valueOf()
方法或者toString()
方法实现。如果转换之后非原始值,比较操作会报类型错误。
具体过程:
先执行valueOf
方法,如果该方法返回一个原始值,则将这个原始值转换为数字,并返回这个数字,转换过程结束。如果返回非原始值,继续下一步。
否则,执行toString
方法,如果该方法返回一个原始值,则将这个原始值转换为数字,并返回这个数字,转换过程结束。如果返回非原始值 ,继续下一步。
以上都没有成功转换为原始值,则抛出一个类型转换错误的异常。
tips: 每个方法只执行一次。不会将方法返回的非原始类型值继续转换。
举个例子说明下,参考于知乎:
原始数据类型(string,number,boolean,null, undefined,symbol)。
复杂数据类型(Object, Function, Array, Date, ...)
基础数据类型的比较,是值的比较,Object对象的比较,则是引用的比较
相等操作符(==
),经过类型转换之后,才比较他们的值或者对象值。
对于全等操作符(===
),等号两边的值和类型,必须完全相等。
为什么建议使用 ===
1. review代码时候,增加理解时间
在使用了 ==
的表达式中,我们需要先理解作者的意图。
- 想当然的以为都可以。
- 确实需要通过类型转换来判断。
- 不应该类型转换,但是写错了。
2. 会判断错误
let num = 2
let obj = {
valueOf: function() {
return 2
}
}
console.log(obj == 2)
输出true
,
我们本意是这两者!=
,而这里得到的结果是==
,这不是我们想要的结果。
3. 会产生异常
let num = 2
let obj = {
valueOf: function() {
return {}
},
toString: function() {
return {}
}
}
console.log(obj === 2)
console.log(obj == 2)
第一行输出:false
第二行输出错误提示:Uncaught TypeError: Cannot convert object to primitive value
通过前面类型转换,可以得知,一般情况下,对象会先转换为原始值。
而其过程是通过自带的valueOf()/toString()
先转换为primitive value,再和其他值做比较。
而在这里,我们手动将obj对象的valueOf()/toString()
覆盖了,导致无法实现转换为原始值。
一般情况下,建议使用===
,除非你了解,确实需要类型转换,才使用 ==
条件表达式语句(if、三目运算等)
if (condition) {
statement1
} else {
statement2
}
以上是if语句的基础用法。通过判断condition
的布尔值,来决定执行statement1
代码块1,还是执行statement2
代码块2。
先看下面的例子:
var s = 'str'
var blT = true
var blF = false
if (s) {
console.log('正确')
} else {
console.log('错误')
}
console.log(s == blT)
以上语句,得到的结果是
正确
false
为什么if语句,会执行第一个代码块。而s == blT
却是false呢?
其实,这个就涉及到类型转换的问题了。
输出“正确”
:
- if语句的条件表达式,会自动调用
Boolean()
转换函数,将这个表达式的结果转换为一个布尔值。 - Boolean('str') = true
输出false
:
- 根据在上面类型转换那部分所讲,会先调用
Number()
转换函数转换为数值,之后再比较。 - Number('str') = NaN
- Number(true) = 1
图表举例列出常见对象相等情况
【完】
javascript中!=、!==、==、===操作符总结的更多相关文章
- 坑:JavaScript 中 操作符“==” 和“===” 的区别
标题:JavaScript 中 操作符"==" 和"===" 的区别 记录一些很坑的区别: 1. '' == '0' // false 0 == '' // t ...
- JavaScript中+操作符的特殊性
在JavaScript中+操作符有两个作用: (1)加法运算 (2)字符串连接 在使用+操作符进行运算时,当+操作符两边都是数值类型的时候,进行加法运算; 当+操作符两边有任意一边是字符串,则进行字符 ...
- javascript中的操作符详解1
好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...
- JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...
- Javascript中void操作符
Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. void操作符用法格式如下:1.javascript:void (expression)2.javascript ...
- javascript 中的new操作符的理解
new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassic ...
- javascript中神奇的(+)加操作符
javascript是一门神奇的语言,这没神奇的语言中有一个神奇的加操作符. 常用的加操作符我们可以用来做: 加法运算,例如:alert(1+2); ==>3 字符串连接,例如:alert(“a ...
- [转] JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别
ECMAScript将对象的属性分为两种:数据属性和访问器属性.每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以 ...
- JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )
ECMAScript 中的相等操作符由两个等于号 ( == ) 表示,如果两个操作数相等,则返回 true. 相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性. 在转换不同的数据类型 ...
- 为什么不要在 JavaScript 中使用位操作符?
如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型.在 JavaScript 中的数字类型是不区分什么 Int,F ...
随机推荐
- Mahout决策森林
Mahout决策森林算法 一.决策树 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法 ...
- Linux grep命令分析以及C语言版本的实现
1.作用 Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全 ...
- CSS3 Media Queries 简介
原文链接:Introduction to CSS3 Media Queries 原文日期: 2014年2月21日 翻译日期: 2014年2月26日 翻译人员: 铁锚 简介 随着移动设备的日益普及,we ...
- Android NDK开发method GetStringUTFChars’could not be resolved
Android NDK开发method GetStringUTFChars'could not be resolved 图1 最近用到android的ndk,但在eclipse中提示method Ge ...
- 【翻译】使用新的Sencha Cmd 4命令app watch
原文:http://www.sencha.com/blog/using-the-new-app-watch-command-in-sencha-cmd-4/ 作者:Don Griffin Don Gr ...
- SpriteBuilder中如何给精灵添加帧动画
首先你必须准备若干幅图片,当然最好做成Smart Sprite Sheet. 打开一个CCB文件,并鼠标选择根节点的CCSprite对象. 保持前者选中且Timeline的当前时间点把手在最左边,然后 ...
- 用curl采集需要登录的页面
登陆cookie存储至自定义目录 $cookie_dir = tempnam('.', 'cookie');curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_ ...
- LeetCode之“链表”:Add Two Numbers
题目链接 题目要求: You are given two linked lists representing two non-negative numbers. The digits are stor ...
- java数据类型易错点简单总结,欢迎大神前辈补充!谢谢
数据类型那这边看似简单,花了我很长时间也就是才练到几成"功力"吧.还希望路过的大神在下面补充,菜鸟的我深受感谢! 首先看两个思考题 思考题1:请问下面这个有没有问题 double ...
- The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
1 Preface DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has Eng ...