例如,使用==而不是===是什么?

评论

(true == 1)=> true /(true === 1)=> false。

@VisioN您的评论完全没有帮助,我在问:“为什么”会发生?

之所以如此,是因为JavaScript是用这种方式开发的。我的评论应该回答您的主要问题:JavaScript中的类型强制到底是什么?

通过YDJS:“将值从一种类型转换为另一种类型,通常在显式完成时称为“类型转换”,而在隐式完成时称为“强制转换”(受使用值的规则所强制)。 -github.com/getify/You-Dont-Know-JS/blob/master / ...

#1 楼

类型强制是指,当一个运算符的操作数是不同类型时,其中一个将被转换为另一个操作数类型的“等效”值。例如,如果您执行以下操作:

boolean == integer


布尔操作数将被转换为整数:false变为0true变为1。然后将这两个值进行比较。 br />
但是,如果您使用非转换比较运算符===,则不会发生这种转换。当操作数是不同类型时,此运算符将返回false,并且仅在它们属于相同类型时才比较这些值。

评论


我该如何将其置于实际情况下?当我要比较一个值是否等于另一个值时,是否应该总是使用===?

– gespinha
13年11月11日在21:04

这取决于您在做什么。请参阅链接的问题。

– Barmar
13年11月11日在21:06

@GEspinha很好,这是使用松散类型语言的“艺术”。有些人是这样认为的,并且通常认为松散类型的语言是编程界的祸害。但是,如果您知道自己在做什么,它可以使代码更短,更灵活。

–蜡笔暴力
13年11月11日在21:06

@Barmar它也适用于>,<吗?

–罗伊·纳米尔(Royi Namir)
14-10-12在11:06



关于强制的出色参考和解释:github.com/getify/You-Dont-Know-JS/blob/master/…

–格雷格·贝尔(Greg Bell)
16-4-20在23:41

#2 楼

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

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

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

语言类型系统通常会在违反规则的情况中占据两个位置之一:


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

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

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

5 + 5


使用带有两个数字的+运算符非常有效。该程序将+表示为“加”并愉快地将两个数字相加。无需转换。

但是……...

[] + 5


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

比较运算符=====处理什么?为什么会有两个比较运算符?

==不能不受JavaScript的类型转换行为的影响。 5 == “5”之类的表达式的计算结果为true,因为JavaScript会尝试转换其中之一,以便比较相同类型的数据。

在很多情况下,这是不希望的,因为您可能想知道要比较的某些数据是否属于其他类型,以便您可以决定要怎么做。这就是===运算符的来源。使用===时,不会进行类型转换。因此,表达式5 === “5”将计算为false。

评论


感谢您的解释,尤其是对于“一种语言类型的系统通常担任两个职位之一”

–胡默云·艾哈迈德(Humoyun Ahmad)
17年2月18日在7:16

这应该是公认的答案,因为它在多个方面都显示了自动类型强制,而不仅仅是==比较示例。这个答案在回答问题和消除所有歧义方面做得更好。感谢您抽出宝贵的时间写出来。

–乍得
18年7月18日在18:42

#3 楼

在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"


“ Type coercion”只是上面的一个误称。实际上,在Java或C的意义上,两种语言都没有“类型”,或者在静态类型系统中,其他语言都没有。语言如何处理各种非静态类型的值之间的交互是选择和约定的问题。

评论


我认为您所举的示例存在一些问题。您所建议的JS示例可以与Java和C#完美结合。因此,根据此答案,如果得出结论,Java和C#支持类型强制不是完全正确的...

–罗密欧·塞拉(Romeo Sierra)
18/12/11在3:18

#4 楼

让我用下面的示例解释类型强制。一个错误,但由于强制类型而在Javascript中导致123 + "4"字符串

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


在上述代码中,由于强制类型-JavaScript认为1234(数字)和23(字符串)是同一件事。这使条件成立,并打印控制台。在另一种情况下

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


"23"情况下,Javascript不执行类型强制转换,并且由于===是数字,而23是String,并且由于"23",这两个数据类型不同,这会导致条件错误。它不显示控制台。log

简单地说,在这种情况下,===是一个赋值运算符-分配诸如=等值

(下面的运算符用于比较)

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

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

为了避免出现错误并出于调试目的,===通常被使用

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

#5 楼

什么是强制性:当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 





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

#6 楼

a == b表示javascript将根据值是否可以均等地评估a来评估b。例如,false == 0将评估为true,因为0也是布尔值false的值。但是,由于严格比较,所以false === 0的评估结果为假,0与假的物理值不同。另一个示例是false == '',因此基本上是松散比较与严格比较,因为javascript是一种松散类型的语言。也就是说,javascript将尝试根据代码的上下文转换变量,如果不严格比较它们,则具有使事物相等的效果。 php也有这种行为。

评论


0与false的物理值不同。 IMO物理上为假,在内存中恰好为0。我宁愿说它们的类型不同,因为false是布尔值,而0是整数。

– VisioN
13年11月11日在21:02

#7 楼

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


变量的示例,该变量最初声明为字符串,用!强制转换为布尔值!运算符

评论


请详细说明您的答案。仅代码答案并没有真正的帮助。

–cezar
17年11月4日在20:02

我个人认为代码只是示例简洁,自我解释且非常有用,我想这是个人观点的问题

– P先生
17年11月5日在16:58

#8 楼

类型强制是将值从一种类型转换为另一种类型的过程(例如,字符串转换为数字,对象转换为布尔值,等等)。任何类型,无论是原始类型还是对象,都是强制类型的有效主体。回想一下,原语是:数字,字符串,布尔值,空值,未定义+符号(ES6中已添加)。

类型强制可以是显式的和隐式的。

当开发人员时通过编写适当的代码(例如Number(value))来表达在类型之间进行转换的意图,这称为显式类型强制(或类型转换)。

由于JavaScript是弱类型语言,因此值也可以可以在不同类型之间自动转换,这称为隐式强制。当您将运算符应用于不同类型的值时,通常会发生这种情况,例如
1 == null,2 /'5',null + new Date(),或者它可以由周围的上下文触发,例如if(值){…},其中值被强制转换为布尔值。

下面是隐式类型强制的一些示例:

true + false
12 / "6"
"number" + 15 + 3
15 + 3 + "number"
[1] > null
"foo" + + "bar"
'true' == true
false == 'false'
null == ''
!!"false" == !!"true"
[‘x’] == ‘x’
[] + null + 1
[1,2,3] == [1,2,3]
{}+[]+{}+[1]
!+[]+[]+![]
new Date(0) - 0
new Date(0) + 0


阅读更多: https://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/

#9 楼

如果数据类型彼此不相等,则会发生强制转换。
像3 ==“ 3”或boolen == integer