Page 20 - JavaScript修炼之道
P. 20
6 第一部分 JavaScript 必备操作
任务 3 使用可选/可变/命名参数
为了熟练掌握JavaScript中参数的使用技巧,你首先需要意识到:在JavaScript中,你所显式
声明的形参并不会对实参造成限制。因为每个函数都会把它的实参保存在一个预定义的
①
arguments变量中(arguments具有length属性和[]操作符 )。因此,形参实际上只是为实参提
供了本地名称。如果形参与实参的数量一致,那这些形参将会引用实参的内容。如果不是的话,
空缺的形参会被赋予undefined。
现在,请注意下一页中可选参数的例子。我用undefined === rant测试第二个实参是否
存在。为什么要连用三个等号呢?这就得说说JavaScript混乱的等价规则了。请看下面的表达式:
undefined === null // => false
undefined == null // => true
看明白了吧。因此,假设我们认为null是rant的一个合法值,我们就需要同时检查rant
的值和类型,这正是 === 比较操作符所做的,它是严格比较操作符(strict equality operator)。
在多数情况下,你需要为参数的“空值”给出更明确的定义。比如,假设我们需要rant
是一段有意义的文字:空字符串、null、undefined、0和false显然都是没有意义的。正
巧这些值在JavaScript中都与false等价,因此,我们可以用相当简洁的方式来设置rant的
默认值:
rant = rant || 'IE6 must die!';
鉴于JavaScript的false等价关系是如此混乱,因此我在右页的第四个例子中用了in操作符来
判断options对象是否包含一个给定的属性,而不是用 !options[opt]。因为这段代码相当通用,
很多地方都会用到它,所以我采取了一种相对保守的编码风格:在使用某个属性之前,先判断这
个属性是否存在。
这个例子同时也展示了如何用for...in语法遍历一个对象的属性(property)。
最后,请注意,我是通过该函数的公有属性来设置repeat()的默认参数的,这样,用户就
可以在不触动全局对象的情况下随时修改该函数的默认参数。为了获得函数自身的引用,我们会
使用arguments的特殊属性callee 。
②
——————————
① 尽管很像数组,但实际上它并非数组。*
② arguments的callee属性会返回正被执行的Function对象。*