nodejs`parameters`是对象,但在浏览器中,它是一个`array`

时间:2014-11-29 22:26:04

标签: javascript node.js google-chrome browser

当我从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吗?在使用它之前,如何确保它始终是一个数组?

2 个答案:

答案 0 :(得分:6)

控制台输出没有规则。输出不代表任何与语言标准有关的内容。

如果您创建一个从JS程序中记录值的程序,您可以随意显示这些值。

arguments对象在两个地方都是相同的。只有它的显示方式不同。

  

在使用它之前,如何确保它始终是一个数组?

它永远不是一个阵列。它总是一个类似于数组的对象。在这两种情况下,它都会在对象成员012上显示值。只需使用不同的显示语法即可。

在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的所有元素复制到一个新的数组中,现在你可以用它做任何你需要的其他数组。