Javascript 中的类型强制究竟是什么?

新手上路,请多包涵

Javascript 中的类型强制到底是什么?

例如,在使用 == 而不是 === 时?

原文由 gespinha 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 255
2 个回答

类型强制意味着当一个运算符的操作数是不同类型时,其中一个将被转换为另一个操作数类型的“等价”值。例如,如果您这样做:

 boolean == integer

布尔操作数将被转换为整数: false 变成 0true 变成1。然后比较两个值

但是,如果您使用非转换比较运算符 === ,则不会发生此类转换。当操作数的类型不同时,此运算符返回 false ,并且只比较相同类型的值。

强制转换不仅由比较运算符完成,尽管它们是唯一同时具有“严格”和“松散”变体的运算符。大多数算术运算符会自动将非数字参数转换为数字,例如 "50" / 5 被视为 50 / 5 。还有许多需要字符串参数的内置函数和方法;如果你给他们别的东西,他们会自动将它们强制转换为字符串。

但要小心 -- + 既是算术加法运算符又是字符串连接运算符 -- 如果你这样做 string + number ,它将数字转换为字符串并连接,而不是转换字符串到一个数字并添加。这是在对用户输入执行算术运算时出现的许多错误的根源,因为输入是一个字符串,除非您明确地转换它。

你可以在 You Don’t Know JS 中找到对 JavaScript 的强制转换规则的很好解释,在 MDN 中找到更多面向参考的文档。

原文由 Barmar 发布,翻译遵循 CC BY-SA 4.0 许可协议

让我们从类型系统的简短介绍开始,我认为这将帮助您理解类型强制转换的一般概念。

一种语言的类型系统定义了一些规则,这些规则告诉我们该语言中存在哪些类型的数据,以及如何使用不同的运算符将它们组合起来。例如,这样的规则之一可能指定加号 (+) 运算符仅作用于数字。这些规则的存在主要是为了防止你搬起石头砸自己的脚。但是当程序员在程序中打破这条规则时会发生什么?没有什么可以阻止程序员在程序中键入 {} + {}“hello” + 5 即使语言认为这些表达式没有任何意义。

在这些情况下最终会发生什么取决于语言对其类型规则的严格程度。

语言类型系统通常持有两种关于你违反其规则的立场之一:

  1. 说“嘿,那不酷!”并立即使您的程序崩溃。
  2. 说“我不能用 {} 做任何事情……但我可以用数字做一些事情”并尝试将 {} 转换为数字。

类型系统在其规则方面处于首位的语言通俗地称为“强类型”语言。他们严格禁止您违反其规则。那些采用第二种方法的语言(例如 JavaScript)被称为“弱类型”或“松散类型”语言。当然,您可以违反规则,但是当它强制转换您在程序中描述的数据类型以符合其规则时,请不要感到惊讶。这种行为被称为……(鼓声)…… 类型强制

现在让我们看一下 JavaScript 中的一些示例。首先,让我们从一个不会导致类型强制转换的表达式开始。

 5 + 5

使用带有两个完全有效的数字的 + 运算符。该程序会将 + 视为“相加”的意思,并愉快地将两个数字相加。无需转换。

但是关于 …

 [] + 5

呃哦。在 JavaScript 中, + 可以表示添加两个数字或连接两个字符串。在这种情况下,我们既没有两个数字也没有两个字符串。我们只有一个数字和一个对象。根据 JavaScript 的类型规则,这没有逻辑意义。因为它对你违反它的规则是宽容的,所以它不会崩溃,而是试图理解它。那么 JavaScript 是做什么的呢?好吧,它知道如何连接字符串,所以它将 [] 和 5 都转换为字符串,结果是字符串值“5”。

比较运算符 ===== 什么关系?为什么有两个比较运算符?

== 不能避免 JavaScript 的类型转换行为。诸如 5 == “5” 类的表达式的计算结果为真,因为 JavaScript 将尝试转换其中之一,以便比较相同类型的数据。

在许多情况下,这是不可取的,因为您可能想知道您正在比较的某些数据是否属于不同类型,以便您可以决定如何处理它。这就是 === 运算符的用武之地。当您使用 === 时,不会发生类型转换。因此,表达式 5 === “5” 的计算结果为 false。

原文由 linstantnoodles 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题