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”