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