12.核心JavaScript笔记:日期和其它内置对象

本系列内容由ZouStrong整理收录

整理自《JavaScript权威指南(第六版)》,《JavaScript高级程序设计(第三版)》

一. 日期对象

Date类型使用UTC(国际协调时间),自1970年1月1日零时开始经过的毫秒数来保存时间

注:可以保存1970年1月1号前后28万多年的时间

中国有8个时区,所以以1970年1月1日 8 时开始经过的毫秒数来保存时间,不过通常最后都是算的时间的差值,所以也就无所谓了

1. 创建日期对象

要创建一个日期对象,使用new操作符和Date构造函数即可

不使用参数时,创建拥有当前日期和时间的对象

var now = new Date();       // Thu Jul 10 2014 11:17:20 GMT+0800 (中国标准时间)

如果想根据特定的日期和时间创建对象,必须传入表示该日期的毫秒数(即从1970年1月1日0时到该日期经过的毫秒数,中国是从8时开始)

var now = new Date(1000);   // Thu Jan 01 1970 08:00:01 GMT+0800 (中国标准时间)

不过,每次手动计算毫秒值很是麻烦,所以提供了两个构造函数方法可以将具体的日期时间转换成毫秒值,然后传递给Date构造函数

Date.parse()

该方法接收一个表示日期的字符串,然后返回相应的毫秒值(即从1970年1月1日0时到该日期经过的毫秒数,中国是从8时开始),可接受的形式有很多

var someDate = new Date(Date.parse("07/10/2004"));

如果直接将上面表示日期的字符串传递给Date构造函数,也会在后台调用Date.parse()

虽然可以直接传递日期字符串参数,但是要记住,是做了转换的,最终接收的还是毫秒值

Date.UTC()

该方法同样接收一些表示日期的值(不是字符串),返回相应的毫秒值,但接受的参数形势不同

他的参数分别是——年,基于0的月,日,基于0的时,分,秒,毫秒

var someDate = new Date(Date.UTC(2014,07,10,08,13,56,10));
//Sun Aug 10 2014 16:13:56 GMT+0800 (中国标准时间)

//Thu Jul 10 2014 16:13:56 GMT+0800 (中国标准时间)   ----注意8个时区

注:只有年份和月份是必须的,没有提供日数,则为1,其他统统默认为0

如果直接将上面表示日期的参数传递给Date构造函数,也会在后台调用Date.UTC(),不过此时是基于本地时区创建,就不用加8个时区了

var someDate = new Date(2014 , 06 , 10 , 08 , 13 , 56 , 10);
//Thu Jul 10 2014 08:13:56 GMT+0800 (中国标准时间)

注:最后记住,只要知道有这么两个方法存在就好了,实际使用中,我们应该直接传递日期参数即可

Date.now()

ECMAScript5新增了Date.now()方法,返回执行该方法时的当前日期的毫秒值

var start = Date.now();   //取得开始时间
doSomething();         //做一些事
var stop = Date.now();   //取得停止时间
var result = stop –start;  //获得差值

IE8及以下不支持,但是使用+运算符把日期对象转换成毫秒值,也可以达到同样目的,或者使用Number()函数、.valueOf()方法、.getTime()方法

var start = +new Date();   //取得开始时间
doSomething();         //做一些事
var stop = +new Date();   //取得停止时间

2. 日期对象方法

所有对象都具有继承的toString()、toLocaleString()、和valueOf()方法,但重写了

valueOf()方法

返回日期的毫秒表示(还算有点用)

正因为如此,才可以方便的比较日期值,因为比较对象时会调用.valueOf()方法

var date1 = new Date(2007, 0, 1);    //"January 1, 2007" 
var date2 = new Date(2007, 1, 1);    //"February 1, 2007" 
alert(date1 < date2);     //true 

toString()方法、toLocaleString()方法、toDateString()方法、toLocaleDateString()方法、toTimeString()方法、toLocaleTimeString()方法、toUTCString()方法(toGMTString()方法的替代者)

都返回特定格式的年月日,并且因浏览器而已,所以没什么实际用处

getTime()方法

返回日期的毫秒值形式(与valueOf()方法相同)

setTime()方法

以毫秒设置日期(会改变整个日期)

getFullYear()方法

获得四位数的年份

setFullYear()方法

设置四位数的年份

getMonth()方法

获得月份(0~11,表示1到12月)

setMonth()方法

设置月份(0~11,表示1到12月,超过11则,增加年份)

getDate()方法

获得天数(1~31,表示1到31号)

setDate()方法

设置天数(1~31,表示1到31号,超过当月天数,则增加月份)

getDay()方法

