js是一門弱類型的語言,他在聲明變量的時候不需要指定類型,對變量賦值也沒有類型的檢測,所以js是非常的靈活的,但是有時候也會出現一些非常匪夷所思的問題
隱式類型轉換定義
console.log(1+'1')
看這句代碼 一個數字1 和一個字符串1 他們的類型是不同的 但是我們並沒有對他進行任何的操作,但是打印出來的結果是一個11的字符串
隱式類型轉換就是指,數據的類型在不用人工干預的情況下進行轉換的行為
js的數據類型
這個可真的是老生常談了,非常常見,簡單說一下js有7中數據類型
基本類型
- Boolean 布爾值
- Null 空
- Undefined 未定義
- Number 數字
- String 字符串
- Symbol es6新增的一種基本數據類型一種類似於標記的一個數據類型我是這么理解的,
這個接觸不多,應該沒有人會用這個去做類型轉換的吧。。。
引用類型(Object)
- Object 類型
- Array 類型
- Date 類型
- RegExp 類型
- Function 類型
上邊說的這些其實他們都是引用類型(Object)
js在做數據類型轉換的時候都做了什么
如本片博客的最上邊的那個例子,不同的數據類型,再進行轉換的時候做了什么,什么時候會觸發隱式類型轉換呢
首先是各種的運算符,比如說 + 或者 ==
console.log(1==true)
只要是涉及到不同數據類型需要計算的時候都會觸發隱式類型轉換,然后隱式類型中主要有三種轉換方式
-
將值轉為原始值,ToPrimitive()。
-
將值轉為數字,ToNumber()。
-
將值轉為字符串,ToString()。
我之前常見的是toNumber 和 toString,之前我居然不知道這個ToPrimitive是干嘛的 特意谷歌了下。。。
ToPrimitive 是js的一個內部的算法,是內部執行的時候遵循的一套規則
他有兩個參數 第一個是要轉換的值,第二個是期望轉換的類型, 只能有三個參數
-
String
-
Number
-
default
大概的抄一下這個ToPrimitive的運作流程
如果第二個值是Number的話
1、如果輸入的值已經是一個原始值,則直接返回它 2、否則,如果輸入的值是一個對象,則調用該對象的valueOf()方法, 如果valueOf()方法的返回值是一個原始值,則返回這個原始值。 3、否則,調用這個對象的toString()方法,如果toString()方法返回的是一個原始值,則返回這個原始值。 4、否則,拋出TypeError異常。
如果第二個值是Number的話
1、如果輸入的值已經是一個原始值,則直接返回它 2、否則,調用這個對象的toString()方法,如果toString()方法返回的是一個原始值,則返回這個原始值。 3、否則,如果輸入的值是一個對象,則調用該對象的valueOf()方法, 如果valueOf()方法的返回值是一個原始值,則返回這個原始值。 4、否則,拋出TypeError異常。
那么再給基本類型調用方法的時候,是怎么獲取到對象上邊的toString和toNumber的呢
其實就是用到了js的原生類型內建的包裝對象
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbol()
js在操作原始數據類型的屬性或者方法的時候會自動給源是類型轉換成一個包裝對象,然后去調用其原型上邊的方法,正所謂萬物皆對象~~~
- 嚴格等於和寬松等於
全等操作符(===)比較兩個值是否相等,兩個被比較的值在比較前都不進行隱式類型轉換。 相等操作符(==)比較兩個值是否相等,在比較前將兩個被比較的值轉換為相同類型。
(MDN)
得出的結論就是 == 會在比較之前進行隱式類型轉換
具體規則如下
- 兩個引用類型比較,只需判斷它們是不是引用了同一個對象,是返回true,否則為false。
- undefined 和 null 兩者互相比較或者與自身比較,結果是true。它倆與其他任何值比較的都為false。
- NaN與任何值比較包括它自身結果都是false。
- 引用類型和基本數據類型進行比較,兩者最后都會轉換成基本數據類型再進行比較。
- String,Boolean,Number中的任意兩個進行比較,最后都會轉為Number類型再進行比較。
js中常見的各種數據類型運算
舉個例子
3 + true; // 4
結果是一個數值型,js會先把true轉換成數字1
"2" + 3; // "23"
2 + "3"; // "23"
如果字符串和數字相加,js會自動把數字轉換成字符的,不管數字在前還是字符串在前,結果也是字符串,在傳參的時候需要注意
1 + 2 + "3"; // "33"
像這種 ,因為是從左到右運算的,所以會先得到一個數字3 然后再把3 轉換成字符串,最后得到一個33的字符串
感覺隱式類型轉換,平日里隨處可見,希望大家多敲多體會吧