Array.push为array.push抛出TypeError不是函数

时间:2019-03-29 18:01:43

标签: javascript arrays

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));
}

这是我的代码。目标是通过此练习练习递归。我给函数以下参数

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

new_arr显然是一个数组。为什么推方法不起作用?另外,当我将return语句更改为

return capitalizeFirst(arr, [].push(str));

并跟随chrome调试器,数字1一直传递到数组而不是arr.pop()值。是什么导致此行为?我也没有在实现中添加首字母大写。如果有人想知道为什么我的代码没有按照方法名称的说明进行操作,那将只是在push方法中进行replace()调用。

感谢您的帮助

4 个答案:

答案 0 :(得分:7)

从W3C:

  

push()方法将新项目添加到数组的末尾,并返回新的长度。

第一个循环应该没问题,但是因为您递归地传递了.push,所以第二个循环看到了一个数字而不是一个数组,因为push返回了一个数字。

按自己的行,然后仅将new_arr作为参数传递。

答案 1 :(得分:3)

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

  

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

下一个简单的修复方法是

function capitalizeFirst(arr, new_arr)
{
    if (arr.length === 0)
        return new_arr;

    let str = arr.pop();

    // Added code to capitalize first letter.
    str = str.charAt(0).toUpperCase() + str.slice(1);    

    new_arr.push(str);

    return capitalizeFirst(arr, new_arr);
}

console.log(capitalizeFirst(['car','taco','banana'], []));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

答案 2 :(得分:3)

如果您console.log(typeof new_arr)会得到number作为答案。

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

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

https://www.w3schools.com/Jsref/jsref_push.asp(请参阅返回值部分)

答案 3 :(得分:2)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push

  

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

function capitalizeFirst(arr, new_arr) {
    console.log("Type of new_arr : ",typeof(new_arr),":", new_arr);
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    console.log("Push returns Length", new_arr.push(str))
    return capitalizeFirst(arr, new_arr.push(str));
}


function correctCapitalizeFirst(arr, new_arr) {
    console.log("Type of new_arr : ",typeof(new_arr),":", new_arr);
    if (arr.length === 0) return new_arr;
    let str = arr.pop();
    console.log(str);
    new_arr.push(str);
    return correctCapitalizeFirst(arr, new_arr);
}
console.log("--------------- Correct -----------------");
correctCapitalizeFirst(['car','taco','banana'], []);
console.log("--------------- Incorrect ---------------");
capitalizeFirst(['car','taco','banana'], []);