这个问题想要知道答案,首先需要懂得==隐式转换规则
大致分五种情况:
1)两端类型相同,比较值
都是对象类型,判断引用地址是否一致
特殊的情况有:undefined == undefined
null == null
2)两端类型不同,
2.1)两端均为基本数据类型,转为数字比较
2.2)一端基本数据类型,一端引用数据类型,将引用数据类型转为基本数据类型(先调用valueOf,如果无法转换成基本数据类型,在调用toString方法-->ToPrimitive规则)
console.log('[object Object]' == {}); // true
// ({}).valueOf() => {},依旧不是基本类型
// ({}).toString() => '[object Object]'
// '[object Object]' == '[object Object]' => true
console.log('1,2,3' == [1, 2, 3]); // true
// [1, 2, 3].valueOf() => [1, 2, 3],依旧不是基本类型
// [1, 2, 3].toString() => '1,2,3'
// '1,2,3' == '1,2,3' => true
3)特殊情况的==
NaN !== NaN(NaN !== 任何东西)
undefined == null (除此之外,null,undefined !== 任何东西)
4)Boolean类型和其他类型比较,优先Boolean转Number
5)String和Number比较,优先String转Number
看看下面几个题,你学会隐式转换规则了吗?
[] == ![]
//涉及数组与布尔类型隐式转换
// ![] 转为false,因为空数组 [] 被视为真值(因为它不是空字符串、零、null、undefined 或 false)
// 布尔值与其他任何类型比较,优先布尔转Number,false -> 0,现在变成了[] == 0
// 基本类型和引用类型,引用转基本,[].valueOf->[],[].toString->''
// 字符串和数字类型,字符串转数字,'' -> 0
// 0 == 0
// true
[undefined] == false
// 数组和布尔,优先布尔转Number,false -> 0,此时题目变成了[undefined] == 0
// 数组和基本,数组转基本
// [undefined].valueOf -> [undefined],[undefined].toString->''
// ''和数字,字符边数字,'' -> 0
// 0 == 0
// true
强制转换规则
parseInt() 字符串转整数,尽可能多的解析数字
parseInt('3.14')//3
parseInt('1010', 2)//10
parseInt('42world')//42
parseInt('hello')//NaN
Number()
Number(null) // 0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0
//字符串:只包含数字转为数字(空字符串转为0),包含非数字转NaN
Number("11") // 11
Number("1.1e+21") // 1.1e+21
Number("abc") // NaN
Number([]) // 0
Number([0]) // 0
Number([1]) // 1
Number(["abc"]) // NaN ['abc'].valueOf -> ['abc'] ['abc'].toString -> 'abc'
Number({}) // NaN
String()
String(null) // "null"
String(undefined) // "undefined"
String(true) // "true"
String(false) // "false"
String(11) // "11"
String(11e20) // '1.1e+21'
String([]) // ""
String([1, null, 2, undefined, 3]) // '1,,2,,3'
String(function a(){}) // "function a(){}"
String({}) // "[object, Object]"
String({name:'zhang'}) // "[object, Object]"
Boolean()
只有null
,undefined
,0
,false
,NaN
,空字符串
这6种情况转为布尔值结果为false
,其余全部为true
这个时候你再看看这个题目,想要a == 1 && a == 2 && a == 3同时成立,显然是第二种情况才有可能满足。
隐式转换(比较运算和算术运算)
算数运算-*/优先将非Number转为Number
+比较特殊:
String
类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型。Number
类型,另一侧为原始类型
,则将原始类型转换为Number
类型。Number
类型,另一侧为引用类型
,将引用类型和Number
类型转换成字符串后拼接。 123 + '123' // 123123 (规则1)
123 + null // 123 (规则2)
123 + true // 124 (规则2)
123 + {} // 123[object Object] (规则3)
解一下这个题目:
var a = {
x: 1,
valueOf: function () {
return this.x++;
},
};
console.log(
'a == 1 && a == 2 && a== 3 结果:',
a == 1 && a == 2 && a == 3
); // 输出 a == 1 && a == 2 && a== 3 结果: true
var a = ?;
// a 为多少时,下面输出true?
console.log(
'结果:',
a == 1 && a == 2 && a == 'abc'
);
//办法
var a = {
x: 1,
valueOf: function () {
return this.x >= 3 ? 'abc' : this.x++;
},
};
console.log(
'a == 1 && a == 2 && a== abc 结果:',
a == 1 && a == 2 && a == 'abc'
); // 输出 a == 1 && a == 2 && a== 'abc' 结果: true
Oh my dear JavaScript 点一下看看