JS编程建议——56:使用arguments模拟重载

建议56:使用arguments模拟重载
在JavaScript中,每个函数内部可以使用arguments对象,该对象包含了函数被调用时的实际参数值。arguments对象虽然在功能上与数组有些类似,但它不是数组。 arguments 对象与数组的类似体现在它有一个 length 属性,同时实际参数的值可以通过[]操作符来获取,但arguments对象并没有数组可以使用的push、pop、splice等方法。其原因是arguments对象的prototype指向的是Object.prototype,而不是Array.prototype。
Java和C++语言都支持方法重载,即允许出现名称相同而形式参数不同的方法,但JavaScript并不支持这种方式的重载。这是因为JavaScript中的function对象也是以属性的形式出现的,在一个对象中增加与已有function 同名的新function时,旧的function对象会被覆盖。不过可以通过使用arguments来模拟重载,其实现机制是通过判断arguments中实际参数的个数和类型来执行不同的逻辑。
function sayHello() {

switch (arguments.length) {
    case 0:
        return "Hello";
    case 1:
        return "Hello, " + arguments[0];
    case 2:
        return (arguments[1] == "cn" ? " 你好," : "Hello, ") + arguments[0];
};

}
sayHello(); //"Hello"
sayHello("Alex"); // "Hello, Alex"
sayHello("Alex", "cn"); // " 你好,Alex"
callee是arguments对象的一个属性,其值是当前正在执行的function对象。它的作用是使匿名 function可以被递归调用。下面以一段计算斐波那契序列中第N个数的值的过程来演示arguments.callee的使用。
function fibonacci(num) {

return (function(num) {
    if( typeof num !== "number")
        return -1;
    num = parseInt(num);
    if(num < 1)
        return -1;
    if(num == 1 || num == 2)
        return 1;
    return arguments.callee(num - 1) + arguments.callee(num - 2);
})(num);

}
fibonacci(100);

时间: 2024-09-01 00:53:53

JS编程建议——56:使用arguments模拟重载的相关文章

JS编程建议——58:灵活使用Arguments

建议58:灵活使用ArgumentsJavaScript函数的参数是不固定的,调用函数时传递给它的实参也很随意,为了有效管理参数,JavaScript支持Arguments机制.Arguments是一个伪数组,可以通过数组下标的形式获取该集合中传递给函数的参数值.例如,在下面这个函数中,没有指定形参,但在函数体内通过Arguments对象可以获取传递给该函数的每个实参值.function f(){ for(var i = 0; i < arguments.length; i ++ ){ aler

JS编程建议——59:推荐动态调用函数

建议59:推荐动态调用函数调用函数更便捷的方式是使用Function对象的call和apply方法.apply与call方法在本质上没有太大区别,只不过它们传递给函数的参数方式不同, apply是以数组形式进行参数传递,而call方法可以同时传递多个值.如果某个函数仅能够接收多个参数列表,而现在希望把一个数组的所有元素作为参数进行传递,那么使用apply方法就显得非常便利.function max(){ var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的

JS编程建议——37:推荐使用replace(2)

建议37:推荐使用replace(2)在上面的示例代码中,函数f()的参数为特殊字符"$1",它表示正则表达式/(bw+b)/中小括号每次匹配的文本.然后在函数体内对这个匹配文本进行处理,截取其首字母并转换为大写形式,之后返回新处理的字符串.replace方法能够在原文本中使用这个返回的新字符串替换每次匹配的子字符串.对于上面的示例,可以使用小括号来获取更多匹配文本的信息.例如,直接利用小括号传递单词的首字母,然后进行大小写转换处理: var s = 'script language

JS编程建议——67:套用函数

建议67:套用函数套用是JavaScript函数一个很有趣的应用.所谓套用就是将函数与传递给它的参数相结合,产生一个新的函数.在函数式编程中,函数本身也是一个值,这种特性允许用户以有趣的方式去操作函数值.例如,在下面代码中定义一个add()函数,该函数能够返回一个新的函数,并把参数值传递给这个新函数,从而实现连加操作.var add = function(n){ return function(m){ return n+m; } }document.writeln(add(2)(3)); //5

JS编程建议——2:正确辨析JavaScript句法中的词、句和段

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词法侧重语言的底层实现(如语言编码问题等),以及基本规则的定义(如标识符.关键字.注释等).它们都不是最小的语义单位,却是构成语义单位的组成要素.例如,规范字符编码集合.命名规则.标识符.关键字.注释规则.特殊字符用法等.句法定义了语言的逻辑和结构,包括词.句和段的语法特性,其中段体现逻辑的结构,句表达

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——11:慎重使用伪数组

建议11:慎重使用伪数组JavaScript没有真正的数组,因此typeof运算符不能辨别数组和对象.伪数组在JavaScript中有很高的易用性,程序员不用给它设置维度,而且永远不用担心产生越界错误,但JavaScript数组的性能相比真正的数组可能更糟糕.要判断一个值是否为数组,必须使用constructor属性,例如: if(value && typeof value === 'object' && value.constructor === Array) { } a

JS编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组