您好我正在尝试打印出第一个元素和数组中附加到该元素的元素。我在Firefox中获得'helloh',在IE中获得'helloundefined'。有谁知道为什么这不起作用。
这是一个jsfiddle .. http://jsfiddle.net/ZtuAu/
<script language=javascript>
var test = new Array();
test[0] = new Array();
test[0] = "hello";
test[0][0] = "world";
document.write(test[0] + test[0][0]);
</script>
答案 0 :(得分:3)
test[0]
只能有一个值。你试图给它两个值。而且,您还发现只有一些浏览器允许使用数组语法来检索字符串中的特定字符。
首先,你这样做:
test[0] = new Array();
然后,你这样做:
test[0] = "hello";
第二个替换你的第一个,以便test[0]
不包含数组,它包含一个字符串"hello"
所以当这样做时:
test[0][0] = "world"
您正尝试在[0]
中的"hello"
字符串上分配test[0]
字符串对象不允许的字符串(因此它什么都不做)。
然后,当您尝试在test[0][0]
语句中阅读document.write()
时,您正试图对[0]
中的"hello"
字符串执行test[0]
。字符串对象在技术上不允许使用数组语法索引字符串,但某些浏览器允许它作为从字符串中检索单个字符的快捷方式。这就是为什么你在不同的浏览器中得到不同的结果(它返回"hello"
字符串的第0个字符"h"
)。
注意:如果您确实想要检索字符串的特定字符,请使用charAt(n)
。请参阅MDN for doc。
也许你想做的就是:
<script language=javascript>
var test = new Array();
test[0] = "hello";
test[1] = "world";
document.write(test[0] + test[1]);
</script>
答案 1 :(得分:0)
在第三行(test[0] = new Array();
)上,将test[0]
设置为新数组。
在下一行(test[0] = "hello";
)上,将其设置为字符串。
然后使用test[0][0] = "world";
,您尝试将该字符串的第一个索引设置为“world”。
这就像试图做"hello"[0] = "world";
一样。你不能这样做。 JavaScript中的String对象是不可变的。
var test = Array();
构成一维结构......就像这样:
0 - [_]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
然后,将第一个点设置为新数组会为其提供第二个维度(但仅限于第一个点)。
0 - [_][_][_][_][_]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
然后,将第一个点设置为"Hello"
将摆脱放在那里的数组。
0 - ["Hello"]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
此时,test[0]
为"Hello"
。不是您想要的标准Array
。您无法设置字符串的[0]
。
当你要求尝试设置像[0]
这样的字符串的"Hello"
时,实际上没有任何事情发生,所以行test[0][0] = "world";
根本就没有做任何事情!
内心深处,字符串与数组相同。数组操作甚至可以应用于String。浏览器暴露底层相似性的程度并不十分一致。在FF,Chrome和Safari中,test[0][0]
[0]
获得"Hello"
["H","e","l","l","o"]
。在这些浏览器中,Hello与test[0][0]
有点相同。因此,"Hello"[0]
= "H"
= charAt(x)
。 IE不会以这种方式处理字符串。这就是为什么你看到不一致的行为。
希望这有帮助!
编辑:正如其他人已经建议的那样,使用{{1}}是尝试从字符串中拉出特定位置的字符时应该使用的函数。答案 2 :(得分:0)
首先让test [0] [0]成为一个数组,然后将一个字符串放入其中。因此,test[0]
为hello
,test[0][0]
为h
,因为它是hello
字符串的第0个元素。所以你得到hello
+ h
答案 3 :(得分:0)
你有一个数组
var test = new Array();
如果要在其中插入项目,请使用push
test[0] = new Array(); // not this way
test.push(new Array()); // this way
因为您希望数组更新其长度属性等。
所以,你这样做:
test[0] = new Array();
test[0] = "hello";
你要分配两次相同的东西,所以很自然,只有第二个任务成立。所以我们有
test[0] == "hello"
然后,在FireFox中,您可以使用[]
来访问字符串的任何字符
test[0][0] == "hello"[0] == "h"
显然,在IE中你不能这样做,所以你得到undefined
。