学习java script 高级程序设计第三版笔记(二)

第5章:引用类型
引用类型的值(对象)就是引用类型的一个实例。新对象使用new的方法创建对象。如:
var person = new Object();
ECMAScript中提供了许多原生引用类型。
(1)Object类型
创建Object的实例有两种方法,一是使用Object的构造函数,二是使用对象字面量的方法,
构造函数:

    var person = new Object();
    person.name = "estella";
    person.age = "22";    

对象字面量:

 var person = {
    name: "estella",
    age: "29"
 }; 

(2)Array类型
EMCAScript中的数组每一项都可以保存任意类型的数据。长度大小可以动态调整
1.创建方法
a.使用构造方法

 var colors  = new Array();
 var colors  = new Array(20);//创建长度为20的数组
 var colors  = new Array("red","blue","green");//创建包含三个字符串的数组 

此外,在使用Array构造函数时还可以省略new操作符
b.数组字面量表示法

  var colors = ["red","blue","green"];

2.读取和设置

   var colors = ["red","blue","green"];
    alert(colors[0]);//取第一项;
    colors[2] = "black";//修改第三项;
    colors[3] = "brown"; //新增第四项;

数组的项数保存在length属性当中,可以colors.length读取。值得注意的一点是length属性并不是只读的,通过这个属性可以从数组的末尾移除项或者向数组中添加新项。

     var colors = ["red","blue","green"];
     colors.length = 2;
     alert(colors[2]);//undefined;将长度设置为2后最后一项被移除;

3.检测数组
(a)可以使用instanceof检测,使用这种方法在同一个网页中有多个不同框架的时候,在框架之间传数组有可能造成构造函数不一样。
(b)我们还可以使用Array.isArray(value)方法,目的在于最终确定某个值到底是不是数组。不关心它在哪个全局执行环境中创建。方法:
if(Array.isArray(value)){
}

4.栈方法(push,pop)
栈是一种后进先出的数据结构,ECMAScript提供了两个方法push和pop方法,以便实现类似栈的行为。
push()方法可以接受任意数量的参数,将它们逐个添加到数组末尾,并返回修改后数组的长度。而pop方法则是从数组末尾移除最后一项,减少数组length的值,然后返回移除的项。

    var colors = new Array();
    var count = colors.push("red","green");//推入两项
    alert(count);//2
    count = colors.push("black");
    alert(count);//3;
    var item  = colors.pop();
    alert(item);//"black"
    alert(colors.length);//2

5.队列方法(push,shift)
队列数据的访问规则是先进先出.队列在列表的末端添加项,在前端移除项。用于push可以实现在末端添加项,因此只需要模拟队列在前端移除项的方法即可,那就是shift();它能够移除数组的第一项并返回移除项,同时数组长度减1,结合push和shift方法就可以像队列一样使用数组。

    var colors = new Array();
    var count = colors.push("red","green");//推入两项
    alert(count);//2
    count = colors.push("black");
    alert(count);//3; 
    var item = colors.shift();
    alert(item);//red;
    alert(colors.length);//2 

6.重排序方法
数组中可以使用reverse()和sort()两种方法来进行排序
1.reverse:反转数组的顺序

var values = [1,2,3,4,5]
values.reverse();
alert(values);       //[5,4,3,2,1]

2.sort()默认情况下sort按升序的方法排列数组。值得注意的是,sort()会调用每个数组项的toString()方法转成字符串后再进行比较,及时数组中每一项都是数值,也会转成字符串。如下所示:

 var value = [0,1,5,10,15];
 value.sort();
 alert(values);   //0,1,10,15,5

从上面的例子可以看出即使本来数值中的顺序没有问题。但是由于在字符串比较时“10”会在“5”的前面
,所以数组会被修改。显然这不是我们想要的。此外sort还可以接收一个比较函数作为参数。
比较函数接收两个参数,如果第一个参数应该位于第二个之前就返回负数,两者相等返回零,第一个函数应该位于第二个函数后面就返回正数,如下:

  function compare(value1,value2)
  {
    if(value1 < value2){
        retrun -1;
   }if(value1 == value2){
        return 0;
}else{
    return 0;
}
} 

var values = [0,1,5,10,15];
values.sort(compare);
alert(values);0,1,5,10,15

7.操作方法
(a) concat():基于当前所有项创建一个新的数组。在没给concat()传递参数的情况下相当于是复制原来的数组,如果传递了一个或多个值或数组,就逐项往后加。如下:

var colors = ["red","green","black"];
var colors2 = colors.concat("yellow",["blue","brown"]);
alert(colors);      //red,green,black;
alert(colors2);     //red,green,blue,yellow,black,brown

