代码信息来自于http://ejohn.org/apps/learn/。

使用数量可变的参数对编程很有好处

function merge(root){
for(i = 0 ; i < arguments.length; i++)
for(var key in arguments[i])
return root[key] = arguments[i][key]
} var merged = merge({name: "John"}, {city: "Boston"});
console.log( merged.name == "John", "name属性和原来一样." );
console.log( merged.city == "Boston", "city属性被复制到了第一个参数对象里" );

采用这个方法可以设置数量位置不固定的参数,它的思路就是用访问二维数组的方法访问所有对象,将所有的内容复制到第一个对象。

这里要注意,传进来的所有参数存在于arguments对象中,而函数的形参,依次对应传进来的参数。像本题,arguments包括{name: "John"},{city: "Boston"};而root是{name: "John"}。

如何构建找到数组当中最大/最小数字的函数?

function smallest(array){
return Math.min.apply( Math, array );
}
function largest(array){
return Math.max.apply( Math, array );
}
console.log(smallest([0, 1, 2, 3]) == 0, "找到最小值的位置");
console.log(largest([0, 1, 2, 3]) == 3, "找到最大值的位置");

另一种方法

function smallest(){
return Math.min.apply( Math, arguments );
}
function largest(){
return Math.max.apply( Math, arguments );
}
console.log(smallest(0, 1, 2, 3) == 0, "找到最小值的位置");
console.log(largest(0, 1, 2, 3) == 3, "找到最大值的位置");

这段代码哪里出的错?

function highest(){
return arguments.sort(function(a,b){
return b - a;
});
}
console.log(highest(1, 1, 2, 3)[0] == 3, "获取最高值");
console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "查看数组第二个元素");

sort是数组对象的方法。

习题:有没有什么内置方法可以帮助来转化类数组对象为数组对象?

// 提示: 数组拥有返回新数组的.slice和.splice方法.
function highest(){
return makeArray(arguments).sort(function(a,b){
return b - a;
});
} function makeArray(array){
// 补足代码
} // 期望: [3,2,1,1]
console.log(highest(1, 1, 2, 3)[0] == 3, "获取最大值");
// 期望: [5,4,3,3,2,1]
console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "验证结果");

我们可以使用好用的内置方法

function highest(){
return makeArray(arguments).sort(function(a,b){
return b - a;
});
}
function makeArray(array){
return Array().slice.call(array);
} console.log(highest(1, 1, 2, 3)[0] == 3, "获取最大值");
console.log(highest(3, 1, 2, 3, 4, 5)[1] == 4, "验证结果");

这里是类数组和数组的转化方法,通过call,修改上下文,调用slice实现。

习题:实现一个乘法函数(第一个参数,和剩余参数的最大值)

function multiMax(multi){
// 获取一个没有第一个参数的数组
var allButFirst = ___; // 在剩余的参数数组中找到最大的数字
var largestAllButFirst = ___; return multi * largestAllButFirst;
}
console.log( multiMax(3, 1, 2, 3) == 9, "3*3=9 (第一个参数, 剩余参数的最大值)" );

使用call和apply可以很好解决这个问题

function multiMax(multi){
// 获取一个没有第一个参数的数组
var allButFirst = Array().slice.call(arguments,1);
// 在剩余的参数数组中找到最大的数字
var largestAllButFirst = Math.max.apply(Math,allButFirst); return multi * largestAllButFirst;
}
console.log( multiMax(3, 1, 2, 3) == 9, "3*3=9 (第一个参数, 剩余参数的最大值)" );

javascript高级知识分析——灵活的参数的更多相关文章

  1. javascript高级知识分析——上下文

    如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...

  2. javascript高级知识分析——实例化

    代码信息来自于http://ejohn.org/apps/learn/. new做了什么? function Ninja(){ this.name = "Ninja"; } var ...

  3. javascript高级知识分析——作为对象的函数

    代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...

  4. javascript高级知识分析——函数访问

    代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...

  5. javascript高级知识分析——定义函数

    代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...

  6. JavaScript的高级知识---词法分析

    JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...

  7. (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)

    ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...

  8. MySQL高级知识(七)——索引面试题分析

    前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...

  9. MySQL高级知识(五)——索引分析

    前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...

随机推荐

  1. UML_组件图

    简介 众所周知,组件图是用来描述系统中的各组件之间的关系.首先我们必须知道组件的定义是什么,然后组件之间有哪些关系.理清楚这些,我们在以后的设计中才能 派上用场.UML语言对组件的定义已发生了巨大变化 ...

  2. curl断点续载

    摘自http://blog.csdn.net/zmy12007/article/details/37157297 摘自http://www.linuxidc.com/Linux/2014-10/107 ...

  3. Python学习入门基础教程(learning Python)--8.1 字典数据添加与删除

             1. 字典数据添加 这个很简单,像赋值那样一项项赋值即可.语法结构如下 dict_obj[key] = value 添加数据项示例如下 >>> d1 = {'cod ...

  4. Hadoop书籍下载链接

    Hadoop书籍推荐1:Hadoop实战(结合经典案例全面讲解hadoop整个技术体系)http://www.db2china.net/club/thread-25148-1-1.html2:Hado ...

  5. codeblocks 使用指南z

    1.界面风格更改 首先贴怎么普通设置出来,或者改配置文件 这是我的风格 类似于DEV-CPP里面的一个主题,看的很舒服 具体设置如下: Settings-Editor 1.代码当前行高亮 在Gener ...

  6. Chrome浏览器切换到之前打开的标签页会重新加载

    这是谷歌的一种策略.当系统内存不足时,系统会自动从内存中舍弃标签页 在地址栏输入chrome://flags/#automatic-tab-discarding,设置为停用即可.

  7. 3D转换

    CSS3 允许您使用 3D 转换来对元素进行格式化. 在本章中,您将学到其中的一些 3D 转换方法: 1. rotateX() 2. rotateY() <!DOCTYPE HTML>&l ...

  8. table中超长字符串省略号表示两种方法

    写在前面:   1.第一种从网上找到的解决方式添加table-layout:fixed   2.第二种添加div   3.字符串过长产生省略号的css语句为如下三种合用:overflow:hidden ...

  9. spring的官方文真不错

    引文不太好,但是通过别的版本的查看,发现spring的文档真心不错,内容详细明了. http://docs.spring.io/spring/docs/3.2.5.RELEASE/spring-fra ...

  10. windows 安装paramiko模块

    首先需要安装pycrypto这个模块,这个下源码编译安装的不能用报错warning: GMP or MPIR library not found; Not building这个用编译好的模块安装已编译 ...