在对象到布尔值的情况下,Javascript中的类型强制是如何实现的?
就我所知,在对象到布尔值的情况下,Javascript中的类型强制是如何实现的?,javascript,type-conversion,Javascript,Type Conversion,就我所知,(x==false)应该做与相同的事情!x,因为他们都试图将x解释为布尔值,然后将其取反 然而,当我尝试测试这个时,我开始有一些非常奇怪的行为 例如: false=[]和false==![]两者都返回true 另外 false==undefined和true==undefined都返回false,同样返回false false==Infinity和true==Infinity和 false==NaN和true==NaN 这到底是怎么回事 都在这里: 对于false=[]的情况: fa
(x==false)
应该做与相同的事情!x
,因为他们都试图将x
解释为布尔值,然后将其取反
然而,当我尝试测试这个时,我开始有一些非常奇怪的行为
例如:
false=[]
和false==![]
两者都返回true
另外
false==undefined
和true==undefined
都返回false,同样返回false
false==Infinity
和true==Infinity
和
false==NaN
和true==NaN
这到底是怎么回事
都在这里:
对于false=[]
的情况:
被转换为一个数字(0),因为这总是通过布尔运算完成的false
- []通过调用
转换为原语,这是一个空字符串[].valueOf().toString()
- 然后通过将空字符串转换为数字来计算
,由于其结果也是0,0==”
为真false=[]
false==![]
:
- 通过返回与ToBoolean(GetValue(expr))相反的
- 对于任何对象都是如此,所以
计算结果为![]
(因为false
),因此为!true=false
也是如此false==![]
(false==未定义)===false
和(true==未定义)===false
更简单:
和false
再次转换为数字(分别为0和1)true
- 由于undefined无法与数字进行比较,因此链将冒泡到默认结果,即
false
其他两种情况的计算方法相同:首先将布尔值转换为数字,然后将其与另一个数字进行比较。由于0和1都不等于无穷大或不是一个数字,因此这些表达式的计算结果也会为
false
中描述了抽象等式算法
对于x==y
,其中x=false
和y=[]
:
0
和y=[]
我们在步骤8结束:类型(x)==number。和类型(y)=对象。
因此,让结果为x==(y)。
TopPrimitive([])==“” 现在,用x=
0
和y=“
再次重复该算法。我们以4结尾:“返回比较结果x==ToNumber(y)。”ToNumber(“”==0 算法的最后一次重复在步骤1结束(类型相同)。根据1.c.iii,0==0,返回true 通过使用该算法,可以以类似的方式获得其他结果
false == []
允许使用==
Javascript应用转换。该对象将转换为一个基本体,以将类型与布尔值匹配,并留下一个空字符串。false将转换为数字0。比较空字符串和数字0。字符串被转换为一个0的数字,因此表达式为“true”
Javascript将对象转换为布尔值true,因此拒绝true的结果为false
false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN
还是一样的!false转换为0,true转换为1。然后,undefined被转换成一个数字,它是。。。楠!无论如何都是假的
我建议使用====代码>尽可能多地获取“预期”结果,除非您非常清楚自己在做什么。使用类似于Boolean(未定义)=fals
e的东西也很好
在转换内容时,请检查ECMAScript规范中的所有详细信息。您是否与==
得到相同的结果?false=[]
可以解释为[].toString()==”
,和false==”
。无论如何,听起来您似乎相信,如果false==未定义的
返回false,那么true==undefined
应该返回true,但为什么这类比较会返回任何有意义的东西呢?@RobertHarvey没有,这是一个学术练习。显然,如果(![]==false)写文章的任何人都应该被解雇。@RobertKoritnik:是的,这个问题是修辞性的。
false == undefined true == undefined
false == Infinity and true == Infinity
false == NaN and true == NaN