2010-09-17 65 views
77

最近,當我想出這個錯誤時,我通過JSLint運行了一些我的代碼。我認爲這個錯誤很有趣,但是它會自動假定所有==應該是===。JSLint預期'===',而是看到'=='

這真的有什麼意義嗎?我可以看到很多不想比較類型的實例,我擔心這會導致問題。

「期待」這個詞意味着這個應該每一次都完成......這對我來說是沒有意義的。

+6

我的JSLint跑進這一點。我做了從==到===的更新,它實際上破壞了以前的工作代碼。 – kemiller2002 2010-09-17 14:01:44

+4

如果你的代碼有超過100行,它不會傳遞jslint,真的,這是不可能的。 – 2010-09-17 14:32:25

+3

「Broke」一詞太強大。它改變了你的代碼的含義。如果你正在做'myVar == null'檢查,是的,很大的變化。 ; ^)克羅克福德的觀點是,它使代碼的含義更加精確,這很難說明問題。 – ruffin 2013-03-16 12:52:42

回答

107

IMO,盲目使用===,但不嘗試瞭解如何類型轉換作品沒有太大的意義。

主要擔心約等於運算==是根據比較可以使運營商非傳遞的類型,例如,如果比較規則:

A == B AND 
B == C 

並沒有真正保證:

A == C 

例如:

'0' == 0; // true 
0 == ''; // true 
'0' == ''; // false 

嚴格等於運算===是不是真的有必要,當你比較同類型的值,最常見的例子:

if (typeof foo == "function") { 
    //.. 
} 

我們比較typeof運營商,這總是一個的結果,具有字符串字面 ...

或者當你知道類型強制規則,例如,檢查,如果事情是nullundefined東西:

if (foo == null) { 
    // foo is null or undefined 
} 

// Vs. the following non-sense version: 

if (foo === null || typeof foo === "undefined") { 
    // foo is null or undefined 
} 
+3

+1,說明問題的答案 – Jakob 2010-09-17 14:36:46

+0

@Jakob:謝謝! – CMS 2010-09-17 14:45:42

+0

