我已经玩javascript阵列和我们碰到什么我觉得是一些不一致的地方,我希望有人可以解释他们对我来说。

让我们开始这样的:


var myArray = [1, 2, 3, 4, 5];
document.write("Length: " + myArray.length + "<br />");
for( var i in myArray){
   document.write( "myArray[" + i + "] = " + myArray[i] + "<br />");
}
document.write(myArray.join(", ") + "<br /><br />");
Length: 5
myArray[0] = 1
myArray[1] = 2
myArray[2] = 3
myArray[3] = 4
myArray[4] = 5
1, 2, 3, 4, 5

没有什么特殊的关于这个代码,但我的理解是,javascript阵列是一个目的,因此properities可以添加到阵列,这些properities加入一系列似乎不一致,给我。

在继续之前,我请注意如何串值都转换为数值在javascript。

  • 非空string->数值的串或南

  • Empty string->0

因此由于一个javascript阵列是一个目的以下法律:


myArray["someThing"] = "someThing";
myArray[""] = "Empty String";
myArray["4"] = "four";

对于(var我在myArray){ 文件。写信("myArray["+i+"]="+myArray[i]+"<br />");} 文件。写信(myArray.加入(",")+"<br /><br />");

Length: 5
myArray[0] = 1
myArray[1] = 2
myArray[2] = 3
myArray[3] = 4
myArray[4] = four
myArray[someThing] = someThing
myArray[] = Empty String
1, 2, 3, 4, four

输出是意想不到的。

不empty string"4"转变为其数值时设置的财产myArray["4"],这似乎是正确的。然而empty string""不转换成其数值为0,这被视为一个空串。也不empty string"什么"是不转换成其数值,南,它被视为一串。所以这是什么?是的声明内部myArray[]中的数字或字符串下?

还有,为什么是两个、无数字,properities的myArray不包括在myArray.长度和myArray.加入(",")?

有帮助吗?

解决方案

钥匙JavaScript阵列的实际串。详情和执行情况的地图的类型的任意键,检查 这个答案.


为澄清和加到什么杰森发表:JavaScript阵列的对象。对象具有的性质。一个酒店名字是一串的价值。因此,列指数被转换为字符串以及之前更多的东西可能发生。一个酒店名P将被视为一系列索引(即特别阵列-魔法将援引)如果下列拥有(通信机制详解-262,15.4):

ToString(ToUint32(P))等于P和ToUint32(P)不等于2^32−1

这一数字指数,将转换为字符串(而不是周围的其他方法)可以很容易地证实:

var array = [];
array[1] = 'foo';
array['1'] = 'bar';
array['+1'] = 'baz';
document.writeln(array[1]); // outputs bar

此外,其不良做法以迭代过一系列的条目有一个 for..in 环-你可能会得到意想不到的结果,如果有人搞砸了一些原型(而这是不真快,或者)。使用的标准 for(var i= 0; i < array.length; ++i) 代替。

其他提示

(编辑:以下是不正确的)

钥匙JavaScript 对象 实际上串。Javascript 阵列 通过本身具有的数字指标。如果你存东西与一个索引,该索引可以被解释为一个非负整数,它将试图这样做。如果你存东西的一个指数是不是一个非负整数(例如这是字母数字,负,或浮点数量与一个分段),它将无法在该阵列的索引存储和默认的 对象 (这是阵的基类)存储,然后转换参数字符串和存储由串的指标-但这些储存的属性是不是看到,通过列类,因此不可见,其方法/属性(长,加入,切片,接头,推,爸爸,等等)。

编辑:上述是不正确的(如克里斯托弗foo/bar/baz例示)。实际储存数指数根据的 写规格 是的,事实上,符,但如果它们是有效的指标阵列(非负整数)则列目的 [[Put]] 方法,它是特殊的,使得这些特别值可见的阵列的"列上下"的方法。

这是一个答案 菲洛的后.他的基准是有缺陷的,因为他用不同的酒店名称的对象的版本:他应该有用 i 以及不 x.

