Javascript 中的类型强制到底是什么?
例如,在使用 ==
而不是 ===
时?
原文由 gespinha 发布,翻译遵循 CC BY-SA 4.0 许可协议
Javascript 中的类型强制到底是什么?
例如,在使用 ==
而不是 ===
时?
原文由 gespinha 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们从类型系统的简短介绍开始,我认为这将帮助您理解类型强制转换的一般概念。
一种语言的类型系统定义了一些规则,这些规则告诉我们该语言中存在哪些类型的数据,以及如何使用不同的运算符将它们组合起来。例如,这样的规则之一可能指定加号 (+) 运算符仅作用于数字。这些规则的存在主要是为了防止你搬起石头砸自己的脚。但是当程序员在程序中打破这条规则时会发生什么?没有什么可以阻止程序员在程序中键入 {} + {}
或 “hello” + 5
即使语言认为这些表达式没有任何意义。
在这些情况下最终会发生什么取决于语言对其类型规则的严格程度。
语言类型系统通常持有两种关于你违反其规则的立场之一:
类型系统在其规则方面处于首位的语言通俗地称为“强类型”语言。他们严格禁止您违反其规则。那些采用第二种方法的语言(例如 JavaScript)被称为“弱类型”或“松散类型”语言。当然,您可以违反规则,但是当它强制转换您在程序中描述的数据类型以符合其规则时,请不要感到惊讶。这种行为被称为……(鼓声)…… 类型强制。
现在让我们看一下 JavaScript 中的一些示例。首先,让我们从一个不会导致类型强制转换的表达式开始。
5 + 5
使用带有两个完全有效的数字的 + 运算符。该程序会将 + 视为“相加”的意思,并愉快地将两个数字相加。无需转换。
但是关于 …
[] + 5
呃哦。在 JavaScript 中, +
可以表示添加两个数字或连接两个字符串。在这种情况下,我们既没有两个数字也没有两个字符串。我们只有一个数字和一个对象。根据 JavaScript 的类型规则,这没有逻辑意义。因为它对你违反它的规则是宽容的,所以它不会崩溃,而是试图理解它。那么 JavaScript 是做什么的呢?好吧,它知道如何连接字符串,所以它将 [] 和 5 都转换为字符串,结果是字符串值“5”。
比较运算符 ==
和 ===
什么关系?为什么有两个比较运算符?
==
不能避免 JavaScript 的类型转换行为。诸如 5 == “5”
类的表达式的计算结果为真,因为 JavaScript 将尝试转换其中之一,以便比较相同类型的数据。
在许多情况下,这是不可取的,因为您可能想知道您正在比较的某些数据是否属于不同类型,以便您可以决定如何处理它。这就是 ===
运算符的用武之地。当您使用 ===
时,不会发生类型转换。因此,表达式 5 === “5”
的计算结果为 false。
原文由 linstantnoodles 发布,翻译遵循 CC BY-SA 3.0 许可协议
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
3 回答1.3k 阅读✓ 已解决
类型强制意味着当一个运算符的操作数是不同类型时,其中一个将被转换为另一个操作数类型的“等价”值。例如,如果您这样做:
布尔操作数将被转换为整数:
false
变成0
,true
变成1。然后比较两个值但是,如果您使用非转换比较运算符
===
,则不会发生此类转换。当操作数的类型不同时,此运算符返回false
,并且只比较相同类型的值。强制转换不仅由比较运算符完成,尽管它们是唯一同时具有“严格”和“松散”变体的运算符。大多数算术运算符会自动将非数字参数转换为数字,例如
"50" / 5
被视为50 / 5
。还有许多需要字符串参数的内置函数和方法;如果你给他们别的东西,他们会自动将它们强制转换为字符串。但要小心 --
+
既是算术加法运算符又是字符串连接运算符 -- 如果你这样做string + number
,它将数字转换为字符串并连接,而不是转换字符串到一个数字并添加。这是在对用户输入执行算术运算时出现的许多错误的根源,因为输入是一个字符串,除非您明确地转换它。你可以在 You Don’t Know JS 中找到对 JavaScript 的强制转换规则的很好解释,在 MDN 中找到更多面向参考的文档。