先看看如下几个问题,如果都能答对且晓得为什么那么能够不必接着往下看了(当然想要接着看我是不会回绝的哈哈):
console.log(” == 1); // false
console.log(‘ ‘ == 1); // false
console.log(true == 1); // true
console.log(true == ‘1’); // true
console.log(true == ‘2’); // false
console.log(‘ ‘ == true); // false
console.log(“0” == true); // false
console.log(“0” == false); // true
console.log(“00” == false); // true
console.log(“0.00” == false); // true
console.log(undefined == null); // true
console.log(null == ‘null’); // false
console.log({} == true); // false
console.log([] == true); // false
复制代码
var obj = {
a: 0,
valueOf: function(){return 1}
}
console.log(obj=='[object Object]’); // false
console.log(obj==1); // true
console.log(obj==true); // true
复制代码
if (“”) {
console.log('empty')
} // 无
if (” “) {
console.log('blank')
} // blank
if ([0]) {
console.log('array')
} // array
if(‘0.00’){
console.log(‘0.00’)
} // 0.00
复制代码
置信看了下面的题,一些初学的小伙伴曾经开始狐疑人生了,不急不急,咱们上面就先讲讲两个知识点,而后最初咱们再来一一解析题目,到时候就很好了解了。
一、数据类型的相互转换
- 其余类型转成 Number
数据类型 转为值
String 纯数字的字符串转为对应的数字,空字符串和空格字符串是 0,其余字符变成 NaN
Boolean true 为 1,false 为 0
Object 调用 valueOf() 的返回后果,没有则返回 toString()后果,若对象没有 valueOf()和 toString()则返回 NaN
null 返回 0
undefined 返回 NaN
Number([])返回 0,Number([3])返回 3,Number([1, 2])返回 NaN。
- 其余类型转成 String
数据类型 转为值
Number 转为对应数字的字符串模式,NaN 是“NaN”
Boolean true 为 ”true”,false 为 ”false”
Object 返回 toString() 的返回值,默认是“[object Object]”
null 返回 ”null”
undefined 返回 ”undefined”
- 其余类型转成 Boolean
数据类型 转为 true 的值 转为 false 的值
Number 任何非零数字(包含无穷大)0、- 0 和 NaN
String 任何非空字符“”(空字符串)
Object 任何对象 无
null 无 null
undefined 无 undefined
二、数据类型的比拟
首先强调一点,这里所讲的是 == 比拟,而不是 === 比拟,因为只有 == 在相互比拟的时候会进行隐式转换再做比拟,而具体规定如下:
Number、String、Boolean 三者的相互比拟,都先转换为数字再进行比拟。
Object 和其余作比拟,调用 toPrimitive 的返回值进行比拟(先尝试调用 .valueOf 办法获取后果。如果没定义,再尝试调用 .toString 办法获取后果)。
null 和 undefined 的比拟不做转换,且 null==undefined 返回 true(null===undefined 返回 false)。
NaN 不与任何值相等,即便 NaN==NaN 返回的也是 false。
三、答案解析
好了,依据下面所讲的两点,当初咱们再来看看开始的题目,一一解释下:
首先看这些题目:
console.log(” == 1); // false
console.log(‘ ‘ == 1); // false
console.log(true == 1); // true
console.log(true == ‘1’); // true
console.log(true == ‘2’); // false
console.log(‘ ‘ == true); // false
console.log(“0” == true); // false
console.log(“0” == false); // true
console.log(“00” == false); // true
console.log(“0.00” == false); // true
复制代码
依据 “Number、String、Boolean 三者的相互比拟,都先转换为数字再进行比拟 ”,所以下面的几个比拟全都会先进行数字转换,而 Number(”)、Number(‘ ‘)、Number(‘0′)、Number(’00’)、Number(‘0.00)都是 0,Number(true)是 1、Number(false)是 0。这个时候题目实际上就变成上面这样:
console.log(0 == 1); // false
console.log(0 == 1); // false
console.log(1 == 1); // true
console.log(1 == 1); // true
console.log(1 == 2); // false
console.log(0 == 1); // false
console.log(0 == 1); // false
console.log(0 == 0); // true
console.log(0 == 0); // true
console.log(0 == 0); // true
复制代码
这样做了转换之后的比拟是不是就高深莫测了?2. 依据比拟规定的第 2 点“Object 和其余作比拟,调用 toPrimitive 的返回值进行比拟(先尝试调用 .valueOf 办法获取后果。如果没定义,再尝试调用 .toString 办法获取后果)”,因为 Number({})为 NaN,Number([])为 0,上面的题目
console.log({} == true); // false
console.log([] == true); // false
var obj = {
a: 0,
valueOf: function(){return 1}
}
console.log(obj=='[object Object]’); // false
console.log(obj==1); // true
console.log(obj==true); // true
复制代码
就变成
console.log(NaN == 1); // false
console.log(0 == 1); // false
var obj = {
a: 0,
valueOf: function(){return 1}
}
console.log(1 == NaN); // false
console.log(1 == 1); // true
console.log(1 == 1); // true
复制代码
依据转换规则第 3 点“null 和 undefined 的比拟不做转换,且 null==undefined 返回 true”,上面就不必解释了吧?
console.log(undefined == null); // true
console.log(null == ‘null’); // false
复制代码
而对于这种 if 的判断,咱们能够间接转换成 Boolean。因为任何对象和任何非空字符串的布尔值都是 true,有 Boolean(”)为 false,Boolean(‘ ‘)、Boolean([0])、Boolean({})为 true。
if (“”) {
console.log('empty')
} // 无
if (” “) {
console.log('blank')
} // blank
if ([0]) {
console.log('array')
} // array
if(‘0.00’){
console.log(‘0.00’)
} // 0.00
复制代码
最初补充两道题:
console.log(!” ” == true); // false
console.log(!” ” == false); // true
复制代码
因为“! 取反”的优先级高于“==”,所以先做布尔转化,有 Boolean(” “)为 true,!Boolean(” “)为 false。则转化成如下:
console.log(false == true); // false
console.log(false == false); // true
复制代码
此时因为是两个布尔值做比拟所以就不必再做转化数字的操作。over~
最初
如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163 互相学习,咱们会有业余的技术答疑解惑
如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star: https://gitee.com/ZhongBangKe… 不胜感激!