Javascript 为什么在使用typeof运算符时要进行类型检查(==)

Javascript 为什么在使用typeof运算符时要进行类型检查(==),javascript,Javascript,在许多代码示例中,我确实看到人们在使用typeof进行打字检查时使用===。 但是typeof总是返回字符串。无论检查哪个变量。那么,为什么要使用===进行打字检查呢 例如: if(typeof num === 'number') // do something 是否有我不知道的边缘情况?如果在给定的比较中不可能进行类型转换(与typeof x==“string”不存在,因为typeof总是返回一个字符串),那么=和=之间就没有功能上的区别。在这种情况下使用哪一种更像是首选样式的问题,

在许多代码示例中,我确实看到人们在使用
typeof
进行打字检查时使用
===
。 但是
typeof
总是返回
字符串。无论检查哪个变量。那么,为什么要使用
===
进行打字检查呢

例如:

if(typeof num === 'number')
    // do something

是否有我不知道的边缘情况?

如果在给定的比较中不可能进行类型转换(与
typeof x==“string”
不存在,因为
typeof
总是返回一个字符串),那么
=
=
之间就没有功能上的区别。在这种情况下使用哪一种更像是首选样式的问题,因为没有功能上的差异

因此,在您的情况下:

if (typeof num === 'number')
这与
=
版本之间没有功能上的区别:

if (typeof num == 'number')
无论
num
的值是多少,两者都将提供完全相同的结果。您可以使用任一版本,并且您的代码在所有情况下都将正确运行

有没有我不知道的边缘案例

不,对于这个特定的示例,没有边缘情况


那么,为什么要使用===进行类型检查呢

Javascript编码的一个流行建议是始终使用
==
,除非您明确希望允许类型转换。这被认为是一种更安全的编码方式,因为您不会意外地得到一个您没有考虑或计划的类型转换

因此,如果您遵循这一建议,那么您会有一种想法,您的默认编码风格是使用
==
,除非有理由不使用它(例如,您希望允许类型转换)


这与您的逻辑相反,您正在寻找使用
===
的原因,而不是寻找不使用
==
的原因
==
通常比
=

如果比较两个值而忽略它们的类型(
=
),javascript通常必须在内部将一个或两个值转换为另一个类型,并进行额外的检查

另一方面,
=
不需要转换任何内容,只需进行一次比较。因此,当您不必担心像
“1”==1
这样的情况时,
===
通常更快

在这种情况下,由于
typeof
始终返回字符串,第二个值也是字符串,因此不需要
=
,因此
==
是按惯例使用的。

始终返回字符串,因此行为相同。如果不需要强制,最好使用最严格的运算符

在这种情况下,不应该有性能差异,因为typeof保证返回字符串,所以不应该执行强制。但是,如果有人更改代码,使用
==
将强制新代码也返回字符串(或使他们更新条件)


当您需要比较不同(或可能不同)类型的两个值时,
==
运算符非常有用,但如果您提前知道这些类型将是相同的,
==
具有所有优点,并强制执行严格的比较。后来,如果有人想降低代码的严格程度,他们必须明确地这样做。

我认为这通常只是人们在任何情况下都喜欢遵循的一种做法,以使自己意识到这一点。如果新手程序员看到“==”太多,他们可能会认为“==”不重要,而使用更简单的一个。你知道“==”和“==”之间的区别吗?@user3355243:从他的帖子来看,他似乎知道-他指的是typeof总是返回字符串,因此不存在错误类型转换的“危险”等等-因此,显然,不用担心使用==而不是==。这就是他所要求的。人们不喜欢使用逻辑,因为比较的类型两个相等就足够了,人们使用===作为默认值,而不用花一点力气去思考,如果它有意义,这是比较的另一个边缘。所以你的逻辑是完全正确的,因为typeof two equals就足够了,你不必担心任何边缘情况。@Daniel Aranda:人们可能会花费精力考虑比决定
=
操作符何时不会伤害他们更重要的事情。;)您可能想添加为什么
===
==
更受欢迎的原因,请参阅我的答案。@LarsEbert-我添加了有关
===
的信息,但OP似乎已经知道了与
==
的类型转换差异。他们问为什么有人应该使用
if(typeof x==“string”)
,而这种情况下不可能发生类型转换。“通常”,是的。但在这种特定情况下,编译器不知道两个操作数都是相同的(字符串)类型。当实际涉及强制时,
==
可以更快,但这是比较一个保证为字符串的值和一个字符串文字。这种微优化永远不会是主要原因。@jfriend00这正是我的答案。您使用
==
,因为行为是相同的,所以最佳做法是使用strict选项(如果需要更宽松的语义,请稍后更改)。