类型转换规则
-
原始类型 -> 数字
- true => 1
- false => 0
- null => 0
- undefined => NaN
- string
- 空字符串(含空白字符) => 0
- 去掉引号首尾空白字符,不是数字就是 NaN
-
所有类型 -> bool
-
转化值 转化结果 null,undefined,0,NaN,空字符串 false 其他 true
-
-
原始类型 -> 字符串
- 看到什么就是什么
- 比如:NaN => “NaN”, null => “null”
-
对象类型 -> 原始原始类型
-
先调用对象的valueOf方法
-
得到的结果是原始类型则输出
-
如果是对象,调用toString方法
-
得到的是原始类型则输出,反之报错
-
举例:
const obj = {} console.log(+obj) // => NaN /** * 对象转数字 * 1.首先将对象转换为原始类型 * 调用valueOf 方法 * console.log(a.valueOf()) => {} * 得到的仍然是一个 对象 * 再次调用对象的toString方法 * console.log(a.toString()) => "[object Object]" 得到原始类型 * 2.将得到的原始类型转化为数字 * Number("[object Object]") => NaN */ // 如果在obj对象中添加valueOf 方法 和toString方法 强制返回对象 const obj = { valueOf(){ return {} }, toString(){ return {} } } console.log(+obj) // => TypeError: Cannot convert object to primitive value
-
运算符
- 算术运算
- 运算符:+ - * / % ++ –
- 运算规则:前提转化成原始类型
- 若无特殊情况转换为数字,直接进行运算
- 特殊情况1:x + y ,若x,y 有一方为字符串,则为字符串拼接
- 特殊情况2:NaN 与任何类型的算数运算均为NaN
- 特殊情况 1 优先于 2
- 比较运算
- 运算符:> < >= <=
- 运算规则:前提转化成原始类型
- 若无特殊情况,转换成数字进行比较
- 特殊情况:若两端为字符串,比较字典序
- 运算规则:前提转化成原始类型
- 运算符:===
- 运算规则:类型和值必须相同
- 特殊情况:如果两个操作数都是对象,只有当它们指向同一个对象时才返回
true
。
- 运算符:==
- 运算规则:
- 两端类型相同,比较值
- 两端类型不同,转换成数字比较
- 特殊情况:undefined和null只有与自身比较或者相互比较时,才会返回true
- 运算规则:
- 上面三者公共特殊情况:两端存在NaN,一定为false
- 运算符:!= !== 与 == === 取反
- 运算符:> < >= <=
- 逻辑运算
- 运算前提:转换成bool值
- 运算符:! && ||
- x && y
- x 为false ,返回x
- x为true , 返回 y
- x || y
- x 为 false 返回 y
- x 为 true 返回 x
常见面试题
-
在问号处输入什么,使得等式成立
-
var a = ? console.log(a==1&&a==2&&a==3) // 思路 当a为原始类型 等式无法成立 由于 == 两端类型不同时,转换成数字进行比较 而对象转换成数字 则分为两步进行 对象 -》原始 原始 -> 数字 a = { index:1, valueOf(){ return this.index++ } }
-
-
下面输出什么
-
console.log(([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]) /** * [][[]]:(数组取下标运算) [[]] => [[].toString()]=> [''] []['']=>undefined * + 转换成原始 [] => "" * [][[]] + [] => undefined + "" = "undefined" * [+!![]] : !![] => true +true => 1 * ([][[]]+[])[+!![]] = "undefined"[1] => "n" * ([] + {}) => "" + "[Object object]" => "[Object object]" * [+!![] + +!![]] => 1+1 = 2 * ([] + {})[+!![] + +!![]] => "[Object object]"[2] =>b * 所以整个表达式为 "n" + "b" = "nb" */
-