成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript:什么時(shí)候能用==

開(kāi)發(fā) 前端
給JavaScript初學(xué)者的建議是:完全忘掉==,總是使用===.實(shí)踐證明,這樣做是完全正確的.有五種案例看起來(lái)可以反駁這一論點(diǎn),但其實(shí)沒(méi)有.從現(xiàn)在開(kāi)始,我們的指導(dǎo)原則是:

答案是:永遠(yuǎn)不要用.本文依次否定了五種看起來(lái)可以使用==的地方,同時(shí)解釋了為什么.

JavaScript中有兩個(gè)運(yùn)算符用來(lái)判斷兩個(gè)值是否相等:

嚴(yán)格相等運(yùn)算符===,必須類型相同且值相同.

普通的(寬容的)相等運(yùn)算符==,在比較值是否嚴(yán)格相等之前,首先進(jìn)行類型轉(zhuǎn)換.

給JavaScript初學(xué)者的建議是:完全忘掉==,總是使用===.實(shí)踐證明,這樣做是完全正確的.有五種案例看起來(lái)可以反駁這一論點(diǎn),但其實(shí)沒(méi)有.從現(xiàn)在開(kāi)始,我們的指導(dǎo)原則是:

比起簡(jiǎn)潔,我們更喜歡意圖清晰的代碼.

記住:你的代碼只寫(xiě)一次,但可能要讀很多次 – 請(qǐng)盡可能的讓你的代碼易讀.

案例1:你知道你在比較什么

例如,如果使用的是typeof操作符,你可以確定它返回來(lái)的是個(gè)字符串.那么使用==就是安全的,因?yàn)槲覀兛梢源_定這樣的比較不會(huì)有任何的類型轉(zhuǎn)換:

  1. if (typeof x == "function") {  
  2.     ...  

可是,有兩個(gè)理由讓我們不去這樣做:

一致性: 如果你在這里使用了==,你不會(huì)得到任何的好處,那還何必破壞統(tǒng)一的規(guī)則去使用它?

簡(jiǎn)單和性能: 通常來(lái)說(shuō), === 的操作更簡(jiǎn)單,因?yàn)樗挥萌マD(zhuǎn)換它的操作數(shù).在不同的JavaScript引擎上,該運(yùn)算符的性能表現(xiàn)不同,但在大部分瀏覽器上,===總比==快,至少不會(huì)慢.

案例2: 比較undefined和null

使用==來(lái)比較的話,undefined和null是在一個(gè)相同的等價(jià)類上 – 他們和自己相等,同時(shí)互相之間也相等,但是不和其他任何值相等(包括那些JavaScript中的假值):

  1. null == null 
  2. true 
  3. > undefined == null 
  4. true 
  5. false == null 
  6. false 
  7. > 0 == null 
  8. false 

