前言:
这个还是需要记下来的。
类型转换规则
-
原始 --> 数字
标题 | |
---|---|
true | 1 |
false | 0 |
null | 0 |
undefined | NaN |
string | 空字符: 0 |
string | 去掉引号,不是数字 就是NaN |
-
true ——— 1
-
false ——— 0
-
null ——— 0
-
undefined ——— NaN
-
string
- 空字符 —— 0
- 去掉引号,不是数字 就是NaN
-
所有--> boolean
-
string: 空字符串 "" false , " " true '\t\r\n' true
-
boolean: false
-
null: false
-
undefined: false
-
number: 0 、 NaN false
-
其他都是 true
Boolean([]) true Boolean({}) true
-
-
原始--> 字符串
- 加上引号
- 数值 ——— '数值'
- 字符串 ——— 不变
- 布尔值 ——— "true" 、 "false"
- undefined —— "undefined"
- null ——— "null"
-
对象 --> 原始
先调用 valueOf 然后调用 toString
-
valueOf , toString
- [] valueOf [] , [] toString ''
- {} valueOf {}, {} toString '[object Object]'
- function 调用 valueOf toString
-
valueOf 和 toString 是挂载在 Object上的, 任何对象或者值 都有这个方法
Number(对象)
1、valueOf() ---> 原始数据类型 ---> String()
2、toString() ---> 原始类型 ---> String()
3、报错
Number([]) // 0
Number({}) // NaN
[].valueOf() // []
[].toString() // ''
String( 对象 )
- 先调用 toString, 后调用 valueOf
1、toString() ---> 原始类型 ---> String()
2、valueOf() ---> 原始数据类型 ---> String()
3、报错
var obj = {a: 1}
console.log(obj.toString) [object Object]
console.log(obj.valueOf) {a: 1}
console.log(String(obj)) [object Object]
运算符规则
* 算数运算符时, 转为 number 类型。
1、 如果有一方是 字符串 字符串拼接。 2、 NaN + = NaN
* 逻辑运算符 转为 boolean 类型
* 比较运算符 转为 number 类型
* \=== 需要比较值和引用地址。
* \== 值比较
* NaN == NaN 值是false
* undefined null 只有和自身比较,或者相互比较时 才是 true
面试官问: javascript 是怎么进行 数据转换的?为什么会存在 转换?
因为js 是 弱类型 动态类型语言。 变量没有类型限制,可以赋予任意值。
面试官问: 你能说说JS类型转换么?
1、 显式转换 Boolean() String() Number() 包装类 类型 一来转换规则 直接转
-
Boolean() 转换 基本类型的时候
0 undefined null NAN false '' 这6种 转为 false。 其他都是 true;
-
String() 转换 基本类型的时候
直接变成字符串
2、 转换复杂类型的时候
1. Boolean(对象) 先调用 valueOf 如果得到对象 继续调用 toString()
如果得到 基本类型, 返回基本类型。 如果得到 对象, 报错。
2. String(对象) 先调用 toString 如果得到对象 继续调用 valueOf()
如果得到 基本类型, 返回基本类型。 如果得到 对象, 报错。
3. 隐式转换 运算符 (算数运算符、 逻辑运算符、 比较运算符)
-
需要转为 原始类型进行算数 逻辑 比较。
* 算数运算符时, 转为 number 类型。 1、 如果有一方是 字符串 字符串拼接。 2、 NaN + = NaN * 逻辑运算符 转为 boolean 类型 * 比较运算符 转为 number 类型 * \=== 需要比较值和引用地址。 * \== 值比较 * NaN == NaN 值是false * undefined null 只有和自身比较,或者相互比较时 才是 true
自动转换 Boolean 情况, js 遇到期望为 布尔值的地方
if()
! 三元
---------------------------------上题目 ---------------------------------
下面表达式的值 是什么? 腾讯
1、
0 == ''
0 == '0'
3、 2 == true
2 == false
5、 false == 'false'
false == '0'
7、 false == undefined
false == null
9、 null == undefined
'\t\r\n' == 0
\n 10 换行
\r 13 回车CR
\t 跳格(移至下一列)。 tab键
1、 true
true
3、 false ****
false
5、 false
true
7、false
false
9、 true
true
下面表达式 网易
null + '1' == null + 1
2、 null + 1 == 1
null == 0
4、 null == undefined
null + 1 == undefined + 1
6、 null + null == undefined + undefined
'null1' == 1 false
2、 true
3、 false
4、 true
5、 false
6、 false
下面代码 输出什么? 新东方
var obj1 = {
a: 1,
b: 2,
valueOf: function() {
return this.a + this.b;
},
toString: function() {
return 1;
}
};
var obj2 = {
toString: function() {
return 0;
}
};
console.log(obj1 + !!obj2);
// 4
知乎大佬发布文章的图 我找不到链接了
知乎大佬发布文章的图 我找不到链接了
false => ![]
true => !![]
undefined => [][[]]
NaN => +[![]]
0 => +[]
1 => +!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => []["filter"]
eval => []["filter"]["constructor"]( CODE )()
window => []["filter"]["constructor"]("return this")()
(! + [] + [] + ![]).length
! + [] 这么看 ! (+[])
+[] == +'' == 0 转数字 0
!0 true
![] []转boolean Boolean([]) == true !true == false
!(+[]) + [] + ![]
javascript 是怎么进行 数据转换的? 为什么会存在 转换。 因为js 是 弱类型 动态类型语言。 变量没有类型限制,可以赋予任意值。
显式转换有两种 Boolean() String()
Boolean() 转换 基本类型的时候 0 undefined null NAN false ''
这6种 转为 false。 其他都是 true;
String() 转换 基本类型的时候 直接变成字符串
转换复杂类型的时候
Boolean(对象) 先调用 valueOf 如果得到对象 继续调用 toString() 如果得到 基本类型, 返回基本类型。 如果得到 对象, 报错。
String(对象) 先调用 toString 如果得到对象 继续调用 valueOf() 如果得到 基本类型, 返回基本类型。 如果得到 对象, 报错。
隐式转换的话 运算符 算数运算符、 逻辑运算符、 比较运算符。 需要转为 原始类型进行算数 逻辑 比较。
算数运算符时, 转为 number 类型。
1、 如果有一方是 字符串 字符串拼接。 2、 NaN + = NaN
逻辑运算符 转为 boolean 类型
比较运算符 转为 number 类型
1、 === 需要比较值和引用地址。
2、 == 值比较
3、 NaN == NaN 值是false
4、 undefined null 只有和自身比较,或者相互比较时 才是 true