Javascript中的类型强制究竟是什么?
例如,使用==
代替===
?
答案 0 :(得分:145)
类型强制意味着当运算符的操作数是不同类型时,其中一个将转换为另一个操作数类型的“等效”值。例如,如果你这样做:
boolean == integer
布尔操作数将转换为整数:false
变为0
,true
变为1.然后比较两个值。
但是,如果使用非转换比较运算符===
,则不会发生此类转换。当操作数具有不同类型时,此运算符返回false
,并仅在它们属于同一类型时进行比较。
答案 1 :(得分:46)
让我们从一个简短的类型系统介绍开始,我认为这将有助于您理解类型强制的一般概念。
语言的类型系统定义规则,告诉我们该语言中存在哪些类型的数据以及如何使用不同的运算符组合它们。例如,一个这样的规则可能指定加号(+)运算符仅作用于数字。这些规则主要是为了防止你在脚下射击。但是当程序员打破程序中的规则时会发生什么?没有什么能阻止程序员在程序中输入{} + {}
或“hello” + 5
,即使语言不认为这些表达有任何意义。
在这些情况下最终会发生什么取决于语言对其类型规则的严格程度。
语言类型系统通常会关于您违反规则的两个职位之一:
类型系统中关于其规则的第一个位置的语言通俗地称为“强类型”语言。他们严格禁止你违反规则。采用第二种方法(例如JavaScript)的那些被称为“弱类型”或“松散类型”语言。当然,您可以违反规则,但是当它为了遵守规则而强制转换您在程序中描述的数据类型时不要感到惊讶。这种行为被称为......(鼓声)...... 类型强制。
现在让我们看看JavaScript中的一些示例。首先,让我们从一个不会导致类型强制的表达式开始。
5 + 5
使用+运算符和两个完全有效的数字。该程序将+处理为“添加”,并愉快地添加这两个数字。无需转换。
但是呢......
[] + 5
哦,哦。在JavaScript中,+
可以表示添加两个数字或连接两个字符串。在这种情况下,我们既没有两个数字也没有两个字符串。我们只有一个数字和一个对象。根据JavaScript的类型规则,这没有逻辑意义。因为它对你违反规则的宽容,而不是崩溃它试图理解它无论如何。那么JavaScript做什么?好吧,它知道如何连接字符串,因此它将[]和5都转换为字符串,结果是字符串值“5”。
比较运算符==
和===
的处理是什么?为什么有两个比较运算符?
==
不能免受JavaScript的类型转换行为的影响。诸如5 == “5”
之类的表达式将评估为true,因为JavaScript将尝试转换其中一个,以便它比较相同类型的数据。
在许多情况下,这是不可取的,因为您可能想知道您所比较的某些数据是否属于不同类型,以便您可以决定如何处理它。这就是===
运算符的用武之地。当您使用===
时,不会进行类型转换。因此,表达式5 === “5”
将评估为false。
答案 2 :(得分: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 :(得分:3)
让我用下面的例子解释类型强制
类型强制意味着Javascript会自动(在运行中)将变量从一种数据类型转换为另一种数据类型
Ex:123 + "4"
通常会引发错误,但在Javascript中由于类型强制,会导致1234
字符串
if(23 == "23"){
console.log(" this line is inside the loop and is executed ");
}
在上面的代码中,由于类型强制--JML认为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不会转换/强制数据类型
为了避免错误和调试目的,===
主要用于
请告诉我上述信息的准确性。
答案 4 :(得分:1)
a == b
表示javascript会针对a
评估b
,具体取决于是否可以平等评估这些值。例如,false == 0
将评估为true,因为0也是Boolean false的值。但是,false === 0
将评估为false,因为严格比较,0与false的物理值不同。另一个例子是false == ''
所以基本上松散比较与严格比较,因为javascript是一种松散类型的语言。也就是说,javascript将尝试根据代码的上下文转换变量,如果没有严格比较,这会产生相同的效果。 php也有这种行为。
答案 5 :(得分:0)
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"
最初声明为字符串的变量示例被强制转换为布尔值!操作
答案 6 :(得分:0)
类型强制是在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!使用运算符。 !标记运算符将一个值强制为具有相反值的布尔值。我们可以两次使用此运算符将任何值转换为布尔值。
答案 7 :(得分:0)
类型强制是将值从一种类型转换为另一种类型(例如,字符串到数字,对象到布尔值等)的过程。任何类型,无论是原始类型还是对象,都是强制类型的有效主体。回想一下,基元是:数字,字符串,布尔值,空值,未定义+符号(ES6中已添加)。
类型强制可以是显式的也可以是隐式的。
当开发人员通过编写适当的代码(例如Number(value))表示打算在类型之间进行转换时,这称为显式类型强制(或类型转换)。
由于JavaScript是弱类型语言,因此值也可以自动在不同类型之间转换,这称为隐式类型强制。当您将运算符应用于不同类型的值(例如, 1 == null,2/5,null + new Date(),也可以由周围的上下文触发,例如if(value){…},其中value被强制转换为boolean。
这是隐式类型强制的一些示例:
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/
答案 8 :(得分:-2)
如果数据类型彼此不相等,则强制发生。 比如3 ==&#34; 3&#34;或者boolen ==整数