首页运维零件 › 但是因为数组里面可以包含对象(vns威尼斯城官网登入数组也是一个对象),代码如下

但是因为数组里面可以包含对象(vns威尼斯城官网登入数组也是一个对象),代码如下

先看一段代码: 复制代码
代码如下:vara=[1,2,3]; functionmap{ vars=init; for{ s=fn; } returns; }
alert{returnx+y;},a,0))//把数组的各个元素相加求和
alert{returnx+y;},a,""))//把数组的各个元素连接起来map函数定义了对a数组遍历一次,但具体对各个元素执行何种操作,却没有定义,需要从其第一个参数来定义。
这种方法能提高代码的重用性。不错。

rest参数

function foo(a,b,c,...rest){console.log(rest);}  foo(1,2,3,4,5);  
rest只能写在最后    先绑定原有参数 多余的参数以数组的形式传给变量rest  
如果传入参数没满定义参数   那么rest接收一个空数组

var a =    ["aa","bb","cc"];
document.write(a.unshift(11));   // -> 4 注:IE下返回undefined
document.write(a);        // -> 11,aa,bb,cc
document.write(a.unshift([11,22]));   // -> 5
document.write(a);        // -> 11,22,11,aa,bb,cc
document.write(a.unshift("cat"));  // -> 6
document.write(a);        // -> cat,11,22,11,aa,bb,cc

