JavaScript数组';长度是多少?有被包围的危险吗?

JavaScript数组';长度是多少?有被包围的危险吗?,javascript,arrays,integer-overflow,Javascript,Arrays,Integer Overflow,我的意思是: 我有一个函数,我写的就像 function unstable_partition ( arr, piv ) { // puts all values less than piv on the left of arr and // all values greater than or equal to piv on the right side var i = 0, j = arr.length - 1; while (i < j) {

我的意思是:

我有一个函数,我写的就像

function unstable_partition ( arr, piv ) 
{
   // puts all values less than piv on the left of arr and 
   // all values greater than or equal to piv on the right side
   var i = 0, j = arr.length - 1;
   while (i < j)
   {
      if (arr[i] <= piv) ++i;
      else if (arr[j] >= piv) --j;
      else swap(arr,i,j);
   }
}
部分。因为我知道在C++中,一个完整的类型<代码>代码> sisixt < /COD>保持数组的大小是无符号的,所以如果该值是代码> 0 < /COD>,则<代码> 0—1 <代码>等于<代码> 0代码>代码>(最大的<代码> sisivit < /代码>),这将导致这个特定函数中的错误。p> 现在,我知道如果我这样做了,我甚至不用担心这个

function unstable_partition ( arr, piv ) 
{
   // puts all values less than piv on the left of arr and 
   // all values greater than or equal to piv on the right side
   var len = arr.length;
   if (len === 0) return;
   var i = 0, j = len - 1;
   while (i < j)
   {
      if (arr[i] <= piv) ++i;
      else if (arr[j] >= piv) --j;
      else swap(arr,i,j);
   }
}
功能不稳定分区(arr、piv)
{
//将所有小于piv的值放在arr和
//右侧大于或等于piv的所有值
var len=阵列长度;
如果(len==0)返回;
变量i=0,j=len-1;
而(i
但是我失去了紧凑,优雅

j=arr.length-1是否构成危险?

j=arr.length-1
是否构成危险

不会。所有数字在JS中都被视为64位浮点(尽管引擎可能会对此进行优化,只要它们是小整数)。当你从
0
中减去
1
时,你总是会得到
-1

当您询问
arr.length
时,“每个数组对象都有一个长度属性,其值总是小于232的非负整数”。因此,它在内部可能被存储为一个无符号的32位整数,在一个值上实际上是,但您可以放心,这个数字将适合于完成算术的64位浮点

j=arr.length-1
是否构成危险

不会。所有数字在JS中都被视为64位浮点(尽管引擎可能会对此进行优化,只要它们是小整数)。当你从
0
中减去
1
时,你总是会得到
-1


当您询问
arr.length
时,“每个数组对象都有一个长度属性,其值总是小于232的非负整数”。因此,它在内部可能被存储为无符号32位整数,并且在值上实际上是,但您可以放心,该数字将适合于完成算术的64位浮点。

长度
在中定义为。但是,任何数学运算都会将其强制转换为一个数字,因此最终会得到-1:

[].length - 1 // = -1
将负数指定给长度将引发错误。尝试从数组中获取负数将返回Undefined,除非您在数组中创建了具有该名称的属性,这是可能的,因为数组只是具有比其最大正整数属性大一的神奇属性的对象

a = []
a[-2] = 'something'
a[-1] //undefined
a.length //0
a[10] = 'something'
a.length //11

长度
在中定义为。但是,任何数学运算都会将其强制转换为一个数字,因此最终会得到-1:

[].length - 1 // = -1
将负数指定给长度将引发错误。尝试从数组中获取负数将返回Undefined,除非您在数组中创建了具有该名称的属性,这是可能的,因为数组只是具有比其最大正整数属性大一的神奇属性的对象

a = []
a[-2] = 'something'
a[-1] //undefined
a.length //0
a[10] = 'something'
a.length //11

JavaScript只有一个数字类型-数字,对应于64位IEEE-754浮点数字(C++中的
双精度
类型),但只有一个NaN值。因此,使用
arr.length-1缠绕不会有危险

数组的“length”属性返回一个数字,并且限制为0范围内的整数值。。。2^32-1

每个数组对象都有一个长度属性,其值始终是小于2^32的非负整数

因此
arr.length-1
将始终返回-1或0或小于2^32-2的正整数


(顺便说一句,2^53-1是在+1等操作开始失去精度之前可以安全存储在数字中的最大整数。ECMAScript标准的各个部分都将此作为限制,例如
Array.prototype.push
的定义,但数组“length”属性受到了进一步的限制。)JavaScript只有一个数字类型-数字,对应于64位IEEE-754浮点数字(C++中的
双精度
类型),但只有一个NaN值。因此,使用
arr.length-1缠绕不会有危险

数组的“length”属性返回一个数字,并且限制为0范围内的整数值。。。2^32-1

每个数组对象都有一个长度属性,其值始终是小于2^32的非负整数

因此
arr.length-1
将始终返回-1或0或小于2^32-2的正整数


(顺便说一句,2^53-1是在+1等操作开始失去精度之前可以安全存储在数字中的最大整数。ECMAScript标准的各个部分都将此作为限制,例如
Array.prototype.push
的定义,但数组的“length”属性受到了进一步的限制。)

,如果
arr.length
0
,那么
j
将是
-1
j
是否为负值完全取决于您使用的算法。它不会在溢出/下溢错误的意义上“构成危险”。JavaScript中的数组索引被视为32位无符号值。@Pointy那么这意味着从
0
中减去
1
将等于
1*1+1*2+1*4+…+1*2^31
@Pointy,不完全相同。在ECMAScript 5中,数字是64位浮点值@尖头,啊,你完全正确。我认为这是一个实现问题,但不是,它在规范的其他地方:如果
arr.length
0
,那么
j
将是
-1
j
是否为负值完全取决于您使用的算法。它不会“p”