JavaScript类型转换基础篇

2018-08-27  本文已影响0人  黑莓小宝闪电朵朵

参考的这篇文章进行的总结+个人理解

基础知识:

1️⃣强制转换有三种类型方式,Number、String、Boolean
2️⃣原始值:5大基础类型值Undefined,Null,Boolean,Number,String
3️⃣复杂值:Object、Function、Array、Date、RegExp
🔅原始值因为长度大小固定,一般存在于栈(stack)中,方便快速查找。复杂值(也就是对象)因为长度大小不固定,不适用存在栈中,所以存在堆中,栈里只存放一个指针,指向它的内存地址。
❗️将要说到NaN那么它是什么?NaN: not a number
4️⃣toString():返回代表对象的字符串,可以做进制转换。null和undefined不能toString。
5️⃣valueOf():返回代表对象的原始值。
🔅toString()和valueOf()都可以自定义方法。因为引用时都是 .toString()和 .valueOf()方法根据对象特性可以自定义这两个方法
🌰:{valueOf:function(){return 123}, toString:function(){return 3}}可以根据这个自定义方法区分出先后执行顺序。

正文开始:

Number函数:将任意类型的值转换成数字
Number()

原始值转换规则:

1️⃣数值:转换后还是数值
2️⃣字符串:“123”转换后是123,“abc”转换后是NaN,而且由于Number函数非常严谨,只要字符串中有不可转换成数值的字符,就会显示NaN,空字符串是0。
3️⃣布尔值: true是1 false是0
4️⃣undefined:转换NaN
5️⃣null:转换成0

🔅注:可能有人会问转换数值还有parseInt函数,两者的区别是什么?
个人理解:parseInt函数和Number函数在处理数字字母混合的字符串时,所产生的结果是不一样的。
parseInt在处理时会逐个字符识别转换,遇到空格、非数字时才会停止识别转换,显示之前处理的结果

举个🌰:
parseInt(“123 ab 43”) // 123
parseInt(“ab 34”) // NaN
number是把当前字符作为一个整体,只要有不符合要求的地方返回的就是NaN
Number(“12 ab 34”) //NaN
\v \r \t \n \f等这种特殊空白符,Number会默认转化为0
Number(“\v\r\t\n123”) // 123

复杂值(对象)转换规则

对于Number()来说先调用对象自身的valueOf方法如果能返回原始值(数字,字符串,布尔)就不在进行后续操作,直接执行Number函数。
如果返回的不是原始值,那么就执行toString()方法。如果toString能返回原始值类型,就执行Number函数,不行的话就返回NaN。
Number({valueOf:function(){return 123}, toString:function(){return 3}}) // 123
Number({}) // NaN


String函数:将任意类型转换成字符串
String()

原始值转换规则:

1️⃣数值:“数值”
2️⃣字符串: “字符串”
3️⃣布尔值: “布尔值”
4️⃣undefind: “undefined”
5️⃣null: “null”

复杂值(对象)转换规则:

❗️跟Number方法类似,但是顺序不一样,先调用toString()方法,再调用valueOf()方法,对于经过toString()和valueOf方法之后还是复杂类型的值会直接报错,否则就是“[object Object]”

String({}) // "[object Object]"


Boolean函数:将任意类型转换成布尔值
Boolean()

原始值转换规则

1️⃣undefined,
2️⃣null,
3️⃣-0,
4️⃣+0,
5️⃣NaN,
6️⃣“”(空字符串)转换时结果是false
🔅其余都是true

复杂值转换规则

❗️所有对象的 布尔值都是true。
❗️方法和[ ]也是true。


补充

在强制转换的旁边就是自动转换,将自动转换分成3块

1️⃣自动转化成布尔值

2️⃣自动转化成字符串
3️⃣自动转化成数值

1️⃣自动转化成布尔值
undefined,null,-0,+0,NaN,“”(空字符串)
这6种情况是false其余都会自动转换成true
2️⃣自动转换成字符串
🔅一般发生在加法运算+,除了这种情况,其他值+字符串值时都会成为“字符串其他值”。
'1'+ 5 // "15"
3️⃣自动转成数值
🔅一般发生在减法运算,乘除运算,转换规则和Number函数相同。

❗️特殊情况:“字母”-“数字” // NaN

特殊转换:
+ “字符串”
- “字符串”
+ 布尔值
- 布尔值
都会使其转换成数值
🌰
1️⃣字符串 + 任何值 ==>“字符串任何值”
'1' + 6 // "16"
6 + '1' // "61"
2️⃣数值和布尔相加 ==> true是1 false0
true + 1 // 2
false + 2 // 0
3️⃣数值+复杂值
对象在运算符右侧时:+ {}
🔅复杂值是数组时,会把数值的值依次按字符串相连处理[1,2,3] // "123"
🔅复杂值是对象时,结果会是“数值[object Object]” + {a:1} // "[object Object]"
对象在运算符左侧时:{} +
对象 + 1 // 浏览器视对象为代码块,无视,所以结果是1{} + 1 // 1

(对象)+ 1 // 不会无视掉,按照常规操作String()处理,结果“[object Object]”
({}) + 1 // "[object Object]"
❗️4个特殊表达式

[ ] + [ ] // “"
[ ] + { } // [object Object]
{ } + { } // 0
{ } + { } // NaN

转换就是这样,主要还是多练多试,慢慢就能发现其中规律。暂时还没涉及到ES6新类型Symbol

上一篇 下一篇

猜你喜欢

热点阅读