(b)slice():基于当前数组的一个或多个像创建新数组。传一个参数的时候就是它的起始项。传两个参数的时候就是她的起始到结束位置(含头不含尾)如:

 var colors = ["red","green","blue","yellow","purple"];
 var color2 = colors.slice(1);
 var color3 = colors.slice(1,4);
 alert(color2);  // green,blue,yellow,purple
 alert(color3);  //greem,blue,yellow(含头不含尾)

(c)splice()主要用于三种方式:
(1)删除:指定两个参数,第一个是要删除的第一项的位置,第二个参数是要删除的项数,如:
splice(0,2)会删除头两项
(2)插入: 提供三个参数 起始位置,0(要删除的项),要插入的项(可多个)如:
splice(2,0,”red”,”green”);
(3)替换:提供三个参数:起始位置,要删除的项数,要插入的项
如 splice(2,1,”red”,”green”);

  var colors = ["red","green","blue"];
  var removed = colors.splice(0,1);
  alert(colors);// green,blue;
  alert(removed); // red,返回的数组中只包含一项

 remove = colors.splice(1,0,"yellow","orange");
 alert(colors); //green,yellow,orange,blue
 alert(removed);//空数组

 remove = colors.splice(1,1,"red","purple")
 alert(colors); //green,red,purple,orange,blue;
 alert(removed);//yellow;   

8.位置方法
可以使用indexOf ()和lastIndexOf()查找特定项在数组中的位置。indexOf从数组前面开始找。lastIndexOf()从数组后面开始找
可以接受两个参数,第一个参数:要查找的项,第二个参数:查找起点位置的索引(可选),
返回要查找的项在数组中的位置。

var numbers = [1,2,3,4,5,4,3,2,1]
alert(numbers.indexOf(4)) //3
alert(numbers.indexOf(4,4)) //5
alert(numbers.lastIndexOf(4)) //5
alert(numbers.lastIndexOf(4,4))//3 

9.迭代方法
every():对数组中的每一项运行给定函数,如果函数对每一项返回true,则返回true.
filter():对数组中的每一项都运行给定函数,返回该函数会返回true的项组成的数组
forEach():对数组中的每一项运行给定函数,这个方法没有返回值
map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组,
some():对数组中的每一项运行给定函数,如果改函数对任意一项返回true,则返回true;

every()和some()一般都用于查询数组中的项是否满足某个条件。不同的是前者要全部项为true才返回true,后者是任意一项为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);//false

var someResult = numbers.some(function(item,index,array){
    return (item>2);
});
alert(someResult);  //true;

filter(),可以用于过滤出我们所需要的项,如下,返回数组中所有大于二的值的数组

var numbers = [1,2,3,4,5,4,3,2,1];
var filterResule = numbers.filter(function(item,index,array){
    return(item>2);
});
alert(filterResult);//[3,4,5,4,3]

map()返回一个数组。这个数组是在原来的数组的对应项上面进行函数操作后的结果组成的。如:

var numbers = [1,2,3,4,5,4,3,2,1];
var mapResult = numbers.map(function(item,index,array){
        return item*2;
});
alert(mapResult);//2,4,6,8,10,8,6,4,2

forEach:对数组中的每一项进行操作

var numbers = [1,2,3,4,5,4,3,2,1];
numbers.forEach(function(item,index,array){
    //执行某些操作
});

3.Date 类型
在这个类型中其实跟java中差不多,首先是新建一个Date,如果不传入任何参数的话,那么新创建的对象就会自动获取当前时间。
var now = new Date();
(1) 如果想要创建特定的时间的话那就需要传入该日期的毫秒数(1970-1-1 0:00 -指定时间),可以使用Date.parse().和Date.UTC();
Date.parse()可以这么用:
var someDate = new Date(Date.parse(“May 25,2004”)); 也等价于
var someDate = new Date(“May 25,2004”); //里面字符串的格式并不局限于一种
Date.UTC();这个构建的格式跟上面的不一样。他的参数分别是:年份,基于0的月份(0-11),基于1的天数(1-31),小时数(0-23),分钟,秒,毫秒,参数中前两个是必须,天数没有默认1.其他参数没有默认0.如下:

//GMT时间2000年1月1日午夜零时
var y2k = new Date(Date.UTC(2000,0));
//GMT时间2005年5月5日 下午5:55:55
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));

ECMAScript5中还添加了Date.now(),获取调用当前方法时的的毫秒数。可以用于计时
Date也可以使用toString(),toLocaleString(),返回表示日期的字符串。不过二者的表达方法有区别,而且不同浏览器之间也有区别、
至于Date的valueOff返回的则是毫秒数。我们可以根据毫秒数比较时间的前后。(小的比较早)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值