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对象。*
   15   16   17   18   19   20   21   22   23   24   25