在JavaScript中,从typeof返回的常量字符串来自哪里?

时间:2017-06-01 17:27:06

标签: javascript

我见过很多与 typeof 关键字进行字符串比较的地方,它会返回显然是常量的字符串,例如 string 对象未定义等。我希望看到那些被定义为常量的地方,但似乎并非如此(它们列在MDN here上)。我不喜欢看到代码中使用的字符串重复,因为它们看起来很神奇。当前的解决方案是在代码中的其他地方将它们定义为 const ,但似乎JS知道这些,所以为什么我不能找到它们? (或者我可以吗?)

魔术字符串:

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

这似乎好一点,因为没有重复的魔术字符串,但我不明白为什么我应该定义const:

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()) {}  

有没有更好的方法或者这些常量是在某个地方构建的?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我认为这些字符串必须来自的假设是一种谬论。 JavaScript是一个规范,在这方面,PF_INET是一个运算符,它返回一个字符串,该字符串可以包含规范中列出的预定义值之一。这些来自何处依赖于实现。

此外,虽然typeoftypeof myObject === Object.name.toLowerCase()之类似乎比使用“裸”字符串更好,但typeof myObject === TYPE_OBJECT是众所周知的模式。通过使用不同的东西,你会降低代码的可读性,因为其他两个变种可以保证提高一些眉毛并提示人们自问这条线的作用。

JS从一开始就存在typeof myObject === 'object',我相信Symbol只会返回typeof。遗憾的是,为了向后兼容,它必须返回一个字符串。