最近,當我想出這個錯誤時,我通過JSLint運行了一些我的代碼。我認爲這個錯誤很有趣,但是它會自動假定所有==應該是===。JSLint預期'===',而是看到'=='
這真的有什麼意義嗎?我可以看到很多不想比較類型的實例,我擔心這會導致問題。
「期待」這個詞意味着這個應該每一次都完成......這對我來說是沒有意義的。
最近,當我想出這個錯誤時,我通過JSLint運行了一些我的代碼。我認爲這個錯誤很有趣,但是它會自動假定所有==應該是===。JSLint預期'===',而是看到'=='
這真的有什麼意義嗎?我可以看到很多不想比較類型的實例,我擔心這會導致問題。
「期待」這個詞意味着這個應該每一次都完成......這對我來說是沒有意義的。
IMO,盲目使用===
,但不嘗試瞭解如何類型轉換作品沒有太大的意義。
主要擔心約等於運算==
是根據比較可以使運營商非傳遞的類型,例如,如果比較規則:
A == B AND
B == C
並沒有真正保證:
A == C
例如:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
嚴格等於運算===
是不是真的有必要,當你比較同類型的值,最常見的例子:
if (typeof foo == "function") {
//..
}
我們比較typeof
運營商,這總是一個串的結果,具有字符串字面 ...
或者當你知道類型強制規則,例如,檢查,如果事情是null
或undefined
東西:
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
}
那麼它不能真正引起問題,它只是給你建議。要麼接受,要麼離開它。這就是說,我不確定它有多聰明。可能有其中沒有將其作爲問題呈現的背景。
但爲什麼使用「預期」一詞?這聽起來像你應該一直這樣做。 – Metropolis 2010-09-17 14:52:26
評估者正在尋找有效的響應,因爲它試圖驗證它。如果它沒有得到有效的答覆,那麼它不是它所期望的。驗證器首先假設一切正常,然後在遍歷代碼時指出錯誤。它不一定了解什麼是無效回覆,只是知道什麼時候它看到一個無效迴應。它也可能反過來,根據不好的規則故意搜索錯誤的代碼。白名單與黑名單。 – Rushyo 2010-09-17 15:23:07
問題是「這真的有意義嗎?」。鑑於這個問題,是的,它的確如此。此外,這是*五年前*。耶穌。 – Rushyo 2016-05-27 15:41:16
請記住,JSLint強制一個人認爲什麼樣的JavaScript應該是什麼。實施其所建議的更改時,您仍然必須使用常識。
通常情況下,比較類型和值會使代碼更安全(當類型轉換不符合您的想法時,您將不會遇到意外的行爲)。
另外它不能像程序員那樣作爲上下文智能。這只是基於大多數用戶被系統固有的自動類型轉換而絆倒(比如暴力 - 「幫助我被壓制!」) – Rudu 2010-09-17 14:04:38
引自http://javascript.crockford.com/code.html:
===和==操作符!
使用 ===和!==運算符幾乎總是更好。 ==和!=運算符會輸入強制類型。特別是,在 中,請不要使用==比較 與falsy值。
JSLint非常嚴格,他們的'webjslint.js'甚至沒有通過他們自己的驗證。
很好的說明。這是真的,關於'webjslint.js'沒有驗證 - 儘管我現在看到的大部分錯誤都與間距有關。顯然,在使用JSLint檢查JavaScript時,必須使用常識和合理的判斷。 – hotshot309 2011-12-28 19:26:50
「永遠」這個詞的使用會自動使這個引用不符合智慧。聰明的程序員不是教條式的。他們使用在特定情況下最好的。他們歡迎並接受任何內置於該語言核心的工具,而不僅僅是用「永遠不碰它」來解僱它。底線:我的代碼較短(不僅僅是保存一個'='字符),因此我的網站加載速度更快,帶寬成本更低,因此我的用戶服務更好。 – 2015-09-16 21:20:44
JSLint本質上比Javascript語法允許的更具防禦性。
從JSLint的文檔:
的
==
和!=
運營商做比較之前強制類型轉換。這很糟糕,因爲它會導致' \t\r\n' == 0
爲真。這可以掩蓋類型錯誤。當比較下列任何值,使用
===
或!==
運營商(其中不做強制類型轉換):0 '' undefined null false true
如果你只關心一個值是truthy或falsy,然後使用簡寫。取而代之的
(foo != 0)
只是說
(foo)
和替代
(foo == 0)
說
(!foo)
的
===
和!==
運營商是優選的。
尼斯提醒使用(!foo)而不是(foo == 0)。謝謝! – 2013-10-22 18:02:24
我必須從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
三重等於是雙等於不同的,因爲除了檢查雙方是否爲相同值,三重等於還檢查它們是相同的數據類型。
因此("4" == 4)
爲真,而("4" === 4)
爲假。
三重平等也運行得稍微快一些,因爲在給出答案之前,JavaScript不必浪費時間進行任何類型的轉換。
JSLint故意將您的JavaScript代碼儘可能嚴格地執行,以減少隱含的錯誤。它強調了這種事情,試圖讓你以強制你尊重數據類型的方式進行編碼。
但是關於JSLint的好處是它只是一個指南。正如他們在網站上所說的那樣,即使您是一位非常優秀的JavaScript程序員,也會傷害您的感受。但是你不應該覺得有義務遵循它的建議。如果你已經閱讀了它所說的並且你理解了它,但是你確定你的代碼不會被破壞,那麼你就沒有強迫你改變任何東西。
你甚至可以告訴JSLint忽略檢查類別,如果你不想被警告說你不會做任何事情。
我沒有問「什麼是===」,所以我不確定你爲什麼回答它。 – Metropolis 2010-09-17 15:48:12
@大都會:如果沒有其他原因,那麼作爲背景,以防其他人閱讀不知道的答案。不過,我在後面的段落中試圖回答你的問題。 – Spudley 2010-09-17 16:05:02
@Spudley + 1的額外和有用的信息 – 2014-02-16 01:31:03
爲了說明這個問題,也解釋了爲什麼NetBeans的(從)7.3已經開始出現這樣的警告,這是從NetBeans錯誤跟蹤響應的摘錄有人舉報這個bug時:
這是件好事練習在JavaScript中使用===而不是==。
==和!=運算符在比較之前進行類型強制轉換。這很糟糕,因爲 它導致'\ t \ r \ n'== 0爲真。這可以掩蓋類型錯誤。 JSLint不能 可靠地確定==是否正確使用,所以最好不要使用== 和!=,並始終使用更可靠的===和!==運算符 代替。
我發現這個錯誤剛剛使用Netbeans。奇怪的是,由於他們提供了奇怪的例子,他們會以嚴重警告的方式處理這個問題。 – oMiKeY 2017-12-20 16:43:29
@oMiKeY你是什麼意思?這聽起來對我是正確的。 – 2017-12-21 14:35:54
我的意思是,這是真的,但有很多用例,其中的人知道兩個比較的東西將是相同的類型,所以看起來很奇怪,由於這種奇怪的情況下,回車可能會比較數字零是==所有用法被認爲是錯誤的原因。我發現儘管===更快,因爲沒有完成類型轉換。我很驚訝我在netbeans之前沒有發現這一點。 – oMiKeY 2017-12-21 14:57:51
如果你想測試falsyness。 JSLint的不允許
if (foo == null)
但允許
if (!foo)
使用'===',JSLint建議。 – 2015-06-24 19:56:04
@NarawaGames這個解決方案是完全可以接受的。 – 2015-06-24 21:32:53
這個答案不好。事情是這兩個都意味着別的東西。 'foo == null'檢查是否爲空或未定義。 '!foo'檢查null,undefined,0和空字符串。 – Markos 2016-03-31 13:54:39
我的JSLint跑進這一點。我做了從==到===的更新,它實際上破壞了以前的工作代碼。 – kemiller2002 2010-09-17 14:01:44
如果你的代碼有超過100行,它不會傳遞jslint,真的,這是不可能的。 – 2010-09-17 14:32:25
「Broke」一詞太強大。它改變了你的代碼的含義。如果你正在做'myVar == null'檢查,是的,很大的變化。 ; ^)克羅克福德的觀點是,它使代碼的含義更加精確,這很難說明問題。 – ruffin 2013-03-16 12:52:42