types强制在Javascript中究竟是什么?
在Javascript中究竟是types强制?
例如,使用==
代替===
?
types强制意味着当一个操作符的操作数是不同的types时,其中一个将被转换为另一个操作数types的“等价”值。 例如,如果你这样做:
boolean == integer
布尔操作数将被转换为整数: false
变为0
, true
变为1.然后比较两个值。
但是,如果使用非转换比较运算符===
,则不会发生此类转换。 当操作数是不同的types时,这个操作符返回false
,并且只在它们是相同types时才比较这些值。
让我们从一个简短的介绍开始,我认为这将帮助你理解types强制的一般概念。
一种语言的types系统定义了一些规则,告诉我们该语言中存在哪些types的数据,以及如何使用不同的操作符来组合这些数据。 例如,一个这样的规则可以指定加号(+)只对数字起作用。 这些规则主要是为了防止你在脚下射击自己。 但是,程序员在程序中违反规则会发生什么? 没有什么能阻止程序员在程序中input{} + {}
或“hello” + 5
,即使语言不认为这些expression式是有意义的。
在这些情况下最终发生的事情取决于语言对其types规则的严格程度。
一个语言types的系统通常拥有两个关于你打破规则的职位之一:
- 说“嘿,这不太好!”,并立即崩溃你的程序。
- 说“我不能用{}做任何事情……但是我可以用数字做些事情”,并尝试将{}转换为数字。
语言types系统在其规则中占据第一位的语言通俗地称为“强types”语言。 他们严格的不让你违反规则。 那些采取第二种方法(如JavaScript)被称为“弱types”或“松散types”的语言。 当然,你可以打破规则,但是当你强制转换你在程序中描述的数据types以符合其规则时,不要感到惊讶。 这种行为被称为…(鼓卷)… types的强制 。
现在让我们看一下JavaScript中的一些例子。 首先,让我们从一个不会导致强制types的expression式开始。
5 + 5
使用两个数字的+运算符是完全有效的。 程序将把+表示为“添加”,并愉快地添加这两个数字。 没有必要的转换。
但是呢…
[] + 5
呃哦。 在JavaScript中, +
可以表示添加两个数字或连接两个string。 在这种情况下,我们既没有两个数字也没有两个string。 我们只有一个数字和一个对象。 根据JavaScript的types规则,这是没有道理的。 既然它宽恕你违反规则,而不是崩溃它试图理解它。 那么JavaScript是做什么的? 那么,它知道如何连接string,所以它将[]和5转换成string,结果是string值“5”。
与比较运算符==
和===
什么关系? 为什么有两个比较运算符?
==
对JavaScript的types转换行为不是免疫的。 诸如5 == “5”
expression式将评估为true,因为JavaScript会尝试转换其中的一个,以便比较相同types的数据。
在许多情况下,这是不可取的,因为您可能想知道您正在比较的某些数据是不同types的,因此您可以决定如何处理。 这就是===
运算符的地方。当你使用===
,不会发生types转换。 因此,expression式5 === “5”
将评估为false。
在Python中,如果你尝试添加string和整数,你会得到一个错误:
>>> "hi" + 10 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
然而,在JavaScript中,你不。 10
被转换为一个string:
> "hi" + 10 "hi10"
“types强制”只是上述的一个奇怪的名词。 实际上,这两种语言在静态types系统中都没有Java或C语言或其他语言的“types”。 语言如何处理各种非静态types的值之间的交互是一个select和惯例的问题。
a == b
意味着javascript会根据是否可以同等评估值来评估对b
的评估。 例如, false == 0
将评估为true,因为0也是Boolean false的值。 然而, false === 0
将因为严格比较而评估为假,0与虚假的物理值不同。 另一个例子是false == ''
所以基本上比较宽松比较严格比较,因为JavaScript是一个松散types的语言。 也就是说,javascript会根据代码的上下文来尝试转换variables,如果没有严格的比较,这会使事情变得相同。 PHP也有这种行为。
var str = 'dude'; console.log(typeof str); // "string" console.log(!str); // false console.log(typeof !str); // "boolean"
最初声明为string的variables的示例被强制为布尔值, 操作者