如果做法正确,例如这样的:

var start, end, count = 1000000;

var obj = {},
    array = [];

start = new Date;
for(var i = count; i--; )
    array[i] = i;
end = new Date;
document.writeln(Number(end) - Number(start));

start = new Date;
for(var i = count; i--; )
    obj[i] = i;
end = new Date;
document.writeln(Number(end) - Number(start));

你会看到这次将会是非常接近。在FF3.0.5,该阵列的版本,甚至一直较慢(在歌剧院,这是其他方式)。

阵列,像其他的一切都在JavaScript,对象。对象已被祝福的 点符号 为了便于开发者的负担。用你的实例

myArray["someThing"] = "someThing";

是相同的写作

myArray.someThing = "someThing";

在这种情况下,添加一个酒店到的对象而不是将它添加到数。这同样适用空串,虽然不能使用 点符号 对于空串...奇怪,是吧?

在这种情况下的"4",它可以强迫成整数,因此使用作为索引入阵列。

我不同意克里斯托夫*当他国家"列指数被转换为字符串".

第一,我认为这是执行依赖于...我想(good)的实施者将优化阵列访问,也有一些智能的方式来做到这一点。

实际上,我做了一点小小的试验,虽然它不如大多数微型基准(ie。不超可靠的),它有趣的是:

result = ""
var x;

var trueArray = []
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
  x = "i" + i; // To do the same operations
  trueArray[i] = 1;
}
var endTime = new Date();
result += "With array: " + (endTime - startTime) + "\n";

var sArray = []
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
  x = "" + i;
  sArray[x] = 1;
}
var endTime = new Date();
result += "With s array: " + (endTime - startTime) + "\n";

var objArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
  x = "i" + i;
  objArray[x] = 1;
}
var endTime = new Date();
result += "With object(i): " + (endTime - startTime) + "\n";

var sobjArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
  x = "" + i;
  sobjArray[x] = 1;
}
var endTime = new Date();
result += "With s object: " + (endTime - startTime) + "\n";

var iobjArray = {}
var startTime = new Date();
for (var i = 0; i < 100000; i++)
{
  x = "" + i;
  iobjArray[i] = 1;
}
var endTime = new Date();
result += "With i object: " + (endTime - startTime) + "\n";


// Then display result

在IE6,我获得:与阵列:1453用对象:3547
在FF3.0,我获得:与阵列:83用对象:226
在Safari3.1,我获得:与阵列:140用对象:313
在歌剧院9.26,因为某些原因我没有得到结果,但是,如果我减少到十的数量的循环,我获得:与阵列:47用对象:516
实际上,我让剧院运行的话,我的类型这一点,并最终得到了结果:与阵列:281用对象:166063...

所以列优化!这是幸运...
克里斯托弗的示威没有打动了我。我的结论将会有更多的是串可以解释为数字是作这样的处理,随着援引式...

所以我解释的结果是,该阵列表现得像一个快速的阵列数值指数时料与这些(也许是一个行为联阵在稀疏的价值观,即。一些孤立的大指数),但是作为对象,它仍然具有正常处理的性质。但是,这些性质不会处理中的阵列的一部分,因此结果你得到了与加入().

[编辑]我加入了一些循环,以下克里斯托弗的思想。
在FF3,我获得:与阵列:92s阵列:93用对象(i):243s目的:194与我的对象:125(很合同之间的运行,但是大约相一致)。

我不是超级-相信这一整数>string->整数轮行程,甚至通信机制详解请求的这个序列。我读的是:是的财产是一串并且可以被解释为整数,那么它是作这样的处理。

当然,唯一肯定的方式知道将要看一个执行...

我感兴趣地注意到,普通的目的得到整数的财产或财产,可以转变为一个整数都以某种方式的优化。也许是因为很多JS程序员使用普通的对象阵列,以实施者判断有趣的优化这种情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top