获得星期(0~6,表示星期日到星期六,老外以星期天当做一周第一天)

注:没有setDay()方法哦,星期由年月日决定了

getHours()方法

获得小时(0~23)

setHours ()方法

设置小时(0~23,超过23,则增加天数)

getMinutes()方法

获得分钟(0~59)

setMinutes()方法

设置分钟(0~59,超过59,则增加小时)

getSeconds()方法

获得秒数(0~59)

setSeconds()方法

设置秒数(0~59,超过59,则增加分钟)

getMilliseconds()方法

获得毫秒数

setMilliseconds()方法

设置毫秒数

二. 其它内置对象

ECMA-262对内置对象的定义是:“由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”也就是不必显式地实例化内置对象,因为它们已经实例化了。前面我们已经介绍了大多数内置对象,例如Object、Array 和String

ECMA-262还定义了两个单体内置对象:Math和Global

一. Math对象

Math对象提供了用于数学计算的属性和方法

Math.E属性

自然对数的底数,即e的值

Math.PI属性

π的值

Math.SQRT2属性

2的平方根

Math.max()方法

接收任意多个数字参数,返回最大值

Math.min()方法

接收任意多个数字参数,返回最小值

技巧:可用上面方法找出数组中的最大值

var values = [1, 2, 3, 4, 5, 6, 7, 8]; 
var max = Math.max.apply(Math, values); 

Math.ceil()方法

向上(大)舍入为最接近的整数

Math.floor()方法

向下(小)舍入为最接近的整数

Math.round()方法

四舍五入为最接近的整数

Math.random()方法

返回一个大于等于0但小于1的随机数

Math.abs()方法

返回绝对值

Math.pow(x,y)方法

返回x的y次幂

Math.sqrt()方法

返回平方根

返回立方根用Math.pow(x,1/3)

二. Global对象

Global(全局)对象是ECMAScript中最特别的一个对象,因为不管从什么角度看,这个对象都是不存在的。Global对象在某种意义上是作为一个终极的“兜底儿对象”来定义的。换句话说,不属于任何其他对象的属性和方法,最终都是它的属性和方法。

事实上,没有全局变量或全局函数;所有在全局作用域中定义的属性和函数,都是Global对象的属性,在web浏览器中,window对象就充当了Global对象的角色

encodeURI()方法

encodeURIComponent()方法

对URI或者其它文本进行编码(字符串形式),返回一个副本,其中的某些字符被十六进制的转义序列替换

var uri = “http://www.baidu.com/my name”; 
encodeURI(uri)             // “http://www.baidu.com/my20%name”
encodeURIComponent(uri);  // "http%3A%2F%2Fwww.baidu.com%2Fmy%20name"

注:为什么要进行编码?因为浏览器中有效的URI不允许包含某些字符,例如空格,编码后,浏览器才能正常解析

encodeURI()主要用于整个URI(例如,http://www.wrox.com/illegal value.html)

encodeURIComponent()主要用于URI中的某一段(例如前面URI中的illegal value.htm)

encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码

decodeURI()方法

decodeURIComponent()方法

分别对使用上述方法编码的字符串进行解码(即逆向操作)

注:escape()和unescape()方法在ECMA3中就被废弃(功能与上面相同)使用上面方法代替吧

eval()方法

eval()方法就像是一个完整的ECMAScript解析器,它只接受一个参数,即要执行的JavaScript字符串

eval("alert('hi')"); 

相当于

alert("hi"); 

当解析器发现eval()方法时,它会将传入的参数当作实际的ECMAScript语句来解析,然后把执行结果插入到原位置。通过eval()执行的代码被认为当前执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量

var msg = "hello world"; 
eval("alert(msg)"); //"hello world" 

这是因为上面第二行代码最终被替换成了一行真正的代码。同样地,我们也可以在eval()调用中定义一个函数或者变量,然后再在该调用的外部代码中引用这个函数或变量:

eval("function sayHi() { alert('hi'); }"); 
sayHi(); 

注:严格模式下,在外部访问不到eval()中创建的任何变量或函数

注:在eval()中创建的任何变量或函数都不会被提升,因为在预编译的时候,它们被包含在一个字符串中;它们只在eval()执行的时候创建

注: 能够解释代码字符串的能力非常强大,但也非常危险。因此在使用eval()时必须极为谨慎,特别是在用它执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁你的站点或应用程序安全的代码(即所谓的代码注入)

Global对象的属性

特殊的值,undefined、NaN、Infinity都是Global对象的属性

此外,所有原生引用类型的构造函数,都是Global对象的属性:Object、Array、Function、Boolean、String 、Number

你可能感兴趣的:(JavaScript)