Javascript 为什么splice返回字符串而不是数组?
我试着从二维数组arr拼接数组2 以下是我两次失败的尝试: (一) (二)Javascript 为什么splice返回字符串而不是数组?,javascript,multidimensional-array,array-splice,Javascript,Multidimensional Array,Array Splice,我试着从二维数组arr拼接数组2 以下是我两次失败的尝试: (一) (二) 我有一个不太理想的解决方法,但我希望用一个函数来实现这一点 var test = arr[1].slice(0); arr.splice(1,1); 我认为它的工作如预期 splice方法始终返回一个数组 当你说arr[1]时,拼接(0);它在一上呼叫spilce并给出['a'] 当你做arr.splice(1,1)时;它将返回[1]我认为它的工作与预期一样 splice方法始终返回一个数组 当你说arr[1]时
我有一个不太理想的解决方法,但我希望用一个函数来实现这一点
var test = arr[1].slice(0);
arr.splice(1,1);
我认为它的工作如预期 splice方法始终返回一个数组 当你说arr[1]时,拼接(0);它在一上呼叫spilce并给出['a']
当你做arr.splice(1,1)时;它将返回[1]我认为它的工作与预期一样 splice方法始终返回一个数组 当你说arr[1]时,拼接(0);它在一上呼叫spilce并给出['a']
当你做arr.splice(1,1)时;它将返回[一个]有趣的观察结果。根据ECMA规范(262,第5版): 使用调用splice方法时 两个或多个参数开始, 删除计数和(可选)项目1, 第2项等,删除计数元素 从数组索引开始的数组的 start被参数替换 item1、item2等。数组对象 包含已删除的元素(如果 任何)返回 因此,拼接返回一个已删除元素的数组。因此,如果要引用已删除的数组,应使用以下语法:
var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'
有趣的观察。根据ECMA规范(262,第5版): 使用调用splice方法时 两个或多个参数开始, 删除计数和(可选)项目1, 第2项等,删除计数元素 从数组索引开始的数组的 start被参数替换 item1、item2等。数组对象 包含已删除的元素(如果 任何)返回 因此,拼接返回一个已删除元素的数组。因此,如果要引用已删除的数组,应使用以下语法:
var rem = arr.splice(1,1)[0];
alert(rem[0]); //=> 'c'
您似乎感到困惑,可能是因为将数组传递给
alert()
时发生了什么。从我能告诉你想要什么,你的第一个例子是正确的。在进行任何拼接之前,arr
变量中的内容是
[
["a", "b"],
["c", "d"],
["e", "f"]
]
调用var rem=arr.splice(1,1)
,从索引1处的arr
中删除一个元素并将其存储在变量rem
的数组中后,您得到的是
arr
:
[
["a", "b"],
["e", "f"]
]
rem
:
[
["c", "d"]
]
所以
rem[0]
是数组[“c”,“d”]
,这正是我认为您想要的。您似乎很困惑,可能是因为将数组传递给alert()
时发生了什么。从我能告诉你想要什么,你的第一个例子是正确的。在进行任何拼接之前,arr
变量中的内容是
[
["a", "b"],
["c", "d"],
["e", "f"]
]
调用var rem=arr.splice(1,1)
,从索引1处的arr
中删除一个元素并将其存储在变量rem
的数组中后,您得到的是
arr
:
[
["a", "b"],
["e", "f"]
]
rem
:
[
["c", "d"]
]
所以
rem[0]
是数组[“c”,“d”]
,这正是我认为你想要的。我认为你可能测试不正确或者什么的?我不能复制这个<代码>阵列拼接(1,1)应该适合您。这是一个工作版本的小提琴。什么是“字符串副数组”?哈哈,副数组是“字符串代替数组”中的副数组。对不起,我在第一个示例中使用并打算使用“arr.splice(1,1)”。问题是,将arr.splice(1,1)的输出设置为一个变量。然后向该输出的索引0发出警报。Ex:测试=阵列拼接(1,1);警报(测试[0]);您将看到它不是数组的索引0,而是显示整个数组。我更新了你的小提琴来显示这个。我想你可能测试不正确或者什么的?我不能复制这个<代码>阵列拼接(1,1)应该适合您。这是一个工作版本的小提琴。什么是“字符串副数组”?哈哈,副数组是“字符串代替数组”中的副数组。对不起,我在第一个示例中使用并打算使用“arr.splice(1,1)”。问题是,将arr.splice(1,1)的输出设置为一个变量。然后向该输出的索引0发出警报。Ex:测试=阵列拼接(1,1);警报(测试[0]);您将看到它不是数组的索引0,而是显示整个数组。我更新了你的小提琴来显示这个。arr.splice(1,1)按照预期拼接正确的阵列并移除元素。问题是,返回的不是数组。警报(arr.splice(1,1)[0])显示的是“c,d”,而不是预期的“c”。是的,这是因为该拼接始终返回一个数组。比如,var arr=[1,2,3,4]
和arr.slice(1,1)
将是[1]这不是正在发生的事情。。。arr.slice(1,1)应该是一个数组,但如果我们尝试查看返回内容的索引0,我们会发现没有返回数组,而是连接了数组中每个元素的字符串。这是因为您使用alert查看它们,请使用console.log查看返回值。你会发现它是数组。我在firefox的firebug中看到,如果你提醒一个数组,它会在提醒框中显示为字符串。。但当您执行console.log时,它会显示数组。所以我观察到的是alert([1,2,3,4])将在alert Box中显示1,2,3,4是的,如果您向数组发出警报,它将以字符串的形式显示整个内容。如果对数组的索引发出警报,则不会。如果您有myarray=[1,2,3]和alert(myarray[0]),则输出将仅为“1”。arr.splice(1,1)按预期拼接正确的数组并删除元素。问题是,返回的不是数组。警报(arr.splice(1,1)[0])显示的是“c,d”,而不是预期的“c”。是的,这是因为该拼接始终返回一个数组。比如,var arr=[1,2,3,4]
和arr.slice(1,1)
将是[1]这不是正在发生的事情。。。arr.slice(1,1)应该是一个数组,但如果我们尝试查看返回内容的索引0,我们会发现没有返回数组,而是连接了数组中每个元素的字符串。这是因为您使用alert查看它们,请使用console.log查看返回值。你会发现它是数组。我在fi中的firebug中看到的