js是一門弱類型的語言,他在聲明變量的時候不須要指定類型,對變量賦值也沒有類型的檢測,因此js是很是的靈活的,可是有時候也會出現一些很是匪夷所思的問題es6
console.log(1+'1')
看這句代碼 一個數字1 和一個字符串1 他們的類型是不一樣的 可是咱們並無對他進行任何的操做,可是打印出來的結果是一個11的字符串算法
隱式類型轉換就是指,數據的類型在不用人工干預的狀況下進行轉換的行爲code
這個可真的是老生常談了,很是常見,簡單說一下js有7中數據類型對象
上邊說的這些其實他們都是引用類型(Object)字符串
如本片博客的最上邊的那個例子,不一樣的數據類型,再進行轉換的時候作了什麼,何時會觸發隱式類型轉換呢原型
首先是各類的運算符,好比說 + 或者 ==博客
console.log(1==true)
只要是涉及到不一樣數據類型須要計算的時候都會觸發隱式類型轉換,而後隱式類型中主要有三種轉換方式it
將值轉爲原始值,ToPrimitive()。io
將值轉爲數字,ToNumber()。console
將值轉爲字符串,ToString()。
我以前常見的是toNumber 和 toString,以前我竟然不知道這個ToPrimitive是幹嗎的 特地谷歌了下。。。
ToPrimitive 是js的一個內部的算法,是內部執行的時候遵循的一套規則
他有兩個參數 第一個是要轉換的值,第二個是指望轉換的類型, 只能有三個參數
String
Number
default
大概的抄一下這個ToPrimitive的運做流程
若是第二個值是Number的話
一、若是輸入的值已是一個原始值,則直接返回它 二、不然,若是輸入的值是一個對象,則調用該對象的valueOf()方法, 若是valueOf()方法的返回值是一個原始值,則返回這個原始值。 三、不然,調用這個對象的toString()方法,若是toString()方法返回的是一個原始值,則返回這個原始值。 四、不然,拋出TypeError異常。
若是第二個值是Number的話
一、若是輸入的值已是一個原始值,則直接返回它 二、不然,調用這個對象的toString()方法,若是toString()方法返回的是一個原始值,則返回這個原始值。 三、不然,若是輸入的值是一個對象,則調用該對象的valueOf()方法, 若是valueOf()方法的返回值是一個原始值,則返回這個原始值。 四、不然,拋出TypeError異常。
那麼再給基本類型調用方法的時候,是怎麼獲取到對象上邊的toString和toNumber的呢
其實就是用到了js的原生類型內建的包裝對象
js在操做原始數據類型的屬性或者方法的時候會自動給源是類型轉換成一個包裝對象,而後去調用其原型上邊的方法,正所謂萬物皆對象~~~
全等操做符(===)比較兩個值是否相等,兩個被比較的值在比較前都不進行隱式類型轉換。 相等操做符(==)比較兩個值是否相等,在比較前將兩個被比較的值轉換爲相同類型。
(MDN)
得出的結論就是 == 會在比較以前進行隱式類型轉換
具體規則以下
舉個例子
3 + true; // 4
結果是一個數值型,js會先把true轉換成數字1
"2" + 3; // "23" 2 + "3"; // "23"
若是字符串和數字相加,js會自動把數字轉換成字符的,無論數字在前仍是字符串在前,結果也是字符串,在傳參的時候須要注意
1 + 2 + "3"; // "33"
像這種 ,由於是從左到右運算的,因此會先獲得一個數字3 而後再把3 轉換成字符串,最後獲得一個33的字符串
感受隱式類型轉換,平日裏隨處可見,但願你們多敲多體會吧