当我从nodejs中的被调用函数内部访问arguments
时...
echo '!function(){ console.log(arguments) }(1,2,3)' | node
...它输出一个对象......
{ '0': 1, '1': 2, '2': 3 }
...但是谷歌浏览器......
!function(){ console.log(arguments) }(1,2,3)
......输出......
[1, 2, 3]
为什么不一致?还有哪些其他js环境有这种不同的行为?我可以使用arguments
吗?在使用它之前,如何确保它始终是一个数组?
答案 0 :(得分:6)
控制台输出没有规则。输出不代表任何与语言标准有关的内容。
如果您创建一个从JS程序中记录值的程序,您可以随意显示这些值。
arguments
对象在两个地方都是相同的。只有它的显示方式不同。
在使用它之前,如何确保它始终是一个数组?
它永远不是一个阵列。它总是一个类似于数组的对象。在这两种情况下,它都会在对象成员0
,1
和2
上显示值。只需使用不同的显示语法即可。
在Chrome中,尝试创建如下对象:
var my_obj = {
"0": 1,
"2": 3,
"1": 2,
length: 3,
splice: function(){},
};
并将其记录在控制台中。它可能看起来像一个数组文字,虽然它显然不是。
答案 1 :(得分:0)
它不是浏览器中的数组。实际上arguments
对象在JavaScript中的时间比Arrays长,并且当Arrays首次添加到JavaScript(在其1.1天内)时,它们不会将arguments
更新为数组。从那以后他们也没有这样做,因为担心后向兼容性。 它出现在某些浏览器控制台中,好像它是一个数组,因为调试控制台知道大多数人都计划将其视为一个。
但是arguments
对象足够接近一个易于转换的数组。一种方法是这样的:
var args = Array.prototype.slice.call(arguments, 0);
像大多数Array.prototype.slice
的方法一样, Array.prototype
被编写为通用的:你可以在不是数组的对象上调用它,只要它们具有属性数字名称和length
属性是一个数字,它将起作用。 arguments
对象具有这两个功能,因此这些功能都适用于它。
slice
函数返回一个Array,它是传入任何对象的浅表副本,以您指定的任何数字开头和结尾。 我们告诉它从零开始,因为我们没有说停在哪里,所以假设我们希望它最终停止,无论在哪里。这样,我们将arguments
的所有元素复制到一个新的数组中,现在你可以用它做任何你需要的其他数组。