Can&#t; .join()函数参数 - TypeError:undefined不是函数

时间:2014-08-21 00:32:54

标签: javascript node.js v8 ecmascript-5

最小例子:

function test() {
  console.log(arguments.join(','));
}

test(1,2,3);
然后我得到:

  

TypeError:undefined不是函数

然而,当我为数组做同样的事情时:

console.log([1,2,3].join(','));

我得到了

  

“1,2,3”

正如所料。

古董有什么问题?它假设是一个数组:

(function () {
  console.log(typeof [] == typeof arguments)
})();
  

2 个答案:

答案 0 :(得分:6)

参数不是数组。

(function(){
   console.log(typeof arguments);
})();
// 'object'

它是一个类似于数组的结构,具有长度和数字属性,但它实际上不是数组。如果你愿意,你可以在它上面使用数组函数。

function test() {
    console.log(Array.prototype.join.call(arguments, ','));

    // OR make a new array from its values.
    var args = Array.prototype.slice.call(arguments);
    console.log(args.join(','));
}

test(1,2,3);

注意,您的示例有效,因为array不是类型。 typeof [] === 'object'也是。但是,您可以使用

检查对象是否为数组
Array.isArray(arguments) // false
Array.isArray([]) // true

答案 1 :(得分:0)

问题是arguments本身不是javascript数组。它在某些方面表现得像一个数组,但在其他方面却没有。

为什么不尝试将其转换为纯javascript数组。这可以通过以下方式完成:

(function () {
   var args = Array.prototype.slice.call(arguments, 0);
   console.log(typeof [] === typeof args);
}());