我有一个变量a
,它可以是一个对象,也可以是一个对象数组。我有一个数组array
。
我想将a
追加到array
,因此我考虑将Array.prototype.push.call
或Array.prototype.push.apply
与三元运算符一起使用,如下所示:
var a = "hello"; // or var a = ["hello", "world"];
var array = [];
var append = ($.isArray(a)) ? Array.prototype.push.apply : Array.prototype.push.call;
append(array, a); // Uncaught TypeError: undefined is not a function
($
是jQuery)
我是JavaScript的新手,我想有一个很好的理由为什么这不起作用但我找不到它。无法将apply
或call
分配给变量? (它们不是真正的函数吗?)或者是append()
的调用中缺少的东西?
注意:我知道我可以使用if/else
执行此操作,但我更愿意理解为什么我无法将这些方法分配给变量并调用它。
轻微的其他问题:我想这样做,因为我从JSON API获得a
,如果我理解正确,JSON不能包含一个单个对象的数组。虽然我觉得我想要做的事情必须非常普遍,但我也无法找到其他开发者如何处理这个问题。有没有比测试a
是否为数组更好的方法,并相应地使用apply()
?
答案 0 :(得分:2)
这是因为call
和apply
是实例方法。它们对上下文对象this
至关重要。
最终您应该执行append.call(Array.prototype.push, array, a)
,因为call
或apply
需要将函数push
作为this
传递
答案 1 :(得分:1)
您不需要任何if,只需使用concat
var array = [];
var a = "hello"; // or var a = ["hello", "world"]
array = array.concat(a);