2017-06-01 53 views
2

我已經看到了很多的做與的typeof關鍵字字符串比較的地方,返回結果是什麼都顯得常量字符串,如對象不確定等。我希望看到那些定義爲常量的地方,但似乎並非如此(它們在MDN here上列出)。我不喜歡看到代碼中使用的字符串重複,因爲它們看起來很神奇。目前的解決方案是將它們定義爲const我自己的代碼中的其他地方,但似乎JS知道這些,所以爲什麼我無法得到它們? (或者可以嗎?)在JavaScript中,typeof返回的常量字符串從哪裏來?

魔術字符串:

if(typeof myObject === 'object') {} 

這似乎更好一點,因爲沒有重複神奇的字符串,但我不明白爲什麼我應該定義常量:

const TYPE_OBJECT = 'object'; 

if(typeof myObject === TYPE_OBJECT) {} 
if(typeof myOtherObject === TYPE_OBJECT) {} 

或者,這似乎太笨拙:

if(typeof myObject === Object.name.toLowerCase()) {} 
if(typeof "hello" === String.name.toLowerCase()) {} 

有沒有更好的方法或建在什麼地方,這些常量?

+0

[ECMAScript 2015 - 12.5.6'typeof' Operator](http://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator) – Andreas

+0

你在做什麼似乎是如果你問我,這是最合法的方法。 – sweaver2112

+0

@Andreas感謝您發佈一個鏈接到規範,因爲它顯示了MDN文檔中返回的常量字符串,但我問的是這些常量是否可訪問。 – deejbee

回答

0

這些字符串常量不可用作爲預定義的常量。但是,如果您不想自己指定這些字符串文字,則可以執行相反操作,並將typeof應用於您提供的某些基本值,並使用返回的字符串定義常量。例如:

const TYPES = Object.freeze({ 
 
    OBJECT: typeof {}, 
 
    UNDEFINED: typeof undefined, 
 
    BOOLEAN: typeof true, 
 
    NUMBER: typeof 1, 
 
    STRING: typeof "", 
 
    FUNCTION: typeof eval, 
 
    SYMBOL: typeof Symbol() 
 
}); 
 

 
console.log(TYPES); 
 

 
// Use it: 
 
let myObject = { "test": 123 }; 
 
console.log(typeof myObject === TYPES.OBJECT); // true

0

我認爲推定這些字符串必須來自地方是一個謬論。 JavaScript是一個規範,在這方面,typeof是一個運算符,它返回一個字符串,該字符串可以具有規範中列出的預定義值之一。這些來自哪裏因此取決於實施。

此外,雖然像typeof myObject === Object.name.toLowerCase()typeof myObject === TYPE_OBJECT似乎比使用「裸」字符串好,typeof myObject === 'object'是一個衆所周知的模式。通過使用不同的東西,你會降低代碼的可讀性,因爲其他兩種變體會保證提高一些眉毛,並提示人們問自己這行代碼是幹什麼的。

已經在JS從一開始就存在Symbol,我相信typeof會剛剛返回Symbol。可悲的是,爲了向後兼容,它必須返回一個字符串。