Javascript中的类型强制究竟是什么?
例如,关于使用 of==
而不是===
?
类型强制意味着当一个运算符的操作数是不同的类型时,其中一个将被转换为另一个操作数类型的“等价”值。例如,如果你这样做:
boolean == integer
布尔操作数将转换为整数:false
变为0
,true
变为 1。然后比较两个值。
但是,如果您使用非转换比较运算符===
,则不会发生此类转换。当操作数属于不同类型时,该运算符返回false
,并且仅在它们属于相同类型时比较值。
您可以在You Don't Know JS中找到对 JavaScript 强制规则的很好解释,在MDN中找到更多面向参考的文档。
在 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 或其他具有静态类型系统的语言意义上的“类型”。语言如何处理各种非静态类型值之间的交互是一个选择和约定的问题。
让我用下面的例子来解释类型强制
类型强制意味着 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"
是字符串,并且由于===
这两种数据类型不同,这会导致条件错误。它不打印 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
还要注意,在上面的例子中,双!使用运算符。这 !标记运算符将一个值强制转换为具有相反值的布尔值。我们可以使用此运算符两次将任何值转换为布尔值。
a == b
意味着 javascript 将a
根据b
是否可以平等地评估值来评估。例如,false == 0
将评估 true,因为 0 也是 Boolean false 的值。但是,false === 0
将评估为 false,因为严格比较,0 与 false 的物理值不同。另一个例子是false == ''
所以基本上松散比较与严格比较,因为 javascript 是一种松散类型的语言。也就是说,javascript会尝试根据代码的上下文对变量进行转换,如果不严格比较的话,这会起到使事物相等的作用。php 也有这种行为。
var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"
最初声明为字符串的变量示例被强制转换为布尔值!操作员
类型强制是将值从一种类型转换为另一种类型的过程(例如字符串转换为数字,对象转换为布尔值等)。任何类型,无论是原始类型还是对象,都是类型强制的有效主体。回想一下,原语是:数字、字符串、布尔值、空值、未定义 + 符号(在 ES6 中添加)。
类型强制可以是显式的也可以是隐式的。
当开发人员通过编写适当的代码(如 Number(value))来表达在类型之间转换的意图时,它被称为显式类型强制(或类型转换)。
由于 JavaScript 是一种弱类型语言,因此值也可以在不同类型之间自动转换,称为隐式类型强制。它通常发生在您将运算符应用于不同类型的值时,例如 1 == null、2/'5'、null + new Date(),或者它可以由周围的上下文触发,例如 if (value) {... },其中值被强制为布尔值。
这是隐式类型强制的一些示例:
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/
如果数据类型彼此不相等,则强制发生。像 3 == "3" 或布尔 == 整数