2014-03-31 51 views
4

我有類似下面的JavaScript代碼:用力不當比較,拋出一個警告/錯誤在JavaScript

var data = {"d": 12345}; 
for(var i = 0; i < data.length; ++i) { 
    console.log(i); 
} 

我知道,因爲data.length將「未定義」 for循環將不執行任何週期和

0 < 'undefined' //false (I think this is false for any int?) 

不管怎麼說,而我定我的代碼(在我的代碼,數據包含一個數組,但我不小心被引用data.length代替data.myarr.length)我希望能避免此類問題未來 - 花了我相當長的時間來找到這個錯誤。

我一直在讀strict mode in JavaScript,但在messing around with JSFiddle之後,我無法獲得嚴格的模式將上述內容當作錯誤。我試着將整個劇本都嚴格的考慮在內,然後,考慮到可能存在衝突,在自己的方法中嘗試過,並且一無所獲。

有沒有辦法強制「無意義」的比較,如int <「undefined」引發錯誤(甚至是警告)?我錯過了嚴格模式的東西嗎?或者是語言設計應該允許這樣的事情?

+0

我不知道這是可能的,但我不是那些可以肯定地說任何類似的語言愛好者之一。我第一次嘗試它時,會嘗試創建一些輔助函數,它會爲您執行比較,爲不匹配的輸入或不正確的結果拋出異常。 – ChaseMoskal

+0

是的。我知道如何檢查未定義的,我不需要真的在我的代碼中執行它。我只是想在未來拯救我自己和其他人的時間。 –

+0

是的,我能看到的唯一方法就是制定一個標準化的比較功能,讓您和您的整個團隊都可以使用這種比較功能對所有性質進行比較,將異常事件作爲早期預警系統。對於可能跳出來介紹這樣的事情的邊緣優化案例來說,可能並不是很誇張=/ – ChaseMoskal

回答

2

JavaScript本身沒有任何東西可以挑選出來。

我沒有跟蹤JS Lint的最新進展,但我不知道任何有幫助的地方。

另一方面,TypeScript處理這種情況很好。

正如頭部起來 - 這不是可以改變Javascript而不會破壞現有的代碼。有足夠的array like對象具有length屬性和一個迭代的數字命名屬性名稱。

  • arguments關鍵字
  • 節點列表
2

AFAIK,有實現你以後沒有真正的方法。因爲int < undefined是一個完美的比較。

對於這個特定的問題,你可以做的一件事是使用Array.forEach(MDN)。因爲data.forEachundefined,並試圖調用一個函數會失敗(除非你有一個函數值的數據增加了「的forEach」鍵,當然的),這將引發錯誤:

var data = {"d": 12345}; 
data.forEach(function(item, index, array){ 
    console.log(index); 
}); 

注, IE < 9沒有Array.forEach,所以你需要將它添加到Array的原型。在這裏看到更多,包括如何做,在Array.prototype.forEach() on MDN

+0

不是一個壞主意,儘管在我的實際代碼中,我非常依賴使用i的值。我可以在循環外創建一個計數器,但希望不要。我對Java更熟悉,但是你知道JavaScript是否通過執行forEach而不是for? (具體來說,它是否暫時創建當前對象的副本?) –

+1

@MatthewHerbst啊,你確實得到了索引,作爲回調函數中的第二個參數......應該包含它。我已經改變了答案:) – rgthree

+0

哦,甜美!謝謝!我給了另一篇文章的答案,因爲你們基本上都說了同樣的話,但是他在幾分鐘內就打敗了你。但我真的很欣賞forEach idea/info!再次感謝 –

1

在ES6,你可以通過for...of使用迭代器,這將導致一個錯誤,因爲非數組對象不是可迭代:

for (var x of data) { } 

你將不得不作出其他安排,如果你也想索引。