因为函数式编程采用了完全不同的组织程序的方式,所以那些习惯于采用命令式范例的程序员可能会发现函数式编程有点难学。在这篇文章中,您将了解一些关于如何采用函数式风格,用JavaScript编写良好的、优美的代码的示例。我将讨论:
函数式编程概念,包括匿名函数、调用函数的不同方法,以及将函数作为参数传递给其他函数的方式。
函数式概念的运用,采用的示例包括:扩展数组排序;动态HTML生成的优美代码;系列函数的应用。函数式编程概念
请告诉每个人。请把这个提交给: Digg Slashdot
在那些通过描述“如何做”指定解决问题的方法的语言中,许多开发人员都知道如何进行编码。例如,要编写一个计算阶乘的函数,我可以编写一个循环来描述程序,或者使用递归来查找所有数字的乘积。在这两种情况下,计算的过程都在程序中进行了详细说明。清单1显示了一个计算阶乘的可能使用的C代码。
清单1.过程风格的阶乘 intfactorial return1; else returnn*factorial; }
这类语言也叫做过程性编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显着不同。在函数式编程中,需要描述问题“是什么”。函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到n的数字的乘积。计算阶乘的典型函数式程序看起来如清单2中的示例所示。
清单2.函数式风格的阶乘 factorialn,wheren<=0:=1
factorialn:=foldr*1taken[1..]
第二个语句指明要得到从1开始的前n个数字的列表,然后找出它们的乘积,1为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数和标记的意义,编写代码就很容易,而且可读性也很好。
只用三行Miranda代码就可以编写例程,根据参数,使用广度优先或深度优先遍历处理n叉树的每个节点,而且元素可以是任何通用类型。
从历史上看,函数式编程语言不太流行有各种原因。但是最近,有些函数式编程语言正在进入计算机行业。其中一个例子就是.NET平台上的Haskell。其他情况下,现有的一些语言借用了函数式编程语言中的一些概念。一些C++实现中的迭代器和continuation,以及JavaScript中提供的一些函数式构造,就是这种借用的示例。但是,通过借用函数式构造,总的语言编程范例并没有发生变化。JavaScript并没因为函数式构造的添加就变成了函数式编程语言。
我现在要讨论JavaScript中的函数式构造的各种美妙之处,以及在日常编码和工作中使用它们的方式。我们将从一些基本功能开始,然后用它们查看一些更有趣的应用。
匿名函数
在JavaScript中,可以编写匿名函数或没有名称的函数。为什么需要这样的函数?请继续往下读,但首先我们将学习如何编写这样一个函数。如果拥有以下JavaScript函数:
清单3.典型的函数 functionsum; } 然后对应的匿名函数看起来应当如下所示:
清单4.匿名函数 function; } 要使用它,则需要编写以下代码:
清单5.应用匿名函数 varsum=function; }; 使用函数作为值
也可以将函数作为值使用。还可以拥有一些所赋值是函数的变量。在最后一个示例中,还可以执行以下操作:
清单6.使用函数赋值 varsum=function; } alert;
在上面清单6的示例中,为变量sum赋的值是函数定义本身。这样,sum就成了一个函数,可以在任何地方调用。
调用函数的不同方法 JavaScript允许用两种方式调用函数,如清单7和8所示。
清单7.典型的函数应用 alert; 或 清单8.用函数作为表达式 ;
所以也可以编写以下代码: 清单9.定义函数之后就可以立即使用它 {return;
可以在括号中编写函数表达式,然后传递给参数,对参数进行运算。虽然在清单8的示例中,有直接包含在括号中的函数名称,但是按清单9中所示方式使用它时,就不是这样了。
将函数作为参数传递给其他函数
也可以将函数作为参数传递给其他函数。虽然这不是什么新概念,但是在后续的示例中大量的使用了这个概念。可以传递函数参数,如清单10所示。
清单10.将函数作为参数传递,并应用该函数
varpassFunAndApply=function{returnfn;}; varsum=function{ returnx+y+z; };
alert(passFunAndApply;//12 执行最后一个alert语句输出了一个大小为12的值。
使用函数式概念
前一节介绍了一些使用函数式风格的编程概念。所给的示例并没有包含所有的概念,它们在重要性方面也没有先后顺序,只是一些与这个讨论有关的概念而已。下面对JavaScript中的函数式风格作一快速总结:
函数并不总是需要名称。 函数可以像其他值一样分配给变量。
函数表达式可以编写并放在括号中,留待以后应用。
函数可以作为参数传递给其他函数。
这一节将介绍一些有效使用这些概念编写优美的JavaScript代码的示例。(使用JavaScript函数式风格,可以做许多超出这个讨论范围的事。)
扩展数组排序
先来编写一个排序方法,可以根据数组元素的日期对数据进行排序。用JavaScript编写这个方法非常简单。数据对象的排序方法接受一个可选参数,这个可选参数就是比较函数。在这里,需要使用清单11中的比较函数。
清单11.比较函数 function{ returnx.date–y.date; }
要得到需要的函数,请使用清单12的示例。 清单12.排序函数的扩展
arr.sort{returnx.date–y.date;});
其中arr是类型数组对象。排序函数会根据arr数组中对象的日期对所有对象进行排序。比较函数和它的定义一起被传递给排序函数,以完成排序操作。使用这个函数:
每个JavaScript对象都有一个date属性。
JavaScript的数组类型的排序函数接受可选参数,可选参数是用来排序的比较函数。这与C库中的qsort函数类似。
动态生成HTML的优美代码
在这个示例中,将看到如何编写优美的代码,从数组动态地生成HTML。可以根据从数据中得到的值生成表格。或者,也可以用数组的内容生成排序和未排序的列表。也可以生成垂直或水平的菜单项目。
清单13中的代码风格通常被用来从数组生成动态HTML。
清单13.生成动态HTML的普通代码 varstr=''; for(vari=0;i

方法

在一个对象中绑定函数    这个函数就叫方法但是它在内部使用了this关键字

this是一个变量   他始终指向当前对象  this.属性就可以拿到你要的属性 

apply 把参数打包成Array再传入

call 把参数按顺序传入

var a = [1,2,3,4,5,6];
for(var i =0; i<a.length; i++){
alert(a[i]);
}

全局作用域

不在任何函数内定义的变量  实际上就是被绑定到window的一个属性    eg

var a = 'xiaoqi';

alert(a);   alert(window.a);

函数实际上也是一个全局变量  并绑定到window对象  
alert()函数也是window的一个变量

在现有数组后面追加数组,并返回新数组,不影响现有数组:

名字空间

避免命名冲突  定义一个唯一的全局变量
 把所有的变量和函数绑定在一个全局变量中

var a = new Array(10);

调用函数

函数名(参数)调用函数  参数按顺序传入
 函数可以任意个,就算函数体内用不到这个参数  比定义的少也可以
 返回NaN(此时函数的参数将是undefined  ,所以结果为NaN)

要避免收到undefined 可以对参数进行检查

if(typeof 参数 !==“number”){   throw ‘not  a  number  ’}

复制代码 代码如下:

局部作用域

在for循环中是无法定义具有局部作用域的变量

var a =    ["aa","bb","cc"];
document.write(a.push("dd"));    // -> 4
document.write(a);        // -> aa,bb,cc,dd
document.write(a.push([1,2,3]));  // -> 5
document.write(a);        // -> aa,bb,cc,dd,1,2,3

回调函数

filter()接收的回调函数,其实可以有多个参数
,回调函数还可以接收另外两个参数,表示元素的位置和数组本身

var arr = [1,2,3,4,5,6,7,8,9];

var r = arr.filter(function(element,key,self){

var isPrimes = true;

if (element<2) {

isPrimes = false;

}else{

for (var i in self) {

if (self[i] !=1&&element!=self[i]&&element %self[i] === 0) {

isPrimes = false;

break;

}

}

}

return isPrimes;

});

console.log(r);

//[2,3,5,7];

返回数组片段

函数的定义和调用

函数的定义:function 函数名(参数,参数){ 。。。}  
函数体内的语句一旦执行到return  就执行完毕   返回结果  没有return
 函数执行完毕也会返回结果  结果为undefined  

函数就是一个对象  函数名可以视为指向该函数的变量   var 变量 =
function(参数){。。。}   这是一个匿名函数  他没有函数名
 但是这个函数赋值给了变量  通过变量就可以调用函数

复制代码 代码如下:

装饰器   

利用apply(),可以动态改变函数的行为

复制代码 代码如下:

变量的作用域

函数内申明的变量  作用于整个函数体  外部不可引用

不同函数各自申明同一个变量  只在各自的函数体内起作用
 不同函数体内的同名变量互相独立,互不影响  
 内部函数可以访问外部函数定义的变量  反过来这不行  
 内外函数的变量名相同 从内向外  外部的变量将被屏蔽  

变量的提升     在函数内部首先申明所有的变量 

2.2数组常用函数

sort

根据ASCII码排序

2.数组元素的操作

常量

用关键字const来定义常量  const和let都具有块级作用域    eg:   const pi=
3.14;

var a =    ['a','b','c','d','e','f','g',[11,22,33]];
alert(a.join(" * "));  // -> a * b * c * d * e * f * g *   
11,22,33

filter

用于把数组的某些元素过滤掉  然后返回剩下的元素  和map()类似  
filter()把传入的函数依次作用于每个元素  根据返回值决定去留该元素

var arr = [1,2,4,5,6,9,10,15];

var r = arr.filter(function(x){

return x%2!==0;});

console.log(r);

数组排序,先看个例子

高阶函数

一个函数可以作为另一个函数的参数 

sort

arguments  关键字  只在函数内部起作用  并且永远指向当前函数的调用者传入的所有参数  

arguments类似array  但不是array

foo(a[,b],c);

接收2.3个参数  b可选参数  如果只有2个参数  b默认为null

function foo(a,b,c){if(arguments.length ===2){   c =b;    b = null;}}

按理应该是11排最后面,因为这里把 4,11,33
当做完整的对象比较,所以被排在第一位
看不明白的话,用join()串起来,就明了多

map

调用map()方法,传入我们自己的函数  得到一个新的数组作为结果   

利用map()可以将所有数字转化为字符串 

eg:var arr = [1,2,3,4,5,6,7];     arr.map(String);

reduce()这个函数必须接受两个参数  把结果继续和下一个元素做累计
 作用在数组上

var arr = [1,3,5,7,9];   arr.reduce(function(x, y){     returnx + y;  
});

上一个的结果和序列下一个元素做累计计算

var  arr = [1,3,5,7,9];   arr.reduce(function(x, y){  returnx *10+ y;
  });//得到结果13579;

return arr.map(function(s){

return s.toLowerCase();

}).map(function(s){

return s[0].toUpperCase()+s.slice(1);

});

//将名字首字母大写  后面小写   规范名字

r = arr.map(function(s){

return parseInt(s);

});

//将字符串变成整数。

此时为a已经开辟了内存空间,包含10个元素,用数组名称加 [下标]
来调用,例如 a[2] 但此时元素并未初始化,调用将返回 undefined。
以下代码定义了个可变数组,并进行赋值。

var a = ['a','b','c','d','e','f','g',[4,11,33]];
alert(a.reverse());  // -> 4,11,33,g,f,e,d,c,b,a
alert(a.join(" * "));  // -> 4,11,33 * g * f * e * d * c * b
* a

跟concat的区别在于,concat不影响原数组,直接返回新数组,而push则直接修改原数组,返回的是数组新长度

复制代码 代码如下:

此时相当于b[“2.2”]  = “XXXXX”。

复制代码 代码如下:

valueOf

复制代码 代码如下:

var a = [1,2,3,4,5,6,7,8,9];
document.write(a.splice(3,2));    // -> 4,5
document.write(a);        // -> 1,2,3,6,7,8,9
document.write(a.splice(4));  // -> 7,8,9 注:IE下返回空
document.write(a);        // -> 1,2,3,6
document.write(a.splice(0,1));    // -> 1
document.write(a);        // -> 2,3,6
document.write(a.splice(1,1,["aa","bb","cc"]));   // -> 3
document.write(a);        // -> 2,aa,bb,cc,6,7,8,9
document.write(a.splice(1,2,"ee").join("#")); // -> aa,bb,cc#6
document.write(a);        // -> 2,ee,7,8,9
document.write(a.splice(1,2,"cc","aa","tt").join("#"));  // ->
ee#7
document.write(a);        // -> 2,cc,aa,tt,8,9

toString

var a =    [5,6,7,8,9,"A","BB",100];
for(var i=0; i<a.length; i++){
document.write(a[i].toString()    + " 的二进制是 "    +
a[i].toString(2) + " ,八进制是 " + a[i].toString(8) + "
,十六进制是 " + a[i].toString(16));  //    -> 4,5
}

复制代码 代码如下:

用指定间隔符连起来,把数组转为字符串:

声明有10个元素的数组:

splice

var a =    [5,6,7,8,9,["A","BB"],100];
document.write(a.toString());    // -> 5,6,7,8,9,A,BB,100
var b = new Date()
document.write(b.toString());    // -> Sat Aug 8 17:08:32 UTC+0800   
2009
var c = function(s){
alert(s);
}
document.write(c.toString());    // -> function(s){ alert(s); }

a 和 b
都是数组,只不过b用了隐性声明,创建了另一个实例,此时如果用alert(a==b)将弹出false

var a = new Array();
a[0] = new Array();
a[0][0] = 1;
alert(a[0][0]);  //弹出 1

slice

转载本站文章请注明出处:vns威尼斯城官网登入 http://www.tiec-ccpittj.com/?p=3998

上一篇:

下一篇:

相关文章