JavaScript中的一些隱式轉(zhuǎn)換和總結(jié)(推薦)
js中的不同的數(shù)據(jù)類型之間的比較轉(zhuǎn)換規(guī)則如下:
1. 對(duì)象和布爾值比較
對(duì)象和布爾值進(jìn)行比較時(shí),對(duì)象先轉(zhuǎn)換為字符串,然后再轉(zhuǎn)換為數(shù)字,布爾值直接轉(zhuǎn)換為數(shù)字
[] == true; //false []轉(zhuǎn)換為字符串'',然后轉(zhuǎn)換為數(shù)字0,true轉(zhuǎn)換為數(shù)字1,所以為false
2. 對(duì)象和字符串比較
對(duì)象和字符串進(jìn)行比較時(shí),對(duì)象轉(zhuǎn)換為字符串,然后兩者進(jìn)行比較。
[1,2,3] == '1,2,3' // true [1,2,3]轉(zhuǎn)化為'1,2,3',然后和'1,2,3', so結(jié)果為true;
3. 對(duì)象和數(shù)字比較
對(duì)象和數(shù)字進(jìn)行比較時(shí),對(duì)象先轉(zhuǎn)換為字符串,然后轉(zhuǎn)換為數(shù)字,再和數(shù)字進(jìn)行比較。
[1] == 1; // true `對(duì)象先轉(zhuǎn)換為字符串再轉(zhuǎn)換為數(shù)字,二者再比較 [1] => '1' => 1 所以結(jié)果為true
4. 字符串和數(shù)字比較
字符串和數(shù)字進(jìn)行比較時(shí),字符串轉(zhuǎn)換成數(shù)字,二者再比較。
'1' == 1 // true
5. 字符串和布爾值比較
字符串和布爾值進(jìn)行比較時(shí),二者全部轉(zhuǎn)換成數(shù)值再比較。
'1' == true; // true
6. 布爾值和數(shù)字比較
布爾值和數(shù)字進(jìn)行比較時(shí),布爾轉(zhuǎn)換為數(shù)字,二者比較。
true == 1 // true
許多剛接觸js的童鞋看到這么多的轉(zhuǎn)換規(guī)則就懵圈了,其實(shí)規(guī)律很簡(jiǎn)單,大家可以記下邊這個(gè)圖
如圖,任意兩種類型比較時(shí),如果不是同一個(gè)類型比較的話,則按如圖方式進(jìn)行相應(yīng)類型轉(zhuǎn)換,如對(duì)象和布爾比較的話,對(duì)象 => 字符串 => 數(shù)值 布爾值 => 數(shù)值。
另外,我們來看下一些需要"特別照顧"的。
來看一個(gè)有趣的題
[] == false; ![] == false;
這兩個(gè)的結(jié)果都是true,第一個(gè)是,對(duì)象 => 字符串 => 數(shù)值0 false轉(zhuǎn)換為數(shù)字0,這個(gè)是true應(yīng)該沒問題,
第二個(gè)前邊多了個(gè)!,則直接轉(zhuǎn)換為布爾值再取反,轉(zhuǎn)換為布爾值時(shí),空字符串(''),NaN,0,null,undefined這幾個(gè)外返回的都是true, 所以! []這個(gè)[] => true 取反為false,所以[] == false為true。
還有一些需要記住的,像:
undefined == null //true undefined和null 比較返回true,二者和其他值比較返回false Number(null) //0
曾經(jīng)看到過這樣一個(gè)代碼: (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb
, 你敢相信, 當(dāng)時(shí)就嚇了 寶寶一跳。
剛接觸到時(shí)候,Js很讓我困惑,正是由于它‘善變',下面我來總結(jié)一下:
7. JS的數(shù)據(jù)類型: Number,Boolean,String,Undefined,Null,Symbol(es6新定義的)和 Object (注: Array是特殊的Object)
typeof 返回的7中類型: number boolean string object undefined object function
MDN 這樣介紹Javascript: JavaScript 是一種弱類型或者說動(dòng)態(tài)語(yǔ)言。這意味著你不用提前聲明變量的類型,在程序運(yùn)行過程中,類型會(huì)被自動(dòng)確定。這也意味著你可以使用同一個(gè)變量保存不同類型的數(shù)據(jù)
8. 下面來看下常見的隱式轉(zhuǎn)換:
基本類型:
運(yùn)算符(+,-,*,/,%)操作時(shí) 轉(zhuǎn)換類型
”+“ 號(hào)運(yùn)算符 :
總結(jié): 當(dāng)加號(hào)運(yùn)算符時(shí),String和其他類型時(shí),其他類型都會(huì)轉(zhuǎn)為 String;其他情況,都轉(zhuǎn)化為Number類型 , 注: undefined 轉(zhuǎn)化為Number是 為'NaN‘, 任何Number與NaN相加都為NaN。
其他運(yùn)算符時(shí), 基本類型都轉(zhuǎn)換為 Number,String類型的帶有字符的比如: '1a' ,'a1' 轉(zhuǎn)化為 NaN 與undefined 一樣。
tip:(1)NaN 不與 任何值相等 包括自身,所以判斷一個(gè)值 是否為 NaN, 即用 "!==" 即可?! ?/p>
(2) 轉(zhuǎn)換為 Boolean類型為 false 的有:null,0,'',undefined,NaN,false
?。?)number() 與 parseInt() 都可以將對(duì)象轉(zhuǎn)化為Number類型,Number函數(shù)要比parseInt函數(shù)嚴(yán)格很多?;旧?,只要有一個(gè)字符無法轉(zhuǎn)成數(shù)值,整個(gè)字符串就會(huì)被轉(zhuǎn)為NaN。
Object類型
當(dāng)object與基本類型運(yùn)算時(shí):
var obj = { toString: function(){ return 6; }, valueOf: function(){ return 5; } }; var obj1 = { valueOf: function(){ return 'a'; }, toString: function(){ return 'b'; } };
當(dāng)對(duì) obj,obj1 用Number()和String()換轉(zhuǎn)時(shí)
總結(jié): Number類型會(huì)先調(diào)用valueOf(), String類型會(huì)先調(diào)用toString(), 如果結(jié)果是原始值,則返回原始值,否則繼續(xù)用toString 或 valueOf(),繼續(xù)計(jì)算,如果結(jié)果還不是原始值,則拋出一個(gè)類型錯(cuò)誤;
看如下情況:
為什么 {} + [] = 0 ? 因?yàn)?javascript在運(yùn)行時(shí), 將 第一次{} 認(rèn)為是空的代碼塊,所以就相當(dāng)于 +[] = 0. 還有 {} +5 = 5, 同理。
總結(jié):
1. 類型錯(cuò)誤有可能會(huì)被類型轉(zhuǎn)換所隱藏。
2. “+”既可以表示字符串連接,又可以表示算術(shù)加,這取決于它的操作數(shù),如果有一個(gè)為字符串的,那么,就是字符串連接了。
3. 對(duì)象通過valueOf方法,把自己轉(zhuǎn)換成數(shù)字,通過toString方法,把自己轉(zhuǎn)換成字符串。
4.具有valueOf方法的對(duì)象,應(yīng)該定義一個(gè)相應(yīng)的toString方法,用來返回相等的數(shù)字的字符串形式。
5.檢測(cè)一些未定義的變量時(shí),應(yīng)該使用typeOf或者與undefined作比較,而不應(yīng)該直接用真值運(yùn)算。
總結(jié)
以上所述是小編給大家介紹的JavaScript中的一些隱式轉(zhuǎn)換和總結(jié)(推薦),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家的支持!
相關(guān)文章
使用3D引擎threeJS實(shí)現(xiàn)星空粒子移動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了使用3D引擎threeJS實(shí)現(xiàn)星空粒子移動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用
這篇文章主要介紹了TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用,Duck類型是一種動(dòng)態(tài)類型和多態(tài)形式,在duck類型中,重點(diǎn)是對(duì)象的行為可以做什么,而不是對(duì)象所屬的類型2022-08-08bootstrap flask登錄頁(yè)面編寫實(shí)例
這篇文章主要為大家詳細(xì)介紹了bootstrap flask登錄頁(yè)面編寫實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11一文詳解如何檢測(cè)并解決JS代碼中的死循環(huán)
這篇文章主要想和大家來一起探討一下能否通過靜態(tài)分析的方式檢測(cè)出死循環(huán),如果不能,我們又應(yīng)該如何在不借用其他線程的情況下,解決死循環(huán)卡住問題,感興趣的可以了解下2023-09-09JavaScript中eval和with語(yǔ)句如何影響作用域鏈的深度探索
這篇文章主要為大家介紹了JavaScript中eval和with語(yǔ)句如何影響作用域鏈的深度探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05uniapp實(shí)現(xiàn)日期時(shí)間選擇器
這篇文章主要為大家詳細(xì)介紹了uniapp實(shí)現(xiàn)日期時(shí)間選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10js實(shí)現(xiàn)圖片在未加載完成前顯示加載中字樣
首先判斷瀏覽器再判斷圖片是否加載完成,如果還未加載就顯示“加載中...”,思路及代碼如下2014-09-09