JavaSript高级程序设计-第五章学习笔记

Object类型 创建Object实例的方式有两种:

var person=new Object(); person.name="JJ"; person.age=29;

  1. 对象字面量表示法;
var person={ name:"JJ"; age:29; }

使用对象字面量法时,属性名也可以使用字符串;
也可以这样:
var person={}; //与new Object()相同 person.name="JJ"; person.age=29;

我们更多使用对象字面量语法,实际上,对象字面量也是向函数传递大量可选参数的首选方式;
function displayInfo(args){ var output=""; if(typeof args.name=="string"){ output+="Name:"+args.name+"\n"; } if(typeof args.age=="number"){ output+="Age:"+args.age+"\n"; } alert(output); } displayInfo({ name:"JJ"; age:"29" }); displayInfo({ name:"YY"; });

这种传递参数的模式最适合需要向函数传入大量可选参数的情况;
【JavaSript高级程序设计-第五章学习笔记】访问对象属性的方法:
alert(person["name"]); //"JJ" 要以字符串的形式 alert(person.name); //"JJ"

功能上看,这两种方法没有任何区别;
但方括号语法的优点:
  1. 可以通过变量来访问属性
var propertyName="name"; alert(person[propertyName]); //"JJ"

  1. 如果属性名中包含会导致语法错误的字符,或属性名使用的是关键字或保留字,也可以使用方括号表示法;
person["first name"]="JJ";

由于"first name"包含空格,不能使用点表示法来访问它;
一般除非必须使用变量来访问属性,否则建议使用点表示法;
Array类型
  • 与其他语言不同,ECMAScript数组每一项可以保存任何类型的数据;
  • ECMAScript数组的大小是可以动态调整的;
创建数组的基本方式:
var colors=new Array(); var colors=new Array(20); //创建length值为20的数组 var colors=new Array("red","green");

new操作符也可以省略;
  1. 数组字面量表示法
var colors=["red","green"]; var names=[];

数组的length属性不止是读的,可以通过设置这个属性从数组末尾移除项或向数组中添加新项;
var colors=["red","blue"]; colors.length=1; alert(colors[1]); //undefined

var colors=["red","blue"]; colors.length=3; alert(colors[2]); //undefined

利用length也可以方便在数组末尾添加新项;
var colors=["red","blue"]; colors[colors.length]="black"; //在位置2添加颜色 colors[colors.length]="brown"; //在位置3添加颜色

5.2.1检测数组 5.2.2转换方法
  • 数组继承的toLocaleString(), toString()和valueOf()方法,在默认情况下都会以逗号分隔符的字符串形式返回数组项;
  • 使用join()方法,则可以使用不同的分隔符来构建这个字符串。join()方法只接受一个参数,即用作分隔符的字符串;
var colors=["red","green","blue"]; alert(colors.join(",")); //red,green,blue 重现了toString()方法的输出; alert(colors.join("|}")); //red||green||blue

5.2.3栈方法(后进先出)
  1. push()方法:可以接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度;
  2. pop()方法:从数组末尾移除最后一项,减少数组的length值,然后返回移除的项;
var colors=new Array(); var count=colors.push("red","green"); alert(count); //2count=colors.push("black"); alert(count); //3var item=colors.pop(); alert(item); //"black" alert(colors.length); //2

5.2.4队列方法(先进先出)
  1. shift()方法:移除数组中的第一个项并返回该项;
  2. unshift()方法:能在数组前端添加任意个项并返回新数组的长度;
5.2.5重排序方法
  • reverse()方法:反转数组项的顺序;
var values=[0,1,5,10,15]; values.reverse(); alert(values); //15,10,5,1,0

  • sort()方法:
    sort()函数的排序条件是:
    参数大于0,arr的相邻两个元素交换位置;
    参数小于0,arr的相邻两个元素不交换位置;
    参数等于0,arr的相邻两个元素大小相等; 所以compare自定义函数必须返回一个数值。
    默认情况下,sort()方法按升序排列数组项,但是这个方法会调用toString()转型方法,然后比较得到的字符串,即使数组的每一项都是数值,如:
var values=[0,1,5,10,15]; values.sort(); alert(values); //0,1,10,15,5

这种排序方式不是最佳,因此sort()方法可以接收一个比较函数作为参数。
这个比较函数可以适用大多数数据类型;
升序:
function compare(value1,value2){ if(value1value2){ return 1; } else{ return 0; } } var values=[0,1,5,10,15]; values.sort(compare); alert(values); //0,1,5,10,15

降序:
function compare(value1,value2){ if(value1value2){ return -1; } else{ return 0; } } var values=[0,1,5,10,15]; values.sort(compare); alert(values); //15,10,5,1,0

对于数值类型或者其valueOf()会返回数值类型的对象类型,可以使用一个更简单的比较函数。
function compare(value1,value2){ return value2-value1; }

5.2.6操作方法
  • concat(): 如果传递给concat()方法的是一或多个数组,则该方法会将这些数组中的每一项都添加到结果数据中。如果传递的不是数组这些值会被简单地添加到结果数组的末尾。如果没有给它传递参数,它只是复制当前数组并返回副本;
