js类型转换

ToString

toString()

非string类型转换为string时会默认执行它的toString方法。

true->'true'
1->'1'
[1,2]->'1,2'
{}->'[object Object]'
function(){}->"function()\n{}"

JSON字符串化

1. JSON.stringify(..)在对象中遇到undefined、function和symbol时会自动将其忽略,在数组中则会返回null
2. 如果对象中定义了toJSON()方法,JSON字符串化时会首先调用该方法,然后用它的返回值来进行序列化。
3. 我们可以向JSON.stringify(..)传递一个可选参数replacer,它可以是数组或者函数,用来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除,和toJSON()很像。如果replacer是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略。如果replacer是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次,每次传递两个参数,键和值。

ToNumber

1. 其中true转换为1, false转换为0。undefined转换为NaN, null转换为0。
2. ToNumber不会处理0开头的8进制数,但会处理0x开头的16进制数

数字解析

parseInt和parseFloat用将其它类型解析为数字
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否则会失败并返回NaN。解析空字符为NaN
数字解析同样不能解析0开头的八进制数,但是parseInt和parseFloat支持传递第二个参数来传递解析进制,默认值为10

对象转换(ToPrimitive)

对象(包括数组)会首先被转换为相应的基本类型值,如果不是目标类型则继续进行转换

ToPrimitive规则

1. 如果对象的ValueOf方法的结果是原始值,返回原始值。
2. 如果对象的toString方法返回原始值,就返回这个值;
3. 其他情况都返回一个TypeError错误

ToBoolean

JavaScript中的值可以分为以下两类:
(1) 可以被强制类型转换为false的值
(2) 其他(被强制类型转换为true的值)
以下这些是假值:
• undefined
• null
• false
• +0、-0和NaN
• ""
假值列表以外的都应该是真值(truthy)
显式强制类型转换为布尔值最常用的方法是!!和Boolean(..)

||和&&

&&和||运算符的返回值并不一定是布尔类型,而是两个操作数其中一个的值。
对于||来说,如果条件判断结果为true就返回第一个操作数的值,如果为false就返回第二个操作数的值。
&&则相反,如果条件判断结果为true就返回第二个操作数的值,如果为false就返回第一个操作数的值。

算法操作

+(加法)

存在一个操作数为字符串或者对象的情况,+为拼接操作,两方都转换为字符串进行操作
其它情况为数字操作,两方都转换为数字进行操作

-,*,/(其它算法符)

双方都转换为数字操作

比较

宽松相等和严格相等

正确的解释是:“==允许在相等比较中允许进行强制类型转换,而===不允许。

比较规则

1. 数字的优先级最高,任何类型与数字比较都需要将其转换为数字。
2. 布尔类型在比较时会先被强制转为数字,再进行比较
3. 在==中null和undefined相等(它们也与其自身相等),除此之外其他值都不存在这种情况。
4. 对象与任何对象都不相等和全等,对象与基础类型比较时先转化为基本类型,比较双方首先调用ToPrimitive,如果结果出现非字符串,就根据ToNumber规则将双方强制类型转换为数字来进行比较。

你可能感兴趣的