本文共 2243 字,大约阅读时间需要 7 分钟。
最近在读《你不知道的javascript》系列图书,收获蛮大,感慨也挺多的。
是的,关于javascript,你不是不知道,而是真的不知道。 就比如类型转换,从开始到看完到第二第三第N遍,我经历了如下的心路历程:这有什么不知道的 → 一脸懵逼 → 有点意思 → 卧槽,怎么这样? → 原来是这样 → 靠,还是坑... 真可谓是不学不知道,一学吓一跳。 为了避免再次入坑,这里做个总结,不,了结。Javascript中的强制类型转换总是返回标量基本类型值(
直白点就是string, boolean, number, undefined, null
)。toString()
或者valueOf()
的返回值。
var a = 1;a.toString() // '1'a.valueOf() // 1a + 2 // 3 优先调用valueOfa + 'string' // 1string 优先调用toStringa + '' //隐式强制类型转换String(a) //显示强制类型转换
对象在强制转换为字符串的时候,会优先调用toString()方法,如果返回基本类型的值,则直接使用该返回值;
如果返回值不是基本类型,则会继续调用valueOf()方法,如果valueOf()返回基本类型的值,则直接使用该返回值,否则报错。 数组默认的toString方法经过了重新定义,类似于数组的join(',')
方法,会将数组的各个元素以,
分隔返回。这就是String([]) === ''
的原因。
值 | 转换后 |
---|---|
null | 'null' |
undefined | 'undefined' |
true | 'true' |
false | 'false' |
0 | '0' |
-0 | '0' |
NaN | 'NaN' |
1 | '1' |
{} | '[object Object]' |
[] | '' |
[1, 2] | '1,2' |
function (){} | 'function (){}' |
JSON.stringify
在对象
中遇到undefined、function、symbol
时会自动忽略JSON.stringify
在数组
中遇到undefined、function、symbol
时会返回null
JSON.stringify
的规则与ToString相同toJSON()
方法,那么该方法会在字符串化前调用。JSON.stringify({ a : undefined, b : function () {}, c: 1}) // "{"c":1}"JSON.stringify([undefined, function () {},1]) // "[null, null, 1]"
对象在强制转换为数字的时候,会优先调用valueOf()方法,如果返回基本类型的值,则直接使用该返回值;
如果返回值不是基本类型,则会继续调用toString()方法,如果toString()返回基本类型的值,则直接使用该返回值,否则报错。
值 | 转换后 |
---|---|
null | NaN |
undefined | 0 |
true | 1 |
false | 0 |
0 | 0 |
-0 | -0 |
NaN | NaN |
'' | 0 |
'1' | 1 |
1 | 1 |
{} | NaN |
[] | 0 |
[1, 2] | NaN |
function (){} | NaN |
Number([]),因为[].valueOf()返回值不是基本类型,因此会调用toString(), 等价于Number('')
javascript有以下假值:
假值的布尔强制类型转化为false
true
) 值 | 转换后 |
---|---|
null | false |
undefined | false |
true | true |
false | false |
0 | false |
-0 | false |
NaN | false |
'' | false |
'1' | true |
1 | true |
{} | true |
[] | true |
[1, 2] | true |
function (){} | true |
== 允许在相等比较中进行强制类型转换,=== 不允许
== 和 === 都会检查操作数的类型,区别在于操作数类型不同时他们的处理方式不同,即== 会进行强制类型转换
null == undefinedNaN != NaNnull != 0undefined != 0NaN != 0[] == false[] == 0[] == ''[] == ![]
==
+
运算符 (即只有一个操作数) 用来强制转化为数字 + new Date()
转载地址:http://zvolo.baihongyu.com/