Array.size()与Array.length的区别

465

这两者有什么区别?

我知道array.size()是函数,而array.length是属性。在使用时是否有不同的用例?哪一个更高效?(我想.length会更快,因为它是一个属性而不是一个方法调用?)为什么会有人使用速度较慢的选项?是否有一些浏览器与其中一个不兼容?

  var x = [];
  console.log(x.size());
  console.log(x.length);
  console.log(x.size()==x.length);
  x =[1,2,3];
  console.log(x.size());
  console.log(x.length);
  console.log(x.size()==x.length);

将打印:

  0, 0, true
  3, 3, true

74
你在原生JavaScript中是从哪里找到Array.size()方法的? - VisioN
2
Chrome没有.size... - David G
2
在运行您的代码后,这是我Chrome控制台的截图。 - gilly3
3
.size() 很可能来自 Prototype 框架:http://prototypejs.org/doc/latest/language/Array/prototype/size/ - MikeM
2
为什么这个问题会有这么多赞,很可能是因为 OP 使用了 Prototype 或其他框架,添加了 size() 方法到 Array 中。我个人认为这非常误导新读者。答案并没有直接回答问题。考虑修改或删除这个问题? - Damon Aw
显示剩余4条评论
10个回答

613

Array.size()不是有效的方法

始终使用length属性

由于size方法不是原生的数组方法,因此某个库或脚本可能会将其添加到数组原型中。这通常是为了添加对自定义getter的支持。一个使用示例是当您想获取数组在内存中的大小时(这是我能想到的唯一有用的情况)。

不幸的是,Underscore.js定义了一个返回对象或数组的长度的size方法。由于函数的length属性被定义为函数声明的命名参数数量,因此他们不得不选择另一种方式,选择了size(count可能是更好的选择)。


185

.size()不是Array的JS原生函数(至少在我知道的所有浏览器中都不是)。

应该使用.length


如果

如果.size()在您的页面上工作,确保您没有包含任何额外的库,比如像prototype这样搞乱了Array原型。

或者

可能有一些插件干扰了您浏览器的Array原型。


它在Chrome中可以工作,但在Firefox中无法工作。我倾向于使用Chrome进行调试,所以它似乎可以工作。感谢指出它的不存在。 - Abraham P
9
如果你在Chrome中可以正常运行,很可能是你在页面上调用了某个额外的库,将其添加到了数组原型中。 - Spike Williams
2
版本号23.0.1271.97[].size function size(){return this.length;}实际上它只是 .length 的一个包装器... 我有点感到愚蠢了... - Abraham P
@AbrahamP 我和你使用的是同样的版本,但我没有 size 函数。请确保你没有在某个随意的库中包含它... - Naftali
2
@AbrahamP,在此页面上按F12,然后在控制台中键入“[].size”。如果可以运行,则表示您安装了某种Chrome插件,它正在干扰数组原型,这可能会引起担忧。 :) - aquinas
显示剩余5条评论

39
在Jquery和许多其他库中,可以使用`.size()`函数。
只有当索引是整数时,才能使用`.length`属性。
`length`属性将适用于这种类型的数组。
var nums = new Array();
nums[0] = 1; 
nums[1] = 2;
print(nums.length); // displays 2

在以下情况下,length属性无法起作用:
var pbook = new Array(); 
pbook["David"] = 1; 
pbook["Jennifer"] = 2;
print(pbook.length); // displays 0

原因是JavaScript不支持数组中的字符串索引,而是支持对象(作为属性)的索引。因此,pbook或者一个名为"pbook"的Array原型对象现在将有两个属性被赋值("David"和"Jennifer";即pbook.David),并且表示一个空数组。

const a = []; // Relatively the same as: const a = new Array();

a['0a'] = 123; a['2'] = 456; a[1] = 789;

console.log(`a(${a.length}) = `, a);
console.log(`Enumerable properties of ${Object.prototype.toString.call(a)} = `, Object.keys(a));

