数据类型转换与比较运算

184 阅读4分钟

一、Boolean转换成false的情况

Number: 0, +0, -0, NaN;
​
String: 空字符串
​
Boolean:falsenull: null
​
不成立的等式

注意:

undefined + undefined = NaN;
​
undefined + 任何 Number类型的数据 = NaN;
​
undefined + NaN = NaNundefined + 任意 String 类型的数据 = undefined与字符串拼接成的 String 类型的数据
undefined +  '1' = "undefined1"

二、Number转化为0的情况

// 1、基本类型
Number: 0, +0
String:空字符串 ,"0"
Boolean:false
null:null// 2、复杂数据类型
Array:[],[0],['0']
​

注意:

Number(undefined) // NaN

三、比较运算符

//  == 的比较规则; 规则自上而下执行
(1) NaN 不等于任何值,包括它自身;
(2) null 不等于任何值,除了 nullundefined;
(3) undefined 不等于任何值,除了 nullundefined;
(4) 如果比较出现 数字类型(Number) 和 布尔类型(Boolean)的数据,都会转换为 Number 类型 进行比较;
(5) 如果比较出现 字符串类型(String)的数据,都会转化为 字符串(String)进行比较;
(6) 如果两个复杂类型的数据进行比较,比较的是地址

四、Number方法转换规则

// Number()
1. undefined NaN
2. null      0
3. 布尔值   true1false0
4. 字符串
    (1)空字符串, 为0;
    (2)非空字符串,并且内容为纯数字转成对应的数字
    (3)其余都是 NaN
5. 数字 原来的数字
6. 对象
    (1) 对象、函数 转为NaN
     (2) 空数组转为 0,数组里只有一个数据且这个数据能转成数字,则转成对应的数字;其他转成 NaN;
​

五、String方法转换规则

1. 基本数据类型,null,undefined 的结果就是给数据加上引号变成字符串;
2. 对象
    (1)数组的结果为把所有中括号去掉,外面加个引号;
    (2)对象的结果为 "[Object Object]";
    (3)函数的结果为在函数整体外面加上引号

六、Boolean方法转换规则

1. undefined false
2. null      false
3 数字
    +0, -0NaN 转换为布尔值的结果为 false,其它的转布尔值的结果为 true
4. 布尔值 转为对应的值
5. 字符串
    空字符串转为布尔值的结果为false, 其它字符串(包括空格字符串)都转换为true
6. 对象转为布尔值都是 true

七、转换对象数据的背后原理

valueOf() 返回对象对应的原始值
toString() 返回对象的字符串表现形式
​
调用结果
1. 数组
    valueOf 数据本身(对象形式)
    toString 去掉中括号,外面加个引导
    
2. 函数
    valueOf 数据本身(对象形式)
    toString 在数据外面加个引号
    
3. 对象
    valueOf 数据本身(对象形式)
    toString  "[Object Object]"
// Number 参数为对象的转换原理
1. 调用对象 valueOf 方法,如果返回原始类型的值,再使用 Number 方法,不再进行后续步骤
2. 如果 valueOf 方法返回的还是对象,则调用 toString 方法
3. 如果 toString 方法返回原始类型的值,则对该值使用 Number 方法,不再进行后续步骤
4. 如果 toString 方法后返回的是还是对象,就报错(一般不会出现)
// Stirng 参数为对象的转换原理
1. 调用对象的 toStirng 方法。如果返回原始类型的值,再使用 String 函数,不再进行后续步骤
2. 如果 toString 方法返回的还是对象,再调用对象 valueOf 方法
3. 如果 valueOf 方法返回原始值类型,则对该值使用 String 函数,不再进行以下步骤
4. 如果valueOf 方法返回的还是对象,就报错
​
// 总结
1. 对象转数字,先调用 valueOf 再调 toString, 所以大部分对象转数字都是 NaN
2. 对象转字符串,一般只会调用 toString.

八、隐式转换的场景

(一) 隐式转数字的场景

1. 数学运算符(+ - * / %), 但是加法运算不能出现字符串或对象;
2. 一元运算 (+ -)正负操作符后面的数据
3. 递增、递减运算符
4. 某些比较运算符

(二) 隐式转字符串的场景

1. 有字符串的加法运算
2. 有对象的加法运算
3. 调用alert、document.write方法
4. 某些比较运算符

(三) 隐式转换布尔值的场景

1. 取反运算
    (1)1个感叹号,把这个数据转成布尔值后取它的相反值
    (2)2个感叹号,把这个数据转成布尔值
2. 三目运算、逻辑运算符里的表达式结果
3. 条件语句的小括号里的表达式结果