Javascript中的Type Coercion究竟是什么?

问题描述 投票:101回答:8

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

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

javascript
8个回答
153
投票

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

boolean == integer

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

但是,如果使用非转换比较运算符===,则不会发生此类转换。当操作数具有不同类型时,此运算符返回false,并仅在它们属于同一类型时进行比较。


48
投票

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

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

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

语言类型系统通常包含两个关于您违反规则的位置之一:

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

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

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

5 + 5

使用带有两个数字的+运算符是完全有效的。该程序将+处理为“添加”,并愉快地添加这两个数字。无需转换。

但是关于 …

[] + 5

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

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

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

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


6
投票

在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或其他具有静态类型系统的语言中,两种语言都没有“类型”。语言如何处理各种非静态类型值之间的交互是一个选择和约定的问题。


3
投票

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

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

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

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

在上面的代码中,由于类型强制 - JavaScript认为23(数字)和"23"(字符串)是相同的东西。这使条件成立并打印console.log

在另一种情况下

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

===案例中,Javascript不执行类型强制,因为23是一个数字而"23"是字符串,因为===这两种数据类型不同,导致条件错误。它不会打印console.log

简单来说

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

(以下运营商用于比较)

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

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

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

请告诉我上述信息的准确性。


1
投票

a == b意味着javascript将根据a评估b是否可以平等评估值。例如,false == 0将评估true,因为0也是Boolean false的值。但是,false === 0将评估false,因为严格比较,0与false的物理值不同。另一个例子是false == ''所以基本上松散比较与严格比较,因为javascript是一种松散类型的语言。也就是说,javascript将尝试根据代码的上下文转换变量,如果没有严格比较,这会产生相同的效果。 php也有这种行为。


0
投票
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"

最初声明为字符串的变量示例,使用!强制转换为布尔值。操作者


0
投票

什么是强制:

当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强制中,所有值都转换为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

另请注意,在上面的例子中,双倍!使用运算符。的! mark运算符将值强制转换为具有相反值的布尔值。我们可以使用此运算符两次将任何值转换为布尔值。


-2
投票

如果数据类型彼此不相等,则强制发生。比如3 ==“3”或boolen ==整数

© www.soinside.com 2019 - 2024. All rights reserved.