js 隱式類型轉換

js是一門弱類型的語言,他在聲明變量的時候不須要指定類型,對變量賦值也沒有類型的檢測,因此js是很是的靈活的,可是有時候也會出現一些很是匪夷所思的問題es6

隱式類型轉換定義

console.log(1+'1')

看這句代碼 一個數字1 和一個字符串1 他們的類型是不一樣的 可是咱們並無對他進行任何的操做,可是打印出來的結果是一個11的字符串算法

隱式類型轉換就是指,數據的類型在不用人工干預的狀況下進行轉換的行爲code

js的數據類型

這個可真的是老生常談了,很是常見,簡單說一下js有7中數據類型對象

基本類型
  • Boolean 布爾值
  • Null 空
  • Undefined 未定義
  • Number 數字
  • String 字符串
  • Symbol es6新增的一種基本數據類型一種相似於標記的一個數據類型我是這麼理解的,
    這個接觸很少,應該沒有人會用這個去作類型轉換的吧。。。
引用類型(Object)
  • Object 類型
  • Array 類型
  • Date 類型
  • RegExp 類型
  • Function 類型

上邊說的這些其實他們都是引用類型(Object)字符串

js在作數據類型轉換的時候都作了什麼

如本片博客的最上邊的那個例子,不一樣的數據類型,再進行轉換的時候作了什麼,何時會觸發隱式類型轉換呢原型

首先是各類的運算符,好比說 + 或者 ==博客

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的原生類型內建的包裝對象

  • 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的字符串

感受隱式類型轉換,平日裏隨處可見,但願你們多敲多體會吧

相關文章
相關標籤/搜索