Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中,从typeof返回的常量字符串来自哪里?_Javascript - Fatal编程技术网

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

在JavaScript中,从typeof返回的常量字符串来自哪里?,javascript,Javascript,我见过很多地方用typeof关键字进行字符串比较,它返回的显然是常量字符串,比如字符串、对象、未定义的字符串等。我希望在某些地方看到定义为常量的字符串,但事实似乎并非如此(它们列在MDN上)。我不喜欢在代码中看到字符串的重复,因为它们看起来很神奇。当前的解决方案是自己在代码的其他地方将它们定义为const,但是JS似乎知道这些,所以为什么我不能访问它们呢?(或者我可以吗?) 魔术串: if(typeof myObject === 'object') {} 这似乎好一点,因为没有复制魔术字符

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

魔术串:

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

是否有更好的方法,或者这些常量是内置的?

这些字符串常量不能作为预定义常量使用。但是,如果您不想自己指定这些字符串文本,您可以做相反的操作,将
typeof
应用于您提供的一些基本值,并用这些返回的字符串定义常量。例如:

const TYPES=Object.freeze({
对象{}的类型,
未定义:未定义的类型,
布尔值:typeof true,
编号:typeof 1,
字符串:typeof“”,
功能:评估类型,
SYMBOL:typeof SYMBOL()
});
console.log(类型);
//使用它:
让myObject={“test”:123};

console.log(typeof myObject==TYPES.OBJECT);//真的
我认为这些字符串必须来自某个地方的假设是错误的。JavaScript是一个规范,在这方面,
typeof
是一个返回字符串的操作符,该字符串可以具有规范中列出的预定义值之一。因此,这些值的来源取决于实现

此外,虽然像
typeof myObject===Object.name.toLowerCase()
typeof myObject===TYPE\u Object
这样的东西似乎比使用“裸”字符串更好,但
typeof myObject===='Object'
是一种众所周知的模式。通过使用不同的东西,您正在降低代码的可读性,因为其他两个变体肯定会引起一些注意,并促使人们问自己这行代码是做什么的


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

如果你问我,你所做的似乎是最合法的方法。@Andreas感谢你发布了一个到规范的链接,因为它显示了在MDN文档中返回的常量字符串,但我问这些常量是否可以访问。