[JSHint](http://www.jshint.com) - 這就像jslint的擴展版本 - 可以選擇不特別警告你「關於== null」檢查。 – 2012-11-14 10:33:04

2

那麼它不能真正引起問題,它只是給你建議。要麼接受,要麼離開它。這就是說,我不確定它有多聰明。可能有其中沒有將其作爲問題呈現的背景。

+0

但爲什麼使用「預期」一詞?這聽起來像你應該一直這樣做。 – Metropolis 2010-09-17 14:52:26

+4

評估者正在尋找有效的響應,因爲它試圖驗證它。如果它沒有得到有效的答覆,那麼它不是它所期望的。驗證器首先假設一切正常,然後在遍歷代碼時指出錯誤。它不一定了解什麼是無效回覆,只是知道什麼時候它看到一個無效迴應。它也可能反過來,根據不好的規則故意搜索錯誤的代碼。白名單與黑名單。 – Rushyo 2010-09-17 15:23:07

+0

問題是「這真的有意義嗎?」。鑑於這個問題,是的,它的確如此。此外,這是*五年前*。耶穌。 – Rushyo 2016-05-27 15:41:16

14

請記住,JSLint強制一個人認爲什麼樣的JavaScript應該是什麼。實施其所建議的更改時,您仍然必須使用常識。

通常情況下,比較類型和值會使代碼更安全(當類型轉換不符合您的想法時,您將不會遇到意外的行爲)。

+4

另外它不能像程序員那樣作爲上下文智能。這只是基於大多數用戶被系統固有的自動類型轉換而絆倒(比如暴力 - 「幫助我被壓制!」) – Rudu 2010-09-17 14:04:38

7

引自http://javascript.crockford.com/code.html

===和==操作符!

使用 ===和!==運算符幾乎總是更好。 ==和!=運算符會輸入強制類型。特別是,在 中,請不要使用==比較 與falsy值。

JSLint非常嚴格,他們的'webjslint.js'甚至沒有通過他們自己的驗證。

+0

很好的說明。這是真的,關於'webjslint.js'沒有驗證 - 儘管我現在看到的大部分錯誤都與間距有關。顯然,在使用JSLint檢查JavaScript時,必須使用常識和合理的判斷。 – hotshot309 2011-12-28 19:26:50

+0

「永遠」這個詞的使用會自動使這個引用不符合智慧。聰明的程序員不是教條式的。他們使用在特定情況下最好的。他們歡迎並接受任何內置於該語言核心的工具,而不僅僅是用「永遠不碰它」來解僱它。底線:我的代碼較短(不僅僅是保存一個'='字符),因此我的網站加載速度更快,帶寬成本更低,因此我的用戶服務更好。 – 2015-09-16 21:20:44

22

JSLint本質上比Javascript語法允許的更具防禦性。

從JSLint的文檔:

==!=運營商做比較之前強制類型轉換。這很糟糕,因爲它會導致' \t\r\n' == 0爲真。這可以掩蓋類型錯誤。

當比較下列任何值,使用===!==運營商(其中不做強制類型轉換):0 '' undefined null false true

如果你只關心一個值是truthyfalsy,然後使用簡寫。取而代之的

(foo != 0)

只是說

(foo)

和替代

(foo == 0)

(!foo)

===!==運營商是優選的。

+0

尼斯提醒使用(!foo)而不是(foo == 0)。謝謝! – 2013-10-22 18:02:24

+4

我必須從JSLint的工作中總結出一些非常高的象牙塔的工作,他們從來沒有離開過。 Javascript被設計爲與'=='運算符一起使用。 '==='是一個特殊情況... JSLint試圖使它看起來像使用'=='會有點不對......然而,試試這個:var x = 4,y = new Number(4) ; if(x == y){alert('Javascript depends on == just embrace it!');}'。原始類型具有替代它們的對應類('Number','String'),Javascript依賴於== ==運算符來比較這些自然類型。 – 2015-09-16 21:16:20

12

三重等於是雙等於不同的,因爲除了檢查雙方是否爲相同值,三重等於還檢查它們是相同的數據類型。

因此("4" == 4)爲真,而("4" === 4)爲假。

三重平等也運行得稍微快一些,因爲在給出答案之前,JavaScript不必浪費時間進行任何類型的轉換。

JSLint故意將您的JavaScript代碼儘可能嚴格地執行,以減少隱含的錯誤。它強調了這種事情,試圖讓你以強制你尊重數據類型的方式進行編碼。

但是關於JSLint的好處是它只是一個指南。正如他們在網站上所說的那樣,即使您是一位非常優秀的JavaScript程序員,也會傷害您的感受。但是你不應該覺得有義務遵循它的建議。如果你已經閱讀了它所說的並且你理解了它,但是你確定你的代碼不會被破壞,那麼你就沒有強迫你改變任何東西。

你甚至可以告訴JSLint忽略檢查類別,如果你不想被警告說你不會做任何事情。

+3

我沒有問「什麼是===」,所以我不確定你爲什麼回答它。 – Metropolis 2010-09-17 15:48:12

+6

@大都會:如果沒有其他原因,那麼作爲背景,以防其他人閱讀不知道的答案。不過,我在後面的段落中試圖回答你的問題。 – Spudley 2010-09-17 16:05:02

+0

@Spudley + 1的額外和有用的信息 – 2014-02-16 01:31:03

2

爲了說明這個問題,也解釋了爲什麼NetBeans的(從)7.3已經開始出現這樣的警告,這是從NetBeans錯誤跟蹤響應的摘錄有人舉報這個bug時:

這是件好事練習在JavaScript中使用===而不是==。

==和!=運算符在比較之前進行類型強制轉換。這很糟糕,因爲 它導致'\ t \ r \ n'== 0爲真。這可以掩蓋類型錯誤。 JSLint不能 可靠地確定==是否正確使用,所以最好不要使用== 和!=,並始終使用更可靠的===和!==運算符 代替。

Reference

+1

我發現這個錯誤剛剛使用Netbeans。奇怪的是,由於他們提供了奇怪的例子,他們會以嚴重警告的方式處理這個問題。 – oMiKeY 2017-12-20 16:43:29

+0

@oMiKeY你是什麼意思?這聽起來對我是正確的。 – 2017-12-21 14:35:54

+1

我的意思是,這是真的,但有很多用例,其中的人知道兩個比較的東西將是相同的類型,所以看起來很奇怪,由於這種奇怪的情況下,回車可能會比較數字零是==所有用法被認爲是錯誤的原因。我發現儘管===更快,因爲沒有完成類型轉換。我很驚訝我在netbeans之前沒有發現這一點。 – oMiKeY 2017-12-21 14:57:51

2

如果你想測試falsyness。 JSLint的不允許

if (foo == null) 

但允許

if (!foo) 
+0

使用'===',JSLint建議。 – 2015-06-24 19:56:04

+1

@NarawaGames這個解決方案是完全可以接受的。 – 2015-06-24 21:32:53

+0

這個答案不好。事情是這兩個都意味着別的東西。 'foo == null'檢查是否爲空或未定義。 '!foo'檢查null,undefined,0和空字符串。 – Markos 2016-03-31 13:54:39

相關問題