簡體   English   中英

如何在javascript中檢測無效屬性的使用?

[英]How can I detect use of invalid properties in javascript?

我正在學習Javascript,我編寫了以下代碼:

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

我不小心使用.len而不是.length 令我驚訝的是,沒有出現任何錯誤。 mystring.len返回undefined ,這使得比較失敗,但代碼保持正常運行。 我寧願提出一個實際的錯誤,所以我可以修復代碼。 添加“use strict”沒有幫助,jslint也沒有幫助。

我知道有辦法積極檢查一個屬性是否存在,但這不是我想要的。 我希望Javascript告訴我什么時候我在一個屬性名稱中輸入了一個拼寫錯誤。

有沒有辦法導致Javascript在這種情況下給出錯誤?

不 - 這就是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
};

使用“use strict”(根據我的經驗),以便未被顯式聲明/實例化的變量然后被引用將拋出錯誤(否則,JS將動態地創建一個新的var)。 所以這在這里沒有用。

這聽起來像是一個錯誤,通常由其他語言的編譯器拾取,但由於JS被解釋,除非你在一個強大的IDE中,否則你不會有那種顯式的錯誤檢查。 你使用文本編輯器還是寫JS的東西?

這不是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沒有任何屬性text ,因此永遠不會調用doSomething()函數。

這是許多/所有答案中提到的JavaScript的行為。 但是,可以選擇阻止您嘗試的新屬性:

Object.seal https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal

簡單的答案是JavaScript不是類型安全的......你不應該檢查它,但如果你仍然想檢查你可以通過以下方式來做:

if ('len' in mystring){
}

如果你問這個問題,你應該看看Typescript ......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM