Javascript Array.push的Array.push抛出类型错误不是函数

Javascript Array.push的Array.push抛出类型错误不是函数,javascript,arrays,Javascript,Arrays,这是我的密码。目标是通过这个练习练习递归。我为函数提供以下参数 capitalizeFirst(['car','taco','banana',[]) 新的_arr显然是一个数组。为什么push方法对它不起作用?另外,当我将返回语句更改为 首先返回(arr,[].push(str)) 随着chrome调试器的出现,数字1不断传递到数组,而不是arr.pop()值。是什么导致了这种行为?我还没有在实现中添加首字母大写。这只是我的push方法中的一个replace()调用,以防有人想知道为什么我的代码

这是我的密码。目标是通过这个练习练习递归。我为函数提供以下参数

capitalizeFirst(['car','taco','banana',[])

新的_arr显然是一个数组。为什么push方法对它不起作用?另外,当我将返回语句更改为

首先返回(arr,[].push(str))

随着chrome调试器的出现,数字1不断传递到数组,而不是arr.pop()值。是什么导致了这种行为?我还没有在实现中添加首字母大写。这只是我的push方法中的一个replace()调用,以防有人想知道为什么我的代码没有执行方法名称所宣称的操作

感谢W3C提供的任何帮助:

方法将新项添加到数组的末尾,并返回新的长度

第一个循环应该可以,但是因为您递归地传递
.push
,第二个循环看到的是一个数字而不是一个数组,因为
push
返回一个数字

按自己的线路,然后将新的作为参数传递

function capitalizeFirst(arr, new_arr) {
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    return capitalizeFirst(arr, new_arr.push(str));
}
来自W3C:

方法将新项添加到数组的末尾,并返回新的长度

第一个循环应该可以,但是因为您递归地传递
.push
,第二个循环看到的是一个数字而不是一个数组,因为
push
返回一个数字

按自己的线路,然后将新的作为参数传递

function capitalizeFirst(arr, new_arr) {
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    return capitalizeFirst(arr, new_arr.push(str));
}

基本上,您的错误主要是因为
push()
在将元素推送到数组上后返回数组的长度,而这将作为递归调用的参数而不是数组传递:

push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度

下面将提供一个简单的修复:

功能首字母大写(arr、新arr)
{
如果(arr.length==0)
返回新的_arr;
设str=arr.pop();
//添加了首字母大写的代码。
str=str.charAt(0.toUpperCase()+str.slice(1);
新推送装置(str);
首先返回(arr、新arr);
}
log(大写字母第一(['car','taco','banana',[])
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装器{max height:100%!important;top:0;}
基本上,您的错误主要是因为
push()
在将元素推送到数组上后返回数组的长度,而这将作为递归调用的参数而不是数组传递:

push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度

下面将提供一个简单的修复:

功能首字母大写(arr、新arr)
{
如果(arr.length==0)
返回新的_arr;
设str=arr.pop();
//添加了首字母大写的代码。
str=str.charAt(0.toUpperCase()+str.slice(1);
新推送装置(str);
首先返回(arr、新arr);
}
log(大写字母第一(['car','taco','banana',[])
.as控制台{背景色:黑色!重要;颜色:石灰;}
.as console wrapper{max height:100%!important;top:0;}
如果您
console.log(typeof new\u arr)
您得到的答案是
number

原因是
arr.push()
的返回值是该值被推送到的索引,而不是新数组。因此,如果您这样做,您的作品:

function capitalizeFirst(arr, new_arr) {
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    new_arr.push(str); // the return of .push is the array length, which is not needed. 
    return capitalizeFirst(arr, new_arr); // pass the full array into this function, making it recursive
}
(请参见返回值部分)

如果您
console.log(typeof new\u arr)
您将得到
编号作为答案

原因是
arr.push()
的返回值是该值被推送到的索引,而不是新数组。因此,如果您这样做,您的作品:

function capitalizeFirst(arr, new_arr) {
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    new_arr.push(str); // the return of .push is the array length, which is not needed. 
    return capitalizeFirst(arr, new_arr); // pass the full array into this function, making it recursive
}
(参见返回值部分)

push()方法将一个或多个元素添加到数组的末尾,然后 返回数组的新长度

功能首字母大写(arr、新arr){
日志(“新阵列的类型:”,类型(新阵列),“:”,新阵列);
if(arr.length==0)返回新的\u arr;
设str=arr.pop();
console.log(str);
日志(“推送返回长度”,新的推送(str))
首先返回(arr,新arr.push(str));
}
功能优先(arr、新arr){
日志(“新阵列的类型:”,类型(新阵列),“:”,新阵列);
if(arr.length==0)返回新的\u arr;
设str=arr.pop();
console.log(str);
新推送装置(str);
首先返回(arr、新arr);
}
console.log(“--------------正确----------------”);
首先(['car','taco','banana',[]);
console.log(“--------------不正确-----------------”;
首字母大写(['car','taco','banana',[])

push()方法将一个或多个元素添加到数组的末尾,然后 返回数组的新长度

功能首字母大写(arr、新arr){
日志(“新阵列的类型:”,类型(新阵列),“:”,新阵列);
if(arr.length==0)返回新的\u arr;
设str=arr.pop();
console.log(str);
日志(“推送返回长度”,新的推送(str))
首先返回(arr,新arr.push(str));
}
功能优先(arr、新arr){
日志(“新阵列的类型:”,类型(新阵列),“:”,新阵列);
if(arr.length==0)返回新的\u arr;
设str=arr.pop();
console.log(str);
新推送装置(str);
首先返回(arr、新arr);
}
console.log(“--------------正确----------------”);
首先(['car','taco','banana',[]);
console.log(“--------------不正确-----------------”;
首字母大写(['car','taco','banana',[])