javascript
JS中的数据类型转换
ES5中一共有6種數據類型,其中5種基本類型(String、Number、Boolean、Null、Undefined),1種引用類型(Object)?;绢愋椭悼梢韵嗷Q轉換,并且引用類型值也可以通過某種方式轉換成基本類型值。
引用類型值轉換為基本類型值的方法有兩個,分別是 valueOf方法和toString方法。
強制轉換為基本類型值可以使用各自的函數 String,Boolean, Number。
轉換為String
| String | “a” | “a” |
| Number | 1 | “1” |
| Boolean | true | “true” |
| Boolean | false | “false” |
| Null | null | “null” |
| Undefined | undefined | “undefined” |
| Object | {} | {}.toString() |
普通對象Object轉換為String,如果Object沒有自定義toString方法則默認返回對象的[[class]]屬性,如題如下:
1.自定義對象具有toString方法
var a = {toString: function(){return '我是toString的返回值';} }; String(a); //我是toString的返回值2.自定義對象并不具有toString方法
var a = {}; String(a); // [object Object]var b = []; String(b); // "" 數組有自定義的toString方法 將數組元素用 , 拼接成字符串并返回注:Number轉換為String稍微有點特殊,如果數字過大或者過小則用指數表示。
轉換為Number
| Number | 1 | 1 |
| String | “” | 0 |
| String | “1” | 1 |
| String | “1a” | NaN(數字的一種,意思是Not a Number) |
| Boolean | true | 1 |
| Boolean | false | 0 |
| Null | null | 0 |
| Undefined | undefined | NaN |
| Object | {} | 調用 valueOf() 或者 toString() |
對象轉為Number類型步驟:
1.具有valueOf方法和toString方法的對象
var a = {valueOf: function(){return 1;},toString: function(){return '2';} } Number(a); // 12.只具有toString方法的對象
var a = {toString: function(){return '2';} } Number(a); //2 這個 2 是數字并不是字符串3.具有返回引用類型值得valueOf方法和toString方法
var a = {valueOf: function(){return {};},toString: function(){return {};} } Number(a); //TypeError 錯誤轉換為Boolean
在JS中所有值可以分為兩類真值和假值,對象(引用類型)一般都是真值。
| Boolean | true | true |
| Boolean | false | false |
| String | “1” | true |
| String | “” | false |
| Number | 0 | false |
| Number | 1 | true |
| Number | NaN | false |
| Object | {} | true |
隱式強制類型轉換
在JS中有很多的隱式強制類型轉換,在一些并不明顯的地方發生了強制類型轉換,例如加法運算符(+),減法運算符(-),邏輯運算符 && 和 ||等。
符號 + 中出現的隱式強制類型轉換
加法運算符既可以用作字符串的拼接,也可以用作數字的相加。
加法運算符的兩個操作數只要有一個是字符串則執行字符串的拼接,否則執行數字的相加。
var a = '1' + 1; console.log(a); // '11'var b = 1 + 1; console.log(2); // 2加法運算符的兩個操作數中如果有對象則遵循以下步驟:
調用 valueOf 方法,如果返回值是基本值則依據第一條繼續執行相加操作
如果返回值不是基本值則調用 toString 方法,如果返回值是基本值則依據第1條繼續執行相加操作
如果 toString 也不返回基本值則報錯
如果操作數中有Boolean,依據另一個操作數的類型來強制類型轉換
另一個操作數是String則將Boolean轉換為String,依據轉換為String規則
另一個操作數是Number則將Boolean轉換為Number,依據轉換為Number規則
根據以上規則經??吹降?a + '' 就不難理解了,就是要將a轉換為字符串。但是要注意的是a如果是對象的話和直接調用String(a)的結果在特定情況下還是有區別的。區別在于String方法并不會調用valueOf方法(但是正常情況下并不會自定義對象的valueOf方法)。
算術運算符中除了 + 以外的其他運算符都會將兩個操作數依據轉換為Number規則換為Number,然后在進行操作。
關于 [] + {} 和 {} + [] 得到結果不一樣的解釋
[] + {}; // 控制臺中結果是 "[object Object]"{} + []; // 控制臺中結果是 數字0[]轉為基本類型值為 “” 空子符串,{}轉為基本類型值為”[object Object]”則得到結果”[object Object]”
JS中以大括號開頭會被當做代碼塊,{} + [] 解釋為 +[]則得到了0
到Boolean類型值的隱式強制類型轉換
在以下語句和表達式中需要Boolean類型值的地方都會出現依據轉為Boolean規則向Boolean類型值轉換:
寬松等于(==)中的隱式強制類型轉換
在JS中寬松等于有很多讓人捉摸不透的地方例如 [] == false 返回的是true,但是 [] 顯然并不是假值但是卻相等,[]==![] 你猜的沒錯這個也返回true,"0"==false 你又才對了這個返回的還是true,我想說的是”0”并不是假值但是為什么還會返回true呢???
詳情請看 JS中令人捉摸不透的寬松等于
參考:
你不知道的javascript中卷
總結
以上是生活随笔為你收集整理的JS中的数据类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BOM(Browser Object M
- 下一篇: JS中捉摸不透的==(宽松等于)