因此,下面的if語(yǔ)句可以檢測(cè)x是null或者是undefined(譯者注:一箭雙雕,jQuery1.81源碼中有36處地方使用了== null).

  1. if (x == null) {  
  2.      ...  

可是,代碼的簡(jiǎn)潔性完全被代碼缺少明確的意圖這一缺點(diǎn)抵消掉了: 如果需要檢測(cè)undefined值,那你還不如把它也寫(xiě)上. 否則,如果一個(gè)JavaScript新手讀你的代碼,他們會(huì)覺(jué)的你只是在檢測(cè)null.如果一個(gè)老手讀你的代碼,他們也許會(huì)認(rèn)為也許是你犯了一個(gè)錯(cuò),這里應(yīng)該用的是 ===.

  1. if (x === undefined || x === null) {  
  2.     ...  

如果你的需求不是那么的嚴(yán)格,那么上面的代碼可以簡(jiǎn)寫(xiě)為

  1. if (!x) {  
  2.     ...  

只要x為下面列出的這些假值,條件檢測(cè)就會(huì)通過(guò).

  1. undefined  
  2. null 
  3. false 
  4. 0  
  5. "" 

譯者注:5種原始值類型中,剛好各有一個(gè)假值?不對(duì),少了個(gè)NaN

案例3: 比較字符串和數(shù)字

案例場(chǎng)景是:你正在寫(xiě)和用戶界面交互的代碼或者處理服務(wù)器返回參數(shù)的代碼.那么你很可能需要處理字符串類型的數(shù)字.如果x是這樣一個(gè)字符串,你可以這樣比較它:

  1. if (x == 123) {  
  2.     ...  

但是為什么不告訴讀你代碼的人x不是一個(gè)數(shù)字呢,更好的寫(xiě)法是明確的將它轉(zhuǎn)換成數(shù)字再進(jìn)行比較.

  1. if (Number(x) === 123) {  
  2.     ...  

案例4: 比較對(duì)象值和原始值

使用 ==,你可以比較兩個(gè)原始值,也可以比較一個(gè)原始值和它的包裝類型對(duì)象值:

  1. function isAbc(x) { return x == "abc" }  
  2. > isAbc("abc")  
  3. true 
  4. > isAbc(new String("abc"))  
  5. true 

使用 === 的話,不行:

  1. new String("abc") === "abc" 
  2. false 

等號(hào)左邊是一個(gè)對(duì)象值,等號(hào)右邊是一個(gè)原始值.因此,他們沒(méi)有相同的類型,也就不能?chē)?yán)格相等.盡管如此,你仍然應(yīng)該優(yōu)先考慮,如何才能讓讀你代碼的人清楚的知道你這行代碼的意圖.如果用下面這個(gè)判斷的話

  1. x == "abc" 

你想要完成的任務(wù)是什么?

左側(cè)的值真的既可能是一個(gè)字符串包裝對(duì)象又可能是一個(gè)字符串原始值嗎?這似乎不太可能,但如果真是這樣的話,你應(yīng)該在文檔中很清楚的寫(xiě)明這到底是個(gè)什么樣的操作.

你是想把對(duì)象值轉(zhuǎn)換成原始值嗎? 那么你可以寫(xiě)的更明確一點(diǎn)

  1. String(x) === "abc" 

你是想要拆箱出一個(gè)原始值嗎?那么你應(yīng)該這么寫(xiě)

  1. x.valueOf() === "abc" 

案例5: JavaScript是很靈活的 – 我寫(xiě)的代碼也應(yīng)該如此

這個(gè)論點(diǎn)是這樣的:我希望我的代碼能表現(xiàn)出和JavaScript同樣的靈活性.并且 == 能幫我實(shí)現(xiàn)它.下面是體現(xiàn)JavaScript靈活性的例子,它能自動(dòng)轉(zhuǎn)換值的類型:

  1. "abc" + false 
  2. 'abcfalse' 
  3. > 3 + true 
  4. 4  
  5. > +"73" 
  6. 73 

下面是上述論點(diǎn)的幾個(gè)反駁:

標(biāo)準(zhǔn)的隱式轉(zhuǎn)換并不可能總是符合你的期望.例如:

  1. > !"false" 
  2. false 
  3. > 7 + "3" 
  4. '73' 
  5. > Number("")  

寬容的相等判斷和通常見(jiàn)到的隱式轉(zhuǎn)換有著不同的表現(xiàn):

  1. > 2 == false 
  2. false 
  3. > 2 == true 
  4. false 
  5. > Boolean(2)  
  6. true 

明確的類型轉(zhuǎn)化加上嚴(yán)格的相等判斷能夠產(chǎn)生更具描述性的代碼.不好的寫(xiě)法:用寬容相等來(lái)實(shí)現(xiàn)靈活性

  1. function is123Implicit(x) {  
  2.     return x == 123;  
  3. }  
  4. > is123Implicit(123)  
  5. true 
  6. > is123Implicit(new Number(123))  
  7. true 
  8. > is123Implicit("123")  
  9. true 

替代方法: 明確的類型轉(zhuǎn)換加嚴(yán)格相等實(shí)現(xiàn)靈活性:

  1. function is123Explicit(x) {  
  2.     x = Number(x);  
  3.     return x === 123;  
  4. }  
  5. > is123Explicit(123)  
  6. true 
  7. > is123Explicit(new Number(123))  
  8. true 
  9. > is123Explicit("123")  
  10. true 

誰(shuí)說(shuō)你的代碼必須要靈活?可以說(shuō)JavaScript這種默認(rèn)的靈活性是一個(gè)bug而不是特性.編寫(xiě)防御型的代碼能更快的暴露出這些bug.一個(gè)更有防御性的函數(shù)is123Explicit()如下:

  1. function is123Defensive(x) {  
  2.     if (typeof x !== "number") {  
  3.         throw new TypeError("Not a number: "+x);  
  4.     }  
  5.     return x === 123;  
  6. }  

如果你想傳入一個(gè)非數(shù)字原始值的參數(shù),那么你得首先進(jìn)行類型轉(zhuǎn)換.

結(jié)論

我希望我已經(jīng)說(shuō)服了你,應(yīng)該堅(jiān)持以淺顯易懂為原則,堅(jiān)決不使用==來(lái)做判斷.這樣做是有道理的,不光針對(duì)新手,通常來(lái)說(shuō),代碼中有更少技巧性的東西,就意味著代碼有更好的可讀性。

原文鏈接:http://www.cnblogs.com/ziyunfei/archive/2012/09/22/2696109.html

責(zé)任編輯:張偉 來(lái)源: 紫云飛的博客
相關(guān)推薦

2020-05-12 11:25:50

MySQLES數(shù)據(jù)庫(kù)

2017-05-15 09:55:07

2015-07-08 15:55:01

NSStringcopystrong

2013-11-28 16:03:24

2022-09-08 09:42:26

JavaScripMapObject

2017-06-28 15:06:51

PythonLambda函數(shù)

2022-05-19 10:27:34

機(jī)器學(xué)習(xí)人工智能

2024-08-05 01:22:16

2021-08-13 11:31:23

HTTP

2020-01-05 23:28:51

MQ消息進(jìn)程

2021-01-30 19:59:37

性能項(xiàng)目開(kāi)源

2023-06-06 16:54:00

2015-02-01 09:45:46

2015-03-02 14:44:48

AngularJS jQuery超越

2011-10-18 16:41:23

編程

2017-04-05 21:43:08

MQ互聯(lián)網(wǎng)架構(gòu)

2012-07-26 10:27:31

PHP

2025-05-15 08:50:00

MQRPC架構(gòu)

2021-09-29 09:24:21

GCGo STW

2015-10-20 15:59:57

注釋代碼程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 91精产国品一二三区 | 久久国产麻豆 | 日韩欧美三区 | 久久久网| 亚洲综合字幕 | 毛片免费观看视频 | 精品国产一区二区国模嫣然 | 91麻豆精品国产91久久久更新资源速度超快 | 91九色在线观看 | 一区二区三区电影在线观看 | 九九亚洲| 国产一级在线 | 欧美中文字幕一区 | 国产乱码精品一区二区三区忘忧草 | 日日射影院| 视频三区 | 久综合| 精品一区免费 | 国产中文字幕在线观看 | 在线播放一区二区三区 | 成人国产精品久久久 | 中文字幕亚洲一区二区三区 | 人人看人人干 | 国产1区| 天天av综合| 国产一区www | 九九国产| 成人国产精品免费观看 | wwwxxx国产| a久久 | 一级毛片免费完整视频 | www.玖玖玖| 中文字幕久久精品 | 最新一级毛片 | 亚洲狠狠 | 成人在线视频免费看 | 欧美在线激情 | 91中文字幕在线观看 | h免费观看 | 中文字幕三区 | 99精品国产在热久久 |