`
hhr_michael
  • 浏览: 72711 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

JavaScript高级程序设计 (读书笔记4)

阅读更多
本地对象

ECMA-262把本地对象(native object)定义为“独立于宿主环境的ECMAScript实现提供的对象”。
简单说来,本地对象就是ECMA-262定义的类(引用类型)。

本地对象(Object、Function、String、Boolean和Number)
现在要讨论的两种重要的本地对象是Array和Date。

1. Array类

如果预先知道数组中项的个数,可以用参数传递数组的大小:

var aValues = new Array();
var aValues = new Array(20);

aValues[0] = "red";
aValues[1] = "blue";
aValues[2] = "green";

这里创建了一个数组,并定义了三个数组项,即"red"、"green"和"blue"。
每增加一个数组项,数组的大小就动态地增长。

此外,如果知道数组应该存放的值,还可用参数声明这些值,创建大小与参数个数相等的Array对象。例如,下面的代码将创建一个有三个字符串的数组:
var aValues = new Array("red","blue","green");

与字符串类似,数组中的第一个项位于位置0,第二个项位于位置1,依此类推。可通过使用方括号中放置要读取的项的位置来访问特定的项。
例如,要用刚才定义的数组输出字符串"green",可以采用下面的代码:
alert(aValues[2]);

可用属性length得到数组的大小。
aValues.length;

前面提过,数组可以根据需要增大或减小。

但如果把值放在这个数组的位置25处会怎样呢?
ECMAScript将把从3开始到24的所有位置都填上值null,然后在位置25处放上正确的值,并把数组大小增大为26:

数组最多可以存放4294967295项,这应该可满足大多数程序设计的需要。
如果要添加更多的项,则会发生异常。

还可以用字面量表示定义Array对象,即使用方括号([和]),用逗号分隔值。
例如,可以用下面的形式重写前面的例子:
var aColors = ["red","blue","green"];
注意,在这个例子中,未明确使用Array类。方括号暗示把其中的值存放在Array对象中。
用这种方式声明的数组与用传统方式声明的数组相同。

Array对象覆盖了toString()方法和valueOf()方法,返回特殊的字符串。
该字符串是通过对每项调用toString()方法,然后用逗号把它们连接在一起构成的。

例如,对具有项"red"、"green"和"blue"的数组调用toString()方法或valueOf()方法,返回的是字符串"red,green,blue"。

类似的,toLocaleString()方法返回的也是由数组项构成的字符串。
唯一的区别是得到的值是通过调用每个数组项的toLocaleString()方法得到的。


ECMAScript提供了方法join(),它唯一的用途就是连接字符串值。
join()方法只有一个参数,即数组项之间使用的字符串。
理解的重点在于任何字符串都可以用作分隔符。

那么String是否有把自己转换成数组的方法呢?
答案是肯定的。String类的方法split()正用于此。
split()方法只有一个参数。该参数就是被看作数组项之间的分隔符的字符串。
因此,如果有一个由逗号分隔的字符串,就可以用下面的代码把它转换成Array对象:

如果把空字符串声明为分隔符,那么split()方法返回的数组中的每个项是字符串的字符,例如:
var sValues = "green";
var aValues = sValues.split("");
aValues.toString();

这里,字符串"green"将被转换成字符串数组"g"、"r"、"e"、"e"和"n"。
如果需要逐个字符的解析字符串,这种功能非常有用。

concat()方法处理数组的方式几乎与它处理字符串的方式完全一样。
参数将被附加在数组末尾,返回的函数值是新的Array对象(包括原始数组中的项和新的项)。

slice()方法返回的是具有特定项的新数组。
Array类的slice()方法也接受一个或两个参数,即要提取的项的起始位置和结束位置。
如果只有一个参数,该方法将返回从该位置开始到数组结尾的所有项;
如果有两个参数,该方法将返回第一个位置和第二个位置间的所有项,不包括第二个位置处的项



ECMAScript的Array类的一个有趣之处是它提供的方法使数组的行为与其他数据类型的行为相似。

Array对象提供了两个方法push()和pop()。
push()方法用于在Array结尾添加一个或多个项,
pop()方法用于删除最后一个数组项(length-1),返回它作为函数值。
shift()方法将删除数组中的第一个项,将其作为函数值返回。
unshift()方法,它把一个项放在数组的第一个位置,然后把余下的项向下移动一个位置。

var aColors = ["red","green","yellow"];
var vItem = aColors.shift();
alert(aColors.toString());//green yellow
alert(vItem); //red
aColors.unshift("black");
alert(aColors.toString());//black green yellow

通过调用shift()和push()方法,可以使Array对象具有队列一样的行为。

另一方面,sort()方法将根据数组项的值按升序为它们排序。
要进行这种排序,首先调用toString()方法,将所有值转换成字符串,然后根据字符代码比较数组项

var aColors = ["red","green","blue","yellow"];
aColors.sort();
alert(aColors.toString());//blue green red yellow

var aColors = [3,32,2,5];
aColors.sort();
alert(aColors.toString());//2,3,32,5

出现这种情况的是因为,数字是被转换成字符串,然后再按照字符代码进行比较的。
这个问题可以克服。我将在第12章中对其进一步讨论。


迄今为止,最复杂的方法是splice()。
这种方法的作用真的非常简单:只是把数据项插入数组的中部。
不过,该方法用于插入这些项的方式的变体却大有用途:

删除——只需要声明两个参数,就可以从数组中删除任意多个项,这两个参数是要删除的第一个项的位置和要删除的项的个数。
例如arr.splice(0,2)将删除数组arr中的前两项。

替换而不删除——声明三个参数就可以把数据项插入指定的位置,这三个参数是起始位置、0(要删除的数组项的个数)和要插入的项。此外,还可以用第四个、第五个或更多个参数指定其他要删除的项。
例如,arr.splice(2,0. "red", "green")将在位置2处插入"red"和"green"。

替换并删除——声明三个参数就可以把数据项插入指定的位置,这三个参数是起始位置、要删除的数组项的个数以及要插入的项。此外,还可以指定要插入的更多的项。要插入的项的个数不必等于删除的项的个数。
例如,arr.splice(2,1, "red","green")将删除数组arr中位置2处的项,然后在位置2处插入"red"和"green"。


2. Date类

ECMAScript中的Date类基于Java中的java.util.Date类的早期版本。
与Java一样,ECMAScript把日期存储为距离UTC时间1970年1月1日凌晨12点的毫秒数。
UTC是Universal Time Code,即通用时间代码(也叫做Greenwich Mean Time,格林尼治标准时间)的缩写,是所有时区的基准标准时间。以毫秒数存储时间可以确保Java和ECMAScript免受恐怖的“千年虫”问题的侵害,该问题在20世纪90年代后期影响了许多较老的大型计算机。
计算机可以精确地表示出1970年1月1日之前及之后285 616年的日期,这意味着除非你可以活过200000年,否则日期存储不成问题。

用下面代码可以创建新的Date对象:

这行代码用当前的日期和时间创建新的Date对象。创建新Date对象时,可以以两种方式设置日期和时间的值。
第一种方法是,只声明距离 1970年1月1日凌晨12点的毫秒数:

还有parse()和UTC()两种方法(在Java中是静态方法)可以与创建Date对象的方法一起使用。
parse()方法接受字符串为参数,把该字符串转换成日期值(即毫秒表示)。
ECMA-262未定义parse()方法接受的日期格式,所以这由ECMAScript的实现特定,通常是地点特定的。
例如,在美国,大多数实现支持下面的日期格式:

mm/dd/yyyy(例如6/13/2004)

mmmm dd.yyyy(例如January 12,2004)

例如,如果为 2004年5月25日创建Date对象,可以使用parse()方法获得它的毫秒表示,然后将该值传递给Date构造函数:
var d = new Date(Date.parse("May 50,2005"));

如果传递给parse()方法的字符串不能转换成日期,该函数返回NaN。

UTC()方法返回的也是日期的毫秒表示,但参数不同,是日期中的年、月、日、小时、分、秒和毫秒。
使用该方法时,必须声明年和月,其他参数可选。
设置月份时要格外注意,因为它的值是从0到11,0代表一月,11代表十二月,
因此,要设置2004年2月5号,可以使用下列代码:

var d = new Date(Date.UTC(2004, 1, 5));

这里,1表示二月,即第二个月。这与用户设置日期输入的值不同。
可以想到,其他可能存在这种例外情况的参数是小时,采用24时制,而不是12时制。
因此,要设置2004年2月5号下午1:05分,可以使用下面的代码:
var d = new Date(Date.UTC(2004, 1, 5, 13, 5));

创建日期的第二种方法是直接声明UTC()方法接受的参数:
var d = new Date(2004, 1, 5);

声明参数的顺序相同,(除了年和月外)它们不必都出现。

Date类是少有的几个覆盖了toString()方法和valueOf()方法的类之一。
valueOf()方法返回日期的毫秒表示,
toString()方法返回由实现特定的字符串,采用人们可读懂的格式。

因此,不能依赖toString()方法执行任何一致的操作。
例如,在美国,IE把2003年2月2号显示为“Sun Feb 2 00 :00 :00 EST 2003”,
而Mozilla则把它显示为“Sun Feb 2 2003 00 :00 :00 GMT-0400 (Eastern Daylight Time)”。

还有其他几个用于创建特定日期的字符串表示的方法:

toDateString()——以实现的特定的格式显示Date的日期部分(即只有月、日和年);

toTimeString()——以实现的特定的格式显示Date的时间部分(即小时、分、秒和时区);

toLocaleString()——以地点特定的格式显示Date的日期和时间;

toLocaleDateString()——以地点特定的格式显示Date的日期部分;

toLocaleTimeString()——以地点特定的格式显示Date的时间部分;

toUTCString()——以实现特定的格式显示Date的UTC时间。

以上每种方法根据不同的实现和地点,输出不同的值,因此,使用它们时,必须多加练习。

可能你还没有领会到,Date类对UTC日期和时间有很强的依赖性。
Date类用方法getTimezoneOffset()来说明某个时区与UTC时间的关系,该方法返回当前时区比UTC提前或落后的分钟数。
例如,对于U.S. Eastern Daylight Saving Time(美国东部夏令时),getTime- zoneOffset()返回300,即比UTC时间落后5个小时(300分钟)。

还可用getTimezoneOffset()方法判断时区使用的是否是夏令时。实现这一点需要创建任意年份的 1月1日的日期,然后创建该年份的 7月1日的日期,比较时区偏移量。如果分钟数不等,说明该时区使用的是夏令时,如果相等,则该时区使用的不是夏令时。

Date类其余的方法(列在下表中)均用于设置或获取日期值的某部分。

getTime()返回日期的毫秒表示

setTime(milliseconds)设置日期的毫秒表示

getFullYear()返回用四位数字表示的日期的年份(如2004而不只是04)

getUTCFullYear()返回用四位数字表示的UTC日期的年份

setFullYear(year)设置日期的年份,参数必须是四位数字的年份值

setUTCFullYear(year)设置UTC日期的年份,参数必须是四位数字的年份值

getMonth()返回日期的月份值,由数字0(1月)到11(12月)表示

getUTCMonth()返回UTC日期的月份值,由数字0(1月)到11(12月)表示

setMonth(month)设置日期的月份为大于等于0的数字。对于大于11的数字,开始累计年数

setUTCMonth(month)设置UTC日期的月份为大于等于0的数字。对于大于11的数字,开始累计年数

getDate()返回该日期该月中的某天

getUTCDate()返回该UTC日期该月中的某天

setDate(date)设置该日期该月中的某天

setUTCDate(date)设置该UTC日期该月中的某天

getDay()返回该日期为星期几

getUTCDay()返回该UTC日期为星期几

setDay(day)设置该日期为星期几

setUTCDay(day)设置该UTC日期为星期几

getHours()返回日期中的小时值

getUTCHours()返回UTC日期中的小时值

setHours(hours)设置日期中的小时值

setUTCHours(hours)设置UTC日期中的小时值

getMinutes()返回日期中的分钟值

getUTCMinutes()返回UTC日期中的分钟值

setMinutes(minutes)设置日期中的分钟值

setUTCMinutes(minutes)设置UTC日期中的分钟值

getSeconds()返回日期中的秒值

getUTCSeconds ()返回UTC日期中的秒值

setSeconds (seconds)设置日期中的秒值

setUTCSeconds (seconds)设置UTC日期中的秒值

getMilliseconds()返回日期中的毫秒值。
注意,这不是自1970年1月1日以后的毫秒值,而是当前时间中的毫秒值,例如4 :55 :34.20,其中20即为时间的毫秒值

getUTCMilliseconds ()返回UTC日期中的毫秒值

setMilliseconds (milliseconds)设置日期中的毫秒值

setUTCMilliseconds (milliseconds)设置UTC日期中的毫秒值

分享到:
评论

相关推荐

    javascript 高级程序设计 读书笔记(3)

    NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1881210

    JavaScript高级程序设计 读书笔记之八 Function类及闭包

    Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,…,argumentN,function_body); 每个argument都是一个参数,...

    对javascript的一点点认识总结《javascript高级程序设计》读书笔记

    l ECMAScript,有ECMA-262定义,明确javascript这门语言的规则和约定,好比为开始一场游戏指定的游戏规则、规范、约定。 l DOM:提供访问和操作网页内容的方法和接口 l BOM,提供与浏览器交互的方法和接口 ...(4)导航和

    JavaScript高级程序设计 读书笔记之十一 内置对象Global

    内置对象 定义:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。 由定义可知开发者不必明确实例化内置对象,它已被实例化了。在ECMAScript-262只定义了两个内置对象,即Global...

    JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    要注意的是在JavaScript中月份的值是从0到11(0表示1月)。 设置日期和时间值 设置日期和时间值有两种方法: 1、只声明距离1970年1月1日凌晨12点的毫秒数 a、直接用距离1970年1月1日凌晨12点的毫秒数 var d=new Date...

    JavaScript高级程序设计 读书笔记之九 本地对象Array

    创建Array对象 代码如下: //one var aValues=new Array(); //two var aValues=new Array(20); //three var aColors=new Array(); aColors[0]=”red”; aColors[1]=”green”; aColors[2]=”blue”;...

    Reading-Notes:读书笔记们

    JavaScript高级程序设计(第三版) You don't know JS 系列 ES6 标准入门 Node.JS深入浅出 图解HTTP HTTP权威指南 Head First Java CSS3揭秘 Linux Command Line 大型网站技术架构核心原理与案例分析 锋利的jQuery ...

    JavaScript 函数惰性载入的实现及其优点介绍

    最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将...

    Javascript 面向对象 (声明篇)

    由于才疏学浅,我不得不将《Javascript 高级程序设计》中的部分内容摘抄过来,这些同时也算是我的读书笔记吧。由于 Javascript 面向对象机制及其的重要,而且内容非常的繁多,在这里就分篇章逐个介绍。 使用对象首先...

    my-blog:自己的博客

    JavaScript深入理解系列读书笔记系列这部分只会记载一些笔记,不会深入解读电子书链接:提取码:wube《你不知道JavaScript》中册《JavaScript高级程序设计》数据结构栈队列链表哈希表树图浏览器部分浏览器的主要进程...

    疯狂的java讲义源码-ReadingBooks:读书笔记整理

    《JavaScript高级程序设计(第3版)》 学习JS和前端必读的书籍,比较厚但是很有干货涉及面比较广,里面的重要章节我自己是读了不止一遍。 2、 《ES6标准入门》 阮一峰编着,作者讲事情的思路一向比较清晰,也是学ES6...

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

Global site tag (gtag.js) - Google Analytics