Javascript中的类型强制到底是什么
What exactly is Type Coercion in Javascript?
Javascript中的类型强制到底是什么?
例如,关于使用==
而不是===
?
类型强制意味着当一个运算符的操作数是不同类型的操作数时,其中一个操作数将被转换为另一个操作数类型的"等效"值。例如,如果您这样做:
boolean == integer
布尔操作数将转换为整数:false
变为 0
,true
变为 1。然后比较这两个值。
但是,如果使用非转换比较运算符 ===
,则不会发生此类转换。当操作数的类型不同时,此运算符返回 false
,并且仅在它们属于相同类型时比较值。
强制不仅由比较运算符完成,尽管它们是唯一同时具有"严格"和"松散"变体的运算符。大多数算术运算符会自动将非数字参数转换为数字,例如 "50" / 5
被视为50 / 5
。还有许多内置函数和方法需要字符串参数;如果你给他们别的东西,他们会自动强迫他们使用字符串。
但要小心 - +
既是算术加法运算符又是字符串连接运算符 - 如果你string + number
,它会将数字转换为字符串并连接,而不是将字符串转换为数字并加法。这是对用户输入执行算术时所犯许多错误的根源,因为输入是一个字符串,除非您显式转换它。
你可以在 You Don't Know JS 中找到对 JavaScript 强制规则的很好的解释,在 MDN 中找到更多面向引用的文档。
让我们从类型系统的简短介绍开始,我认为这将有助于您理解类型强制的一般概念。
语言的类型系统定义了规则,这些规则告诉我们该语言中存在哪些类型的数据以及如何使用不同的运算符组合它们。例如,一个这样的规则可能指定加号 (+) 运算符仅作用于数字。这些规则的存在主要是为了防止你搬起石头砸自己的脚。但是,当程序员在程序中违反该规则时会发生什么?没有什么能阻止程序员在程序中键入{} + {}
或“hello” + 5
,即使语言认为这些表达式没有任何意义。
在这些情况下最终发生的情况取决于语言对其类型规则的严格程度。
语言类型系统通常持有两种立场之一,认为你违反了它的规则:
- 说"嘿,这不酷!"然后立即使程序崩溃。
- 说"我不能用 {} 做任何事情...但我可以用数字做一些事情"并尝试将 {} 转换为数字。
具有类型系统的语言对其规则采取第一立场,俗称"强类型"语言。他们严格不让你违反它的规则。那些采用第二种方法(如JavaScript)的语言被称为"弱类型"或"松散类型"语言。当然,您可以违反规则,但是当它强制转换您在程序中描述的数据类型以遵守其规则时,请不要感到惊讶。该行为称为...(鼓声)...类型强制。
现在让我们看一下 JavaScript 中的一些示例。首先,让我们从一个不会导致类型强制的表达式开始。
5 + 5
使用带有两个数字的 + 运算符,这是完全有效的。该程序将+视为表示"添加"并愉快地将两个数字相加。无需转换。
但是呢...
[] + 5
呃哦。在 JavaScript 中,+
可以表示添加两个数字或连接两个字符串。在这种情况下,我们既没有两个数字也没有两个字符串。我们只有一个数字和一个对象。根据 JavaScript 的类型规则,这在逻辑上是没有意义的。既然它原谅你违反它的规则,而不是崩溃,它无论如何都会试图理解它。那么JavaScript是做什么的呢?好吧,它知道如何连接字符串,因此它将 [] 和 5 转换为字符串,结果是字符串值"5"。
比较运算符==
和===
是怎么回事?为什么有两个比较运算符?
==
不能免受 JavaScript 的类型转换行为的影响。诸如 5 == “5”
之类的表达式的计算结果为 true,因为 JavaScript 将尝试转换其中一个表达式,以便它比较相同类型的数据。
在许多情况下,这是不可取的,因为您可能想知道要比较的某些数据是否属于不同类型的数据,以便您可以决定如何处理它。这就是===
运算符的用武之地。使用 ===
时,不会进行任何类型转换。因此,表达式 5 === “5”
的计算结果将为 false。
在 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
(数字)和"23"
(字符串)是一回事。 这使条件为 true 并打印控制台.log
在另一种情况下
if(23 === "23"){
console.log(" this line is inside the loop and is NOT executed");
}
在这种情况下===
Javascript不做类型强制,并且由于23
是一个数字,"23"
是字符串,并且由于===
这两种数据类型是不同的,这导致了条件中的false。它不打印控制台.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 强制中,所有值都转换为 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! 运算符。这!标记运算符将值强制转换为具有相反值的布尔值。我们可以使用此运算符两次将任何值转换为布尔值。
a == b
表示JavaScript将根据值是否可以相等地评估a
b
。 例如,false == 0
将计算 true,因为 0 也是布尔值 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"
最初声明为字符串的变量示例,该变量使用 ! 运算符强制转换为布尔值
类型强制是将值从一种类型转换为另一种类型的过程(例如字符串到数字,对象到布尔值等)。任何类型(无论是基元还是对象)都是类型强制的有效主体。回想一下,原语是:数字、字符串、布尔值、null、未定义 + 符号(在 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" 或布尔值 == 整数
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 从HTML表单发布blob的表单输入类型是什么
- 按钮类型是什么;按钮“;JavaScript中的平均值
- mongodb中db.collection.find()的返回类型是什么
- JavaScript中的“符号”原始数据类型是什么?
- JavaScript中的数组是什么类型的列表
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 在JavaScript中调用array()作为构造函数时,返回的是什么类型的数组
- 什么类型的对象/属性是原型getter和setter
- canvas' toDataURL() 函数可能的数据类型是什么?
- 为静态类型检查注释javascript的好解决方案是什么
- Javascript中的类型强制到底是什么
- 这在 Java 脚本中是什么类型的对象?以及如何将这种元素添加到此对象中
- 它是什么类型的Javascript模式
- 你能隐式地告诉智能感知变量是什么类型吗?
- 这句话是什么类型的?
- 这是什么类型的滑块
- 这是什么类型的时间戳,以及如何使用JavaScript将其转换为人类可读的
- 只是想知道这在javascript中是什么类型的数组