2016-03-07 24 views
3

我學習JavaScript和我寫了下面的代碼:如何檢測在JavaScript中使用無效屬性?

if (mystring.len > 0) { 
    // do stuff 
} 

我不小心用.len代替.length。令我驚訝的是,沒有提出任何錯誤。 mystring.len返回undefined,這使比較失敗,但代碼保持正確運行。我寧願提出一個實際的錯誤,以便我可以修復代碼。加入「嚴格使用」沒有幫助,也沒有jslint。

我知道有辦法積極檢查屬性是否存在,但是這不是我要找的。我想讓Javascript告訴我,當我在屬性名稱中輸入錯字時。

有沒有辦法使Javascript功能來給出一個錯誤在這種情況下?

+1

沒有,沒有,因爲沒有什麼錯碼是儘可能的JavaScript關注。 – Pointy

+0

FWIW,Visual Studio中的ReSharper會嘗試[標記這類事物](http://imgur.com/1Q90GQg),同時爲您提供預期屬性的智能感知 –

+0

考慮使用typescript而不是javascript,那東西會告訴您關於編譯前的一些拼寫錯誤 –

回答

5

都能跟得上 - 這是JavaScript的是如何工作的,它是非常有用的。誰說是檢查len是需要修復的東西?試想一下:

if(mystring.len === undefined) { 
    mystring.len = "Test"; 
} 

你能做的最好是簡單地檢查東西被定義使用前:

if(mystring.len !== undefined) { 
} 

我很欣賞的陌生感,以及它如何不感到強大的(最初來自C#背景),但不幸的是你不能做很多事情。 JavaScript區分大小寫的事實使這更令人沮喪。儘管如此,你將學會如何生活!

如果你真的想要運行一些靜態分析,那麼你可以考慮創建一個運行這種分析的轉譯器(例如Babel)的擴展 - 但是如果你預料到某些東西是undefined,是常見的地方。

編輯

下面是我會使用其中undefined是非常有用的一個真實的例子。我正在與一個需要將東西從一個地方移動到另一個地方的圖書館合作。它不能做到這一點,除非已經指定了原來的位置,所以我可能會寫一些像下面,初始化值,如果我沒有他們出於某種原因:

function update(node) { 
    if(node.x === undefined) { node.x = 0; }  
    node.y = node.y || 0; // This is the shorthand way I'd actually write it 

    // Do some other stuff 
}; 
+1

任何人都在意解釋downvote,所以我可以對我的答案做任何改進? – Ian

+0

確定它在某些情況下很有用,但如果我輸入'mystring.legnth'(注意錯字),我正在尋找幫助我的東西。 –

+1

@GraemePerrow:好的,但是正如我想在我的答案的第一部分中指出的那樣 - JavaScript引擎如何可能知道那裏有錯誤?不幸的是,一個未定義的屬性是一個常見的用例(例如,我還沒有初始化一個值) – Ian

1

「使用嚴格」(在我經驗),因此未被顯式聲明/實例化的變量將被引用,否則會引發錯誤(否則,JS將會立即創建一個新的變量)。所以這在這裏沒有幫助。

這聽起來好像是通常由編譯器在其他語言中拿起一個錯誤,但由於JS解釋,你會不會有那種明確的錯誤檢查,除非你在一個結實的IDE是的。你正在使用文本編輯器或其他東西來寫JS?

+2

所有現代瀏覽器現在編譯JS。該問題沒有解釋與編譯。這是一個語言設計問題。 JS不認爲訪問不存在的屬性是一個錯誤。 –

1

那不是JavaScript的用戶考慮上面的代碼的方式。 JS中的每個變量都是一個對象。所以,當你做mystring.len,它實際上是試圖訪問mystring obj的len財產,當它沒有找到該屬性,它將返回undefined - 這是應該的。這就是爲什麼你將無法使用JSLint找到任何錯誤。

只給你舉個例子 -

var myObj = {name: 'Hello', id: 1}; 
console.log(myObj.name); // Returns 'Hello' 
console.log(myObj.text); // 'undefined' 

爲了防止這樣的代碼給你任何錯誤,你可以方便地使用hasOwnProperty()方法如下 - 像

if(myObj.hasOwnProperty('text')) doSomething(); 

由於myObj沒有按沒有任何屬性textdoSomething()函數將永遠不會被調用。

0

簡單的答案是JavaScript不是彪是類型安全的......你不應該檢查它,但如果你仍然要檢查你可以做到這一點:

if ('len' in mystring){ 
} 

你應該看看打字稿如果你問這個問題......