Javascript 为什么将整数与长度为1的数组进行比较会返回true,而将长度为2或更多的数组进行比较会返回false?
为什么将0与长度为1的数组进行比较会返回true,而将数组长度为2或更大的数组进行比较会返回false? 比如说,Javascript 为什么将整数与长度为1的数组进行比较会返回true,而将长度为2或更多的数组进行比较会返回false?,javascript,arrays,Javascript,Arrays,为什么将0与长度为1的数组进行比较会返回true,而将数组长度为2或更大的数组进行比较会返回false? 比如说, var a=[] //undefined 0<a //returns false a.push(1) // [1] 0<a // returns true a.push(2) // [1, 2] 0<a // return false a.push(3) // [1, 2, 3] 0<a // return false var a=[]//未定义 0如
var a=[] //undefined
0<a //returns false
a.push(1) // [1]
0<a // returns true
a.push(2) // [1, 2]
0<a // return false
a.push(3) // [1, 2, 3]
0<a // return false
var a=[]//未定义
0如果要比较数组的长度
,请使用a.length
,如果您在上面的每一行后面检查数组作为一个数字,它会给出您想要的答案。
记住javascript在比较过程中会进行一些类型转换
Number(a); //insert this after each line
在JS中,如果数组中只有1个元素,JS将像您的case-number中的元素一样计算其值。
例如:
var b[]
b.push(8);
b == 8 //true (but b === 8 is false!)
如果数组中有多于1个元素,那么数组类型是array[number],这与number不同,因此无法将其与数字进行比较
这就是为什么在您这样做之后,您还要编写代码:
var a=[]
0<a
a.push(1)
0<a
var a=[]
0基本上,您首先得到隐式ID类型转换
该对象重写的toString
方法。对于数组对象,toString方法加入数组并返回一个字符串,该字符串包含由逗号分隔的每个数组元素
当数组被表示为文本值或在字符串连接中引用数组时,JavaScript会自动调用toString
方法
likejoin
工作,然后将其转换为数字
你做什么你得到什么结果数组字符串编号
------------ ------------ ------ --------- -------- ----------
var a=[];
0''->0
a、 推(1);
0“1”->1
a、 推(2);
0'1,2'->NaN
a、 推(3);
0'1,2,3'->NaN
在JS这样的松散类型语言中,您必须注意数组这样的可变类型是如何强制转换为不可变类型的。基本上,[1,2]
变成了“1,2”
因此,为了进行比较,javascript通常会尝试将操作数转换为数字(首选)
看看这个例子:
console.log("test" == true);//false
console.log("test" == false);//false
为什么??因为“test”试图转换为数字,所以数字(“test”)给出NaN,NaN不等于true或false。
同样地
0<a becomes 0 < Number(a) becomes 0 < 0 returns "false".
0数字和数组之间的比较将触发类型转换。EcmaScript规范在中列出了这方面的规则。根据这些规则,数字不会转换为其他数据类型,但对象(数组是对象)将进行如下转换:
让PrimitValue为TopPrimitive(参数、提示号)
返回tonNumber(primValue)
ToPrimitive
功能描述如下:
将exoticToPrim设为GetMethod(输入,@@toPrimitive)
@@toPrimitive
是一个符号,您可以通过以下方式访问它。问题是Array
不具有此属性,因此该过程将继续此步骤:
返回OrdinaryToPrimitive(输入、提示)
使用参数O和hint调用抽象操作OrdinaryToPrimitive时,将执行以下步骤:
如果提示为“string”,则
a。让方法名为«“toString”,“valueOf”»
否则,
a。让方法名为«“valueOf”,“toString”»
由于提示是“number”,因此我们处于第二种情况。接下来的步骤说明了这些方法是按顺序应用的
现在,Array.prototype.valueOf
只返回数组本身,因此下面的子步骤不会返回,因为类型是Object(即Array)
5.c.iii如果类型(结果)不是对象,则返回结果
因此,回退开始,并在阵列上调用toString
因此,数组被转换为字符串。这是顶部列出的两个步骤中的第一个步骤的结果:
让PrimitValue为TopPrimitive(参数、提示号)
返回tonNumber(primValue)
第二步更简单:然后将字符串转换为数字,如中所述
当Array.prototype.toString
方法创建一个逗号分隔的列表时,一旦一个数组有多个元素,这些字符串肯定会变成无效数字。如规范中所述,返回值为NaN
任何以及为什么push(2)
和push(3)
返回NaN
?console.log(a.toString(),Number(a.toString())
您是否有一个引用,在本例中,JavaScript首先执行到字符串的转换,然后执行到数字的转换?强制@trincot,在ECMA 262 V 6中,它首先尝试获取一个原语值,该原语值是由toString实现的。@NinaScholz Note PreferredType,似乎是数字。@PankajShukla,对。转换到字符串后,您会得到e数值。它与值是否不可变无关。即使使用对象使数组不可变。冻结也会得到这种强制。是的,你是对的。我的意思是类型强制是针对不可变类型的。我想你指的是“基元”,而不是“不可变”.也有不可变的对象,强制不针对它们。
0<a becomes 0 < Number(a) becomes 0 < 0 returns "false".