var colors=["red","green"]; var colors2=colors.concat("yellow",["black","brown"]); alert(colors); //red,green alert(colors2); //red,green,yellow,black,brown

  • slice():它能够基于当前数组中的一或多个项创建一个新数组。 slice(a, b) 参数表示返回项的起始和结束位置,如果只有一个参数,则返回指定位置开始到当前数组末尾的所有项。
var colors=["red","green","blue","yellow","purple"]; var colors2=colors.slice(1); var colors3=colors.slice(1,4); alert(colors2); //green,blue,yellow,purple alert(colors3); //green,blue,yellow

如果slice方法的参数中有一个负数,则用数组长度加上该数来确定相应位置;
  • splice(a, b, c) 始终返回一个数组,该数组中包含从原始数组中删除的项,如果没有删除,则返回空数组;
  1. 当有两个参数时:要删除第一项的位置,或删除的项数;
  2. 当有三个参数时:插入。三或以上参数:替换,插入的项不必与删除的项数相等;
var colors=["red","green","blue"]; var removed=colors.splice(0,1); //删除第一项 alert(colors); //green,blue alert(removed); //redremoved=colors.splice(1,0,"yellow","orange"); //从位置1开始插入两项 alert(colors); //green,yellow,orange,blue alert(removed); //返回的是空数组removed=colors.splice(1,1,"red","purple"); //插入两项,删除一项 alert(colors); //green,red,purple,orange,blue alert(removed); //yellow

splice() 方法与 slice() 方法的作用是不同的,splice() 方法会直接对数组进行修改。
slice可用于字符串,splice则不可用于字符串
5.2.7位置方法
  • indexOf()从数组开头
  • lastindexOf()从数组末尾
都有两个参数,第一个要查找的项,第二个表示要查找的起点位置(可选);
这两个方法都返回要查找的项在数组中的位置,如果没有找到则返回-1;
var numbers=[1,2,3,4,5,4,3,2,1]; alert(numbers.indexOf(4)); //3 alert(numbers.lastIndexOf(4)); //5alert(numbers.indexOf(4,4)); //5 alert(numbers.lastIndexOf(4,4)); //3

5.2.8迭代方法 ECMAScript5为数组定义了5个迭代方法。每个方法都接收两个参数:要在每一项上运行的函数和(可选)运行该函数的作用域对象--影响this的值;
传入这些方法中的函数会接收三个参数:数组项的值,该项在数组中的位置1和数组对象本身;
  1. every(),传入函数必须对每一项都返回true,这个方法才返回true;
  2. some(),只要传入的函数对数组中某一项返回true,就会返回true;
var numbers=[1,2,3,4,5,4,3,2,1]; var everyResult=numbers.every(function(item,index,array){ return(item>2); }); alert(everyResult); //falsevar someResult=numbers.some(function(item,index,array){ return(item>2); }); alert(someResult); //true

  1. filter(),它利用指定函数确定是否在返回的数组中包含某一项。
var numbers=[1,2,3,4,5,4,3,2,1]; var filterResult=numbers.filter(function(item,index,array){ return(item>2); }); alert(filterResult); //[3,4,5,4,3]

这个方法对查询符合某些条件的所有数组项非常有用;
  1. map(),也返回一个数组,这个数组每一项都是在原始数组中对应项上运行传入函数的结果;
var numbers=[1,2,3,4,5,4,3,2,1]; var mapResult=numbers.map(function(item,index,array){ returnitem*2; }); alert(mapResult); //[2,4,,6,8,10,8,6,4,2]

  1. forEach(),没有返回值,本质上和使用for循环迭代数组一样;
var numbers=[1,2,3,4,5,4,3,2,1]; number.forEach(function(item,index,array){ //执行某些操作 };

5.2.9归并方法
  1. reduce(),从数组第一项开始
  2. reduceRight(),从数组的最后一项开始
这两个方法都会迭代1数组所有项,然后构建一个最终返回的值;
它们的函数接收四个值:前一个值,当前值,项的索引和数组对象;
这个函数返回的任何值都会作为第一个参数自动传给下一个项;
var values=[1,2,3,4,5]; var sum=values.reduce(function(pre,cur,index,array){ return pre+cur; }); alert(sum); //15

Date类型 year:四位年份,如果写成两位数,则加上1900
month:表示月份,0表示一月,11表示12月
date:表示日期,1到31
hour:表示小时,0到23
minute:表示分钟,0到59
second:表示秒钟,0到59
ms:表示毫秒,0到999
日期的运算 类型转换时,Date对象的实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期对象进行减法运算,返回的就是它们间隔的毫秒数;进行加法运算,返回的就是连接后的两个字符串。
var d1 = new Date(2000, 2, 1); var d2 = new Date(2000, 3, 1); d2 - d1 // 2678400000d2 + d1 // "Sat Apr 01 2000 00:00:00 GMT+0800 (CST)Wed Mar 01 2000 00:00:00 GMT+0800 (CST)"

Date.now() 返回表示调用这个方法时的日期和时间的毫秒数;
//取得开始时间 var start=Date.now(); doSomething(); //取得停止时间 var stop=Date.now(); result=stop-start;

    推荐阅读