js类型转换
偶然在网上看到张很有意思的图,输出结果可能很多人意想不到。(图就不放了直接看控制台输出吧,哈哈哈!)
// 在控制台输入左边代码 可得到右边值
typeof NaN // number
9999999999999999 // 10000000000000000
0.5 + 0.1 === 0.6 // true
0.2 + 0.1 == 0.3 // false
Math.max() // -Infinity
Math.min() // Infinity
[] + [] // ""
[] + {} // [object Object]
{} + [] // 0
true + true // 2
true - true // 0
true == 1 // true
true === 1 // false
(! + [] + [] + ![]).length // 9
9 + "1" // "91"
91 - "1" // 90
[] == 0 // true
有被某些值惊到吗,哈哈哈!
那么为什么会输出这样子的结果呢,这就涉及到了js的弱类型语言特性。就是因为这一特性,导致在某些情形下会对数据进行隐式的转换,也就造就了上述代码中的结果。
那么js是弱类型语言也就意味着可以不用提前声明变量的类型,而在程序运行的过程中类型会被自动确定。也就是说你可以在 init的时候定义变量a为字符串,再后续填充数据的时候可以将其赋值一个对象,but 不建议这么写,尽量保持数据类型的统一,否则代码运行过程中可能会报错。
话不多说,开始类型转换。
1. 显式转换
转字符串:String() / toString()
转数字: Number() / parseInt() / parseFloat()
转布尔: Boolean()
2. 隐式转换
不得不说的 toPrimitive,在MDN文档中是这么解释的:
Symbol.toPrimitive
是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。该函数被调用时,会被传递一个字符串参数
hint
,表示要转换到的原始值的预期类型。hint
参数的取值是"number"
、"string"
和"default"
中的任意一个。
(1)type值为string:
- 先调用
obj
的toString
方法,如果为原始值,则return
,否则进行第2步; - 调用
obj
的valueOf
方法,如果为原始值,则return
,否则进行第3步; - 抛出
TypeError
异常
(2)type值为number:
- 先调用
obj
的valueOf
方法,如果为原始值,则return
,否则进行第2步; - 调用
obj
的toString
方法,如果为原始值,则return
,否则第3步; - 抛出
TypeError
异常
(3)type值为default:
- 该对象为
Date
,则type被设置为string;
- 否则,type被设置为n
umber
- 转为Number:
null => 0 ; undefined => NaN; true => 1; false => 0; "" => 0; 字符串转为数字时遵循数字常量规则,转换失败则为NaN;其余遵守toPrimitive规则
- 转为String:
String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
String(1) // '1'
String(-1) // '-1'
String(0) // '0'
String(-0) // '0'
String(Math.pow(1000,10)) // '1e+30'
String(Infinity) // 'Infinity'
String(-Infinity) // '-Infinity'
String({}) // '[object Object]'
String([1,[2,3]]) // '1,2,3'
String(['koala',1]) //koala,1
- 转为Boolean:
undefiined,null,NaN,"",0,+0,-0转为false,其余皆为true。
数据在逻辑判断和逻辑运算中会隐式的转为boolean;
有加法运算符,但是没有字符串时会优先转换为number,其余运算符都会转为number;
加法运算,有一个值是字符串时,另一个值非字符串,则后者转为字符串;
'2' + {} // "2[object Object]"
'2' + [] // "2"
'2' + function (){} // "2function (){}"
'2' + ['koala',1] // 2koala,1
2 + {} // "2[object Object]"
2 + [] // "2"
2 + function (){} // "2function (){}"
2 + ['koala',1] // 2koala,1