不同数据类型做比较的时候,都需要进行数据类型的转换!本文介绍常见数据类型转换的方法,相等和严格相等的判断规律
一、其他类型转换成布尔类型
1、使用场景:
对于括号里的表达式,会被强制转换为布尔类型
if ("") {
console.log('empty')
}
2、转换规则
类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Number | +0, −0, 或者 NaN 为 false, 其他为 true |
String | 空字符串为 false,其他都为 true |
Object | true |
3、举个栗子
if ("hello") {
console.log("hello")
} //hello
// 题目2:如下代码输出什么?
if ("") {
console.log('empty')
} //undefined
// 题目3:如下代码输出什么?
if (" ") {
console.log('blank')
} //blank
// 题目4:如下代码输出什么?
if (+0.00) {
console.log('blank')
} //undefined
4、小建议
写代码以后不要写成下面这样,不要再if内放变量。变量转换成布尔类型,会有很多状态。可以写成判断类型的语句如(a==="")。
if(a){
console.log('blank')
}
二、其他元素的转换成数字(toNumber)
1、使用场景:
判断是否相等==
2、转换规则
类型 | 结果 |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | ture -> 1, false -> 0 |
String | “abc” -> NaN, “123” -> 123 , ""->0 , " "->0 空字符串和含有空白字符串的字符都为0 |
Object | 先调用 .valueOf 方法获取结果。如果没定义,再尝试调用 .toString方法获取结果(数据运算符那篇文章有详细介绍) |
三、== 的判断
经验就是把双方转换成数字
1、转换规则
类型 | 结果 | 结果 |
---|---|---|
Undefined | Null | true 特例记住 undefined == null |
Number | any | x == toNumber(y)数字和任何数据相比,把其他数据转换成数字在比较 |
Boolean | (any) | toNumber(x) == y 只要布尔类型先转换成数字,再比较 |
Object | String or Number | toPrimitive(x) == y 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。 |
otherwise | otherwise | false |
2、举个例子
"" == 0 // true false
" " == 0 //true
"" == true //false
" " == true //false
!" " == true // false ,(!" "就是布尔类型的false)
"hello" == true //false "hello"转换成数字为nan,true转换成数字1
"0" == false //true
"00" == false //true
"0.00" == false //true
undefined == null //true
true== {} //false {}调用tostring为[object Object]
[] == true //false 对象的toString方法默认返回[object Object]
var obj = {
a: 0,
valueOf: function(){return 1}
}
obj == "[object Object]" // false 自定义valueof之后,对象转换数字返回的是1
四、严格相等
1、不同类型的值
如果两个值的类型不同,直接返回false
2、复合类型值
两个复合类型(对象、数组、函数)数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。如果两个变量引用同一个对象,则它们相等。
var v1 = {};
var v2 = v1;
v1 === v2 // true
反例
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
//比较两个空对象、两个空数组、两个空函数,结果都是不相等。
//原因是对于复合类型的值,严格相等运算比较的是,它们是否引用同一个内存地址,
//而运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false
3、特例
- 例子1:NaN与任何值都不相等(包括自身)
NaN == NaN // false
NaN === NaN // false
- 例子2:正0等于负0
+0 === -0 // true
- 例子3:undefined和null与自身严格相等
undefined === undefined // true
null === null // true
var v1;
var v2;
v1 === v2 // true
//由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。