【问题标题】:Why would I do a typecheck (===) when using typeof-operator [duplicate]为什么我在使用 typeof-operator 时要进行类型检查(===)[重复]
【发布时间】:2015-02-02 15:59:31
【问题描述】:

在许多代码示例中,我确实看到人们在使用typeof 进行类型检查时使用===。 但是typeof 总是返回一个string。无论您正在检查哪个变量。那么为什么要使用=== 来进行类型检查呢?

例子:

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

有什么我不知道的极端情况吗?

【问题讨论】:

  • 我认为这通常只是人们喜欢在所有情况下都遵循的一种做法,以保持自己的意识。如果新手编码员看到“==”太多,他们可能会认为“===”无关紧要并使用更简单的。
  • 你知道“==”和“===”的区别吗?
  • @ user3355243:从他的帖子看来,他确实这样做了——他指出 typeof 总是返回一个字符串,因此没有错误转换的“危险”等等——因此,显然,不需要担心使用 == 而不是 ===。这就是他的要求。
  • 人们不喜欢使用逻辑,对于 typeof 比较两个等于就足够了,人们使用 === 作为默认值,而无需费力思考是否有意义,那就是另一个比较的边缘。所以你的逻辑完全没问题,因为 typeof 两个等于就足够了,你不需要担心任何极端情况。
  • @Daniel Aranda:人们可能会把精力花在考虑更重要的事情上,而不是决定== 运算符何时不会伤害他们。 ;)

标签: javascript


【解决方案1】:

typeof operator 总是返回一个字符串,所以行为是相同的。如果您不是特别需要强制,最好使用最严格的可用运算符。

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

== 运算符在您需要比较不同(或可能不同)类型的两个值时很有用,但如果您提前知道类型将相同,=== 有所有的好处,并执行严格的比较。稍后,如果有人想让代码不那么严格,他们必须明确地这样做。

【讨论】:

  • @jfriend00 这正是我的回答。您使用 === 因为行为是相同的,所以最佳实践说使用 strict 选项(稍后更改 if 您需要更宽松的语义)。
【解决方案2】:

=== 通常比== 快。

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

另一方面,=== 不需要转换任何东西,只需要进行一次比较。因此,当您不必担心"1" == 1 之类的情况时,=== 通常会更快。

在这种情况下,由于typeof 总是返回一个字符串,而第二个值也是一个字符串,所以不需要==,因此=== 的使用不符合惯例。

【讨论】:

  • 通常”,是的。但不是在这种特定情况下,编译器已经知道两个操作数是相同的(字符串)类型。
  • === 可以在实际涉及强制时更快,但这是将保证为字符串的值与字符串文字进行比较。
  • 这个微优化永远不会是主要原因。
【解决方案3】:

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

所以,在你的情况下:

if (typeof num === 'number')

这与== 版本在功能上没有区别:

if (typeof num == 'number')

无论num 具有什么值,两者都将提供完全相同的结果。您可以使用任一版本,并且您的代码将在所有情况下正确运行。

有什么我不知道的极端情况吗?

不,这个特定示例没有极端情况。


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

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

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

这与您寻找使用=== 的理由而不是寻找不使用== 的理由的逻辑相反。

【讨论】:

  • 您可能需要添加=== 优于== 的原因,请参阅我的回答。
  • @LarsEbert - 我添加了有关 === 的信息,但似乎 OP 已经知道与 === 的类型转换差异。他们在问为什么有人应该使用if (typeof x === "string"),而这是不可能发生类型转换的情况。
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2015-04-14
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多