Javascript中的Type Coercion究竟是什么?

ges*_*nha 110 javascript

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

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

Bar*_*mar 158

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

boolean == integer
Run Code Online (Sandbox Code Playgroud)

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

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

  • @GEspinha这就是使用松散类型语言的"艺术".有些人这么认为,一般认为松散类型的语言是编程世界的祸害.但是,如果您知道自己在做什么,它可以使代码更短,更灵活. (8认同)
  • @Barmar它也适用于`>,<`吗? (2认同)
  • 关于强制的一个很好的参考和解释:https://github.com/getify/You-Dont-Know-JS/blob/master/types%20%26%20grammar/ch4.md (2认同)

lin*_*les 51

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

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

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

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

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

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

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

5 + 5
Run Code Online (Sandbox Code Playgroud)

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

但是关于 …

[] + 5
Run Code Online (Sandbox Code Playgroud)

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

什么是与运营商相比,交易=====?为什么有两个比较运算符?

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

在许多情况下,这是不可取的,因为您可能想知道您所比较的某些数据是否属于不同类型,以便您可以决定如何处理它.这就是===操作员进来的地方.使用时===,不会进行类型转换.因此,表达式5 === “5”将评估为false.

  • 感谢很好的解释,尤其是"A语言类型系统通常拥有两个位置之一" (4认同)
  • 这应该是公认的答案,因为它显示了多个方面的自动类型强制,而不仅仅是 == 比较示例。这个答案在回答问题和消除所有歧义方面做得更好。谢谢你花时间写出来。 (2认同)

Cla*_*diu 6

在Python中,如果您尝试添加字符串和整数,则会出现错误:

>>> "hi" + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Run Code Online (Sandbox Code Playgroud)

但是在JavaScript中,你没有.将10被转换为字符串:

> "hi" + 10
"hi10"
Run Code Online (Sandbox Code Playgroud)

对于上述情况,"类型强制"只是一种奇怪的用词.实际上,在Java或C或其他具有静态类型系统的语言中,两种语言都没有"类型".语言如何处理各种非静态类型值之间的交互是一个选择和约定的问题.