通过默认的 'arguments' 访问 javascript 参数和使用显式对象(例如 'options')之间有什么区别吗?
除了一个访问数组参数,另一个访问对象选项外,它们两个是否类似?
$.fn.myFn = function(){
if arguments[0]//....
}
并且
$.fn.myFn = function(options){
if options.value //....
}
通过默认的 'arguments' 访问 javascript 参数和使用显式对象(例如 'options')之间有什么区别吗?
除了一个访问数组参数,另一个访问对象选项外,它们两个是否类似?
$.fn.myFn = function(){
if arguments[0]//....
}
并且
$.fn.myFn = function(options){
if options.value //....
}
arguments
,而是使用声明的参数和/或options
对象。(此外,请注意,在大多数JavaScript引擎上,与使用声明的参数或甚至options
对象相比,使用arguments
伪数组[它实际上不是一个数组]会导致运行时速度惩罚。请参见下面的“附注”,尽管当然你必须在实际情况下频繁调用函数才能使开销成为问题。)x = parseInt(str, 10);
parseInt
使用一个选项风格的对象,那么你需要这样编写代码:x = parseInt({string: str, radix: 10}); // Note: parseInt doesn't actually work this way
...或类似的方式,这会在每次调用时增加更多的打字工作。因此这是一个缺点。
但当你涉及到许多参数,特别是许多可选参数时,使用options
模式,通过传递一个对象而不是离散的参数,可以获得真正的回报。考虑jQuery的ajax
函数。它有约32个选项可以传递,几乎所有的选项都是可选的。就像你可能不想将每个parseInt
编码为上面的示例一样,你可能不想将每个ajax
调用编码成这样:
$.ajax(
"/path/to/resource",
function(data) {
},
undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined,
undefined, undefined, undefined, undefined, undefined, undefined
);
我听说一个离散参数和选项
式对象之间的经验法则是,当你有四个参数时,人们就会开始迷失方向。当然,你需要自己划定界限。
......也不例外。:-)
顺带一提:有关arguments
比声明的参数慢,可以尝试这个测试。当然,调用开销大多数情况下并不重要,所以这并不重要。但是在那些时候,以下是我和其他人的结果:
arguments
和传递数组的东西,对于那些需要可变数量参数的时候(答案:最好用数组)。不同之处在于,在第一种情况下,arguments
是传递给函数的实际参数列表,而在第二种情况下,option 只是其中一个参数(arguments[0]
),按照惯例它包含了实际的“arguments”。
与像 Python 这样的语言不同,Javascript 不提供内置的混合关键字和位置参数的方法。
arguments
会让函数运行变慢,但只有在你需要经常调用该函数时才会明显。仅在需要函数内部有可变参数时使用它。此外,如果不需要可变参数,使用arguments会使代码难以理解,因为你没有变量名。请注意保留HTML标签。arguments
不是过度优化,但是在不需要时使用它只会使您的代码更难读懂。 - Ruan Mendes$.fn.myFn.length
的值为 0
或者 1
(因为在第一种情况下函数定义时没有参数,在第二种情况下函数定义时有 1 个参数),尽管你通常不需要这个属性。
除此之外,两者工作方式相同。
正如 @missigno 指出的那样,显然存在一些语法差异。但是,如果你问为什么要使用其中之一,显式对象方法是在 JavaScript 中提供命名参数的一种方式。
如果有大量参数,但大部分时间只需要指定其中几个,这可能非常有用。出于美学原因,有些人也更喜欢它 - 选项的名称出现在其值旁边,因此您不必仅仅知道例如第3个参数的作用。
基本上,arguments
允许您期望传递给函数的未知数量的参数。一个快速的例子是在 GetSum()
函数中,它返回您一次性传递给它的所有数字的总和。
另一方面,options
允许您为函数指定命名参数,而不需要显式顺序。这在扩展现有函数时特别方便,无需担心与严格函数签名的冲突/向后兼容性。
arguments
是无效的。 - josh.trowarguments.caller
和arguments.callee
已经被弃用了。 - Ruan Mendesarguments
对象。 - josh.trowarguments
中的值,反之亦然。例如:function add(num1){arguments[0] = 1;return num1;} add(5);//返回1
这种奇怪的行为已经在ES5的严格模式中被移除了。 - Brian