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

IT技术 javascript
2021-01-21 18:24:21

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

例如,使用 of==而不是===?

6个回答

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

boolean == integer

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

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

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

我怎样才能把它放在实际情况中?===当我想比较一个值是否等于另一个值时,我不应该总是使用吗?
2021-03-10 18:24:21
关于强制的极好参考和解释:github.com/getify/You-Dont-Know-JS/blob/master/...
2021-03-18 18:24:21
这取决于你在做什么。请参阅链接的问题。
2021-03-24 18:24:21
@Barmar 它也适用于> , <吗?
2021-03-27 18:24:21
@GEspinha 是使用松散类型语言的“艺术”。有些人是这样认为的,并且通常认为松散类型的语言是编程世界的祸害。但是,如果您知道自己在做什么,则可以编写更短、更灵活的代码。
2021-03-30 18:24:21

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

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

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

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

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

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

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

5 + 5

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

但是关于 …

[] + 5

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

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

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

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

这应该是公认的答案,因为它显示了多个方面的自动类型强制,而不仅仅是 == 比较示例。这个答案在回答问题和消除所有歧义方面做得更好。谢谢你花时间写出来。
2021-03-20 18:24:21
感谢您的精彩解释,尤其是“语言类型系统通常具有两个位置之一”
2021-03-30 18:24:21

在 Python 中,如果您尝试添加字符串和整数,则会出现错误:

>>> "hi" + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

然而在 JavaScript 中,你没有。10被转换为字符串:

> "hi" + 10
"hi10"

“类型强制”只是上面的一个花哨的用词不当。实际上,这两种语言都没有 Java 或 C 或其他具有静态类型系统的语言意义上的“类型”。语言如何处理各种非静态类型值之间的交互是一个选择和约定的问题。

我觉得你举的例子有点问题。您建议作为 JS 示例的内容与 Java 和 C# 完美配合。所以,根据这个答案,如果有人得出结论认为 Java 和 C# 支持类型强制,那将是不完全正确的......
2021-03-22 18:24:21

让我用下面的例子解释类型强制

类型强制意味着 Javascript 自动(即时)将变量从一种数据类型转换为另一种数据类型

例如:123 + "4"通常会引发错误,但在 Javascript 中由于类型强制,它会产生1234一个字符串

if(23 == "23"){
    console.log(" this line is inside the loop and is executed ");
}

在上面的代码中,由于类型强制 - JavaScript 认为23(number) 和"23"(string) 是一回事。这使条件为真并打印 console.log

在另一种情况下

if(23 === "23"){
   console.log(" this line is inside the loop and is NOT executed");
}

===情况下,JavaScript没有做类型强制,并且因为23是一个数字,"23"是String,并因为===这两种数据类型是不同的,导致病情的假。它不打印 console.log

简单来说

在这种情况下,=它是一个赋值运算符 - 它分配诸如var a = 3;等的

(以下运算符用于比较)

在这种情况下,==Javascript 将数据类型转换/强制转换为另一种数据类型,然后进行比较。

在这种情况下,=== Javascript 不会转换/强制数据类型

为了避免错误和调试目的===,主要使用

请让我知道上述信息的准确性。

什么是强制:

当 Javascript 引擎必须执行需要数据为特定类型的特定操作时,就会发生 javascript 中的类型强制。当引擎遇到某种类型的数据不适用于该操作时,它就会将数据强制转换为某种类型。这是必需的,因为 javascript 中的变量是动态类型的,这意味着可以为给定的变量分配任何类型的值。

例子:


if(1){
  // 1 gets coerced to true
}


if(4 > '3') {
  // 3 gets coerced into a number
}


44 == "44"  // true, the string 44 gets converted to a nr

布尔强制:

在 javascript coercion 中,true除了以下被强制转换为 的值外,所有值都被转换false

console.log(!!"");         // false
console.log(!!0);          // false
console.log(!!null);       // false
console.log(!!undefined);  // false
console.log(!!NaN);        // false
console.log(!!false);      // false

还要注意,在上面的例子中,double ! 使用运算符。这 !标记运算符将一个值强制转换为具有相反值的布尔值。我们可以两次使用此运算符将任何值转换为布尔值。