Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么splice返回字符串而不是数组?_Javascript_Multidimensional Array_Array Splice - Fatal编程技术网

Javascript 为什么splice返回字符串而不是数组?

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]时

我试着从二维数组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]时,拼接(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中看到的