在你的情况下,你应该使用 .length 属性。
请考虑以下对象:
- JavaScript 对象的长度
- Object.getOwnPropertyNames 与 Object.keys 的区别

如果大小不起作用,是否有适用于字符串的其他方法? - Chris
2
@Chris 对于具有字符串键的数组,例如上面的 pbook,您可以使用 $(pbook).size(); [需要 jQuery] - nasty pasty
3
你为什么要在每个地方都加两个空格呢? - Post Self

21

.size()是jQuery的方法,很可能你要么搞混了,要么是从已经将jQuery库导入到其项目中的其他人那里获得的。

如果您已经导入了jQuery并且编写了$(array).size(),它会返回数组的长度。


1
许多库都使用了.size(),这不仅限于jQuery。 - Naftali

19

array.length并不一定是数组中项目的数量:

var a = ['car1', 'car2', 'car3'];
a[100] = 'car100';
a.length; // 101

数组的长度比最高索引多一个。

如之前所述,Array.size() 不是一个有效的方法。

更多信息


实际上,它是项目的数量。大多数JS解释器将使用未定义填充数组行。在您的示例中,您的数组中将有101个元素,其中97个元素没有值(未定义),但元素确实存在。 它看起来像这样: ['car1','car2','car3',undefined * 97,'car100'] 如果您循环访问此数组,则循环后您的增量变量将具有值101。 - ElJackiste
1
另一方面,array.length并不一定是数组中已经定义(而非赋值)的值的数量。 - ElJackiste
这正是数组中项目的数量。这些项目是否未定义取决于程序员的考虑,而不是JS。 - Layne Bernardo

11

属性'length' 返回具有数字键的数组的 (last_key + 1):

var  nums  =  new  Array();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
log.info( nums.length );

会打印出12!

这将起作用:

var  nums  =  new  Array();
nums [ 10 ]  =  10 ; 
nums [ 11 ]  =  11 ;
nums [ 12 ]  =  12 ;
log.info( nums.length + '  /  '+ Object.keys(nums).length );

虽然这是一个有趣的回答,但我不完全确定它是否是对于“这个”问题的答案。 - OliverRadini
1
OP问的是'Array.size() vs Array.length'。从之前的讨论中可以明确,'size'函数不是标准JavaScript的一部分,而是由库实现的。因此,我假设OP对如何检索JavaScript数组的实际长度感兴趣。我揭示了JavaScript的一个鲜为人知的“特性”,这可能会导致意外的行为,特别是当数组包含其他类型的对象(例如字符串)时,行为会有所不同。 - cskwg
你可能会对这个感兴趣:function asz( o ) { return null !== o && 'object' === typeof o && def( o.length ) ? Object.keys( o ).length : 0; } - cskwg

4

1
我们可以使用.length属性来设置或返回数组中元素的数量。返回值是一个数字
> set the length: let count = myArray.length;
> return lengthof an array : myArray.length

我们可以使用 .size 来过滤重复值并获取集合中元素的数量。
const set = new set([1,1,2,1]); 
 console.log(set.size) ;`

1
实际上,.size() 不是纯 JavaScript 方法,它是 Set 对象的访问器属性 .size,看起来有点像 .size() 但它不是函数方法,正如我所说,它是一个 Set 对象的访问器属性,用于显示 Set 对象中唯一元素的数量。

size 访问器属性返回 Set 对象中唯一元素的数量。

const set1 = new Set();
const object1 = new Object();

set1.add(42);
set1.add('forty two');
set1.add('forty two');
set1.add(object1);

console.log(set1.size);
// expected output: 3

length 是一个可迭代对象(数组)的属性,它返回该数组中元素的数量。该值是一个无符号的32位整数,始终比该数组中最高索引的数字大。

const clothing = ['shoes', 'shirts', 'socks', 'sweaters'];

console.log(clothing.length);
// expected output: 4

1

Size检测重复项,将返回唯一值的数量。

const set1 = new Set([1, 2, 3, 4, 5, 5, 5, 6]);
console.log(set1.size);
// expected output: 6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接