Javascript 中的类型强制到底是什么?
Javascript 中的类型强制到底是什么?
例如,关于使用 代替 ?==
===
类型强制意味着当运算符的操作数是不同类型的时,其中一个操作数将转换为另一个操作数类型的“等效”值。例如,如果您执行以下操作:
boolean == integer
布尔操作数将转换为整数:变为 ,变为 1。然后比较这两个值。false
0
true
但是,如果使用非转换比较运算符 ,则不会发生此类转换。当操作数的类型不同时,此运算符返回 ,并且仅当它们属于相同类型时才比较值。===
false
强制不仅仅是由比较运算符完成的,尽管他们是唯一同时具有“严格”和“松散”变体的运算符。大多数算术运算符会自动将非数字参数与数字进行转换,例如 被视为 。还有许多需要字符串参数的内置函数和方法;如果你给他们别的东西,他们会自动强迫他们串起来。"50" / 5
50 / 5
但要小心 - 算术加法运算符和字符串串联运算符 - 如果你这样做,它将数字转换为字符串并连接,而不是将字符串转换为数字并加法。这是对用户输入执行算术运算时所犯的许多错误的根源,因为输入是字符串,除非您显式转换它。+
string + number
你可以在 You Don't Know JS 中找到 JavaScript 强制规则的很好的解释,在 MDN 中找到更多面向参考的文档。
让我们从类型系统的简短介绍开始,我认为这将帮助您理解类型强制的一般概念。
语言的类型系统定义了规则,告诉我们该语言中存在哪些类型的数据,以及如何使用不同的运算符将它们组合在一起。例如,一个这样的规则可能指定加号 (+) 运算符仅作用于数字。这些规则的存在主要是为了防止你向自己开枪。但是,当程序员在程序中打破该规则时会发生什么呢?没有什么可以阻止程序员在程序中键入或输入,即使语言不认为这些表达式有任何意义。{} + {}
“hello” + 5
在这些情况下最终会发生什么取决于语言对其类型规则的严格程度。
语言类型系统通常持有以下两种立场之一:您违反其规则:
类型系统对其规则采取第一位置的语言俗称“强类型”语言。他们严格要求不让你打破它的规则。那些采用第二种方法(如JavaScript)的语言被称为“弱类型”或“松散类型”语言。当然,您可以打破规则,但是当它强制转换您在程序中描述的数据类型以符合其规则时,请不要感到惊讶。这种行为被称为...(鼓声) ...类型强制。
现在让我们看一下JavaScript中的一些例子。首先,让我们从一个不会导致类型强制的表达式开始。
5 + 5
使用带有两个数字的 + 运算符是完全有效的。该程序将+视为“加法”,并愉快地将两个数字相加。无需转换。
但是...
[] + 5
噢噢。在JavaScript中,可以意味着将两个数字相加或连接两个字符串。在本例中,我们既没有两个数字,也没有两个字符串。我们只有一个数字和一个对象。根据JavaScript的类型规则,这在逻辑上是没有意义的。由于它原谅你违反了它的规则,而不是崩溃,它试图理解它。那么JavaScript是做什么的呢?好吧,它知道如何连接字符串,因此它将[]和5转换为字符串,结果是字符串值“5”。+
比较运算符 ==
和 ===
是怎么回事?为什么有两个比较运算符?
==
不能免受 JavaScript 的类型转换行为的影响。诸如 之类的表达式的计算结果将为 true,因为 JavaScript 将尝试转换其中一个表达式,以便它比较相同类型的数据。5 == “5”
在许多情况下,这是不可取的,因为您可能想知道要比较的某些数据是否属于不同类型的数据,以便您可以决定如何处理它。这就是运营商的用武之地。使用 时,不会进行任何类型转换。因此,表达式的计算结果将为 false。===
===
5 === “5”