衆所周知javascript是一種弱類型語言。強類型和弱類型主要是站在變量類型處理的角度進行分類的。強類型是一旦指定數據類型,若是不通過強制轉換,那麼將永遠是指定的這個類型。js中沒法聲明數據類型,變量類型是根據實際值決定的,由編譯器自動調用轉換函數進行轉換,這種方式稱之爲隱式轉換,今天咱們就來談談數據類型是如何隱式轉換的。javascript
js數據類型共7種,包括6種基本數據類型,分別是Undefined、Null、String 、Number、Boolean、以及ES6新增的數據類型Symbol,一種複雜數據類型Object。前端
Undefined
只有一個值就是undefined,表示未經初始化的變量值Null
只有一個值null,null值表示空對象指針String
表示零個或多個16位的Unicode字符組成的字符序列Number
包括整數和浮點數Boolean
有兩個字面值:true和false,表示一個邏輯實體Symbol
每次建立的值都是惟一的,不能被強制轉換Object
複雜數據類型隱式類型轉換是在必定場景下,js運行環境自動調用這幾個方法,嘗試轉換成指望的數據類型java
將input對象轉成原始類型值,依賴valueOf()和toString()數組
PreferredType
參數是Number,則ToPrimitive執行順序:bash
PreferredType
參數是String,ToPrimitive執行順序:函數
PreferredType
沒有傳入參數編碼
Argument Type | Result |
---|---|
Undefined | false |
Null | false |
Boolean | return argument |
Number | 僅當argument參數是 +0, -0, or NaN時,return false;不然return true |
String | 僅當argument參數是 空字符串時,return false;不然return true |
Symbol | true |
Object | true |
Argument Type | Result |
---|---|
Undefined | NaN |
Null | +0 |
Boolean | argument 爲 true, return 1; argument 爲 false, return 0 |
Number | return argument參數 |
String | 將字符串中的內容轉化爲數字(好比"23"->23),若是轉化失敗則返回NaN(好比"23a"->NaN) |
Symbol | 拋出 TypeError 異常 |
Object | 先primValue = ToPrimitive(argument, Number),再對primValue使用ToNumber(primValue) |
Argument Type | Result |
---|---|
Undefined | "undefined" |
Null | "null" |
Boolean | argument 爲 true, return "true"; argument 爲 false, return "false" |
Number | 用字符串表示數字 |
String | 返回argument |
Symbol | 拋出 TypeError 異常 |
Object | 先primValue = ToPrimitive(argument, Number),再對primValue使用ToString(primValue) |
var a = 123
var n = a + 'helloworld';
console.log(n) // '123hellowold'
a = true
var m = a + 'helloworld'
console.log(m) // 'truehelloworld'
複製代碼
自增自減運算符
++/--加減乘除求餘算數運算符
+-*/%var a = '100'
var b = a--
var c = a/2
console.log(b) // 100
console.log(a) // 99
a+= ''
console.log(c) // 49.5
複製代碼
關係運算符
> < >= <= == != === !===console.log('10' > 3) // true 先轉成數字10再比較
console.log('3' > '10') // true
console.log('3'.charCodeAt()) // 51
console.log('10'.charCodeAt()) // 49
console.log('abc' > 'b') // false 先比較a和b,a和b不等,直接false
console.log('abc' > 'ade') // false,先比較aa,相等,繼續比較db,得出結果
console.log('b'.charCodeAt()) // 98
console.log('d'.charCodeAt()) // 100
複製代碼
console.log(undefined == undefined) // true
console.log(undefined === undefined) // true
console.log(undefined == null) // true undefined是從null派生出來的
console.log(undefined === null) // false
console.log(null == null) // true
console.log(null === null) // true
console.log(NaN == NaN) // false NaN與任何數據比較都是NaN
複製代碼
數據在邏輯判斷和邏輯運算之中會隱式轉換爲Boolean類型spa
var a = undefined
console.log(!a) // true 先Boolean(a) => false; 再取反 !false => true
複製代碼
轉換類型取決於,加號「+」兩邊的數據類型.net
console.log(123 + 'true') // '123true'
複製代碼
console.log(1 + true) // 2 先Number(true)=> 1,再作加計算,結果爲2
console.log(1 + undefined) // 先Number(undefined) => NaN ,再計算,結果NaN
console.log(1 + null) // 先Number(null) => 0,再計算,結果爲1
複製代碼
複雜數據類型隱式轉換時會先調用自身的valueOf()和toString()兩個函數,若是自身數據原型對象上沒有相應的函數則會由原型鏈__proto__
最終調用到Object.prototype對象對應的函數上,全部對象(除Null 和 undefined)都會繼承這兩個方法。prototype
valueOf
返回這個對象邏輯上對應的原始類型的值,原始值是存儲在棧(stack)中的簡單數據段,原始類型就是前面說的基本數據類型。原始值是啥?請看這裏原始值;valueOf是啥? 請看這裏valueOf
toString
返回這個對象的字符串表示
console.log([1,2] == '1,2') // true 解析以下
console.log([1,2].valueOf()) // [1,2],獲取原始值
console.log([1,2].toString()) // '1,2',轉成字符串,與右邊數據相等
var a = {}
console.log(a == "[object Object]") // true
// 左邊轉換過程
console.log(a.valueOf()) // {}
console.log({}.toString()) // "[object Object]",再進行比較
複製代碼
console.log(![] == 0) // true 解析:空數組轉換布爾型是true,取非後爲false;false跟數字0比較,
布爾型被Number後爲0,0 == 0
console.log([] == ![]) // true [].valueOf().toString()=>''; ![] => false 關係運算符將兩邊轉成Number型進行比較,Number('') => 0; Number(false) => 0
console.log({} == !{}) // false 邏輯非優先級高,實際上是{}和!{},這個邏輯表達式的比較,按照複雜類型隱式轉換規則,需經過valueOf和toString轉換後進行比較
複製代碼
console.log([] == []) // false 數組爲引用類型,在堆中存放的是兩份不一樣的數據,因此比較結果不相等
console.log({} == {}) // false,同理,{}爲引用類型,結果不相等
複製代碼
本文主要講了如下幾點:
+
號鏈接操做數時的隱式轉換規則你掌握了js數據類型隱式轉換的方法了嗎
參考連接:
blog.csdn.net/itcast_cn/a… www.w3school.com.cn/js/pro_js_v… tc39.es/ecma262/
快狗打車前端團隊專一前端技術分享,按期推送高質量文章,歡迎關注點贊。