Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么将整数与长度为1的数组进行比较会返回true,而将长度为2或更多的数组进行比较会返回false?_Javascript_Arrays - Fatal编程技术网

Javascript 为什么将整数与长度为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如

为什么将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如果要比较数组的
长度
,请使用
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
方法

like
join
工作,然后将其转换为数字

你做什么你得到什么结果数组字符串编号
------------  ------------  ------  ---------    --------    ----------
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".