javascript高级知识分析——灵活的参数
代码信息来自于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高级知识分析——灵活的参数的更多相关文章
- javascript高级知识分析——上下文
如果函数是一个对象的属性,那么它可以? var katana = { isSharp: true, use: function(){ this.isSharp = !this.isSharp; } } ...
- javascript高级知识分析——实例化
代码信息来自于http://ejohn.org/apps/learn/. new做了什么? function Ninja(){ this.name = "Ninja"; } var ...
- javascript高级知识分析——作为对象的函数
代码信息来自于http://ejohn.org/apps/learn/. 函数和对象是不是非常相似? var obj = {}; var fn = function(){}; console.log( ...
- javascript高级知识分析——函数访问
代码信息来自于http://ejohn.org/apps/learn/. 可以通过函数的名字在它的内部引用它. function yell(n){ return n > 0 ? yell(n-1 ...
- javascript高级知识分析——定义函数
代码信息来自于http://ejohn.org/apps/learn/. 可以使用哪些方式来声明函数? function isNimble(){ return true; } var canFly = ...
- JavaScript的高级知识---词法分析
JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...
- (读书笔记)函数参数浅析-JavaScript高级程序设计(第3版)
ECMAScript函数不介意传递的参数个数,因为在其内部是用一个数组进行表示的.在函数体内可以通过arguments对象来访问这个参数数组,就像我们正常访问数组一样处理. arguments对象只是 ...
- MySQL高级知识(七)——索引面试题分析
前言:该篇随笔通过一些案例,对索引相关的面试题进行分析. 0.准备 #1.创建test表(测试表). drop table if exists test; create table test( id ...
- MySQL高级知识(五)——索引分析
前言:前面已经学习了explain(执行计划)的相关知识,这里利用explain对索引进行优化分析. 0.准备 首先创建三张表:tb_emp(职工表).tb_dept(部门表)和tb_desc(描述表 ...
随机推荐
- 方差var,标准差
wiki摘录如下(红色字体是特别标注的部分): 方差:http://zh.wikipedia.org/wiki/%E6%96%B9%E5%B7%AE 方差 变异量(数)(Variance),应用数学里 ...
- 电子科大POJ "敲错键盘"
C-sources: #include<stdio.h> #define N 20 int main() { int i,j; ]={'Q','W','E','R','T','Y','U' ...
- poj1163 dp入门
The Triangle Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36811 Accepted: 22048 De ...
- 超越css读书笔记
一.运用所有有效的css选择符 1.属性选择符(基于一个元素是否有属性名称,例如href,或者属性值) 例如:img[alt]{border:1px;} 所有包含alt属性的图像都将会有一个灰色的边框 ...
- OC基础1:一些基本概念
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于类方法和实例方法: (1).类方法 ...
- eclipse开发c++时cout和endl报错
1.Symbol 'cout' could not be resolved , 选择kepler版本号就不报错了. 2. 下载gdb, ./configure make sudo make inst ...
- Matlab lugui
function [L,U,pv,qv] = lugui(A,pivotstrat) %LUGUI Gaussian elimination demonstration. % % LUGUI(A) s ...
- C#文件读写操作
方法1:使用FileStream读写文件 using System;using System.Collections.Generic;using System.Text;using System.IO ...
- iOS学习心得——UITableViewCell的复用
UITableView是在iOS开发中最常用的控件之一.我的第一篇学习心得献给它了 UITableView是由一行一行的UITableViewCell构成的. 首先想这 ...
- poj 3411 Paid Roads
题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用. ...