Object对象

概述

JavaScript 原生提供Object对象(注意起首的O是大写)。

JavaScript 的所有其他对象都继承自Object对象,即那些对象都是Object的实例。

Object对象的原生方法分成两类:Object本身的方法与Object的实例方法。

Object对象本身的方法

Object的实例方法

Object()

Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。这个方法常用于保证某个值一定是对象。

如果参数为空(或者为undefined和null),Object()返回一个空对象。

instanceof运算符用来验证,一个对象是否为指定的构造函数的实例。obj instanceof Object返回true,就表示obj对象是Object的实例。

如果参数是原始类型的值,Object方法将其转为对应的包装对象的实例。

如果Object方法的参数是一个对象,它总是返回该对象,即不用转换。

利用这一点,可以写一个判断变量是否为对象的函数。

Object构造函数

Object不仅可以当作工具函数使用,还可以当作构造函数使用,即前面可以使用new命令。

Object构造函数的首要用途,是直接通过它来生成新对象。

注意,通过var obj = new Object()的写法生成新对象,与字面量的写法var obj = {}是等价的。或者说,后者只是前者的一种简便写法。

Object的静态方法

所谓“静态方法”,是指部署在Object对象自身的方法。

Object.keys(),Object.getOwnPropertyNames()

Object.keys方法和Object.getOwnPropertyNames方法都用来遍历对象的属性。

Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名。

对于一般的对象来说,Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还返回不可枚举的属性名。

由于 JavaScript 没有提供计算对象属性个数的方法,所以可以用这两个方法代替。

其他方法

对象属性模型的相关方法

控制对象状态的方法

原型链相关方法

Object的实例方法

除了静态方法,还有不少方法定义在Object.prototype对象。它们称为实例方法,所有Object的实例对象都继承了这些方法。

Object实例对象的方法,主要有以下六个。

Object.prototype.valueOf()

valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。

valueOf方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法。

Object.prototype.toString()

toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串。

通过自定义toString方法,可以让对象在自动类型转换时,得到想要的字符串形式。

数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法。覆盖原始方法。

toString() 的应用:判断数据类型

Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型。

由于实例对象可能会自定义toString方法,覆盖掉Object.prototype.toString方法,所以为了得到类型字符串,最好直接使用Object.prototype.toString方法。通过函数的call方法,可以在任意值上调用这个方法,帮助我们判断这个值的类型。

不同数据类型的Object.prototype.toString方法返回值如下。

利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数。

Object.prototype.toLocaleString()

Object.prototype.toLocaleString方法与toString的返回结果相同,也是返回一个值的字符串形式。

这个方法的主要作用是留出一个接口,让各种不同的对象实现自己版本的toLocaleString,用来返回针对某些地域的特定的值。目前,主要有三个对象自定义了toLocaleString方法。

举例来说,日期的实例对象的toString和toLocaleString返回值就不一样,而且toLocaleString的返回值跟用户设定的所在地域相关。

Object.prototype.hasOwnProperty()

Object.prototype.hasOwnProperty方法接受一个字符串作为参数,返回一个布尔值,表示该实例对象自身是否具有该属性。而不显示继承而来的属性。

Array对象

构造函数

Array是 JavaScript 的原生对象,同时也是一个构造函数,可以用它生成新的数组。

Array构造函数的参数2,表示生成一个两个成员的数组,每个位置都是空值。

如果没有使用new,运行结果也是一样的。

Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致。

Array作为构造函数,行为很不一致。因此,不建议使用它生成新数组,直接使用数组字面量是更好的做法。

注意,如果参数是一个正整数,返回数组的成员都是空位。虽然读取的时候返回undefined,但实际上该位置没有任何值。虽然可以取到length属性,但是取不到键名。

静态方法

Array.isArray()

Array.isArray方法返回一个布尔值,表示参数是否为数组。它可以弥补typeof运算符的不足。

typeof运算符只能显示数组的类型是Object,而Array.isArray方法可以识别数组。

实例方法

valueOf(),toString()

valueOf方法是一个所有对象都拥有的方法,表示对该对象求值。不同对象的valueOf方法不尽一致,数组的valueOf方法返回数组本身。

toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。

push(),pop()

push方法用于在数组的末端添加一个或多个元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。

pop方法用于删除数组的最后一个元素,并返回该元素。注意,该方法会改变原数组。

对空数组使用pop方法,不会报错,而是返回undefined。

shift(),unshift()

shift方法用于删除数组的第一个元素,并返回该元素。注意,该方法会改变原数组。

shift方法可以遍历并清空一个数组。

push和shift结合使用,就构成了“先进先出”的队列结构(queue)。

unshift方法用于在数组的第一个位置添加元素,并返回添加新元素后的数组长度。注意,该方法会改变原数组。

unshift方法可以接受多个参数,这些参数都会添加到目标数组头部。

join()

join方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔。

如果数组成员是undefined或null或空位,会被转成空字符串。

通过call方法,这个方法也可以用于字符串或类似数组的对象。

concat()

concat方法用于多个数组的合并。它将新数组的成员,添加到原数组成员的后部,然后返回一个新数组,原数组不变。

除了数组作为参数,concat也接受其他类型的值作为参数,添加到目标数组尾部。

如果数组成员包括对象,concat方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是新数组拷贝的是对象的引用。

reverse()

reverse方法用于颠倒排列数组元素,返回改变后的数组。注意,该方法将改变原数组。

slice()

slice方法用于提取目标数组的一部分,返回一个新数组,原数组不变。

它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。

如果slice方法的参数是负数,则表示倒数计算的位置。

slice没有参数,实际上等于返回一个原数组的拷贝。

如果第一个参数大于等于数组长度,或者第二个参数小于第一个参数,则返回空数组。

slice方法的一个重要应用,是将类似数组的对象转为真正的数组。

splice()

splice方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。注意,该方法会改变原数组。

起始位置如果是负数,就表示从倒数位置开始删除。

如果只是单纯地插入元素,splice方法的第二个参数可以设为0。

sort()

sort方法对数组成员进行排序,默认是按照字典顺序排序。排序后,原数组将被改变。

sort方法不是按照大小排序,而是按照字典顺序。也就是说,数值会被先转成字符串,再按照字典顺序进行比较,所以101排在11的前面。

如果想让sort方法按照自定义方式排序,可以传入一个函数作为参数。

sort的参数函数本身接受两个参数,表示进行比较的两个数组成员。如果该函数的返回值大于0,表示第一个成员排在第二个成员后面;其他情况下,都是第一个元素排在第二个元素前面。

map()

map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。

map方法接受一个函数作为参数。该函数调用时,map方法向它传入三个参数:当前成员、当前位置和数组本身。

map方法还可以接受第二个参数,用来绑定回调函数内部的this变量。

如果数组有空位,map方法的回调函数在这个位置不会执行,会跳过数组的空位。

map方法不会跳过undefined和null,但是会跳过空位。

forEach()

forEach方法与map方法很相似,也是对数组的所有成员依次执行参数函数。但是,forEach方法不返回值,只用来操作数据。这就是说,如果数组遍历的目的是为了得到返回值,那么使用map方法,否则使用forEach方法。

forEach的用法与map方法一致,参数是一个函数,该函数同样接受三个参数:当前值、当前位置、整个数组。

forEach方法也可以接受第二个参数,绑定参数函数的this变量。

forEach方法无法中断执行,总是会将所有成员遍历完。如果希望符合某种条件时,就中断遍历,要使用for循环。

forEach方法也会跳过数组的空位。

filter()

filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。

它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组

filter方法的参数函数可以接受三个参数:当前成员,当前位置和整个数组。

filter方法还可以接受第二个参数,用来绑定参数函数内部的this变量。

some(),every()

这两个方法类似“断言”(assert),返回一个布尔值,表示判断数组成员是否符合某种条件。

它们接受一个函数作为参数,所有数组成员依次执行该函数。该函数接受三个参数:当前成员、当前位置和整个数组,然后返回一个布尔值。

some方法是只要一个成员的返回值是true,则整个some方法的返回值就是true,否则返回false。

every方法是所有成员的返回值都是true,整个every方法才返回true,否则返回false。

注意,对于空数组,some方法返回false,every方法返回true,回调函数都不会执行。

some和every方法还可以接受第二个参数,用来绑定参数函数内部的this变量。

reduce(),reduceRight()

reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。

reduce方法和reduceRight方法的第一个参数都是一个函数。该函数接受以下四个参数。

这四个参数之中,只有前两个是必须的,后两个则是可选的。

如果要对累积变量指定初值,可以把它放在reduce方法和reduceRight方法的第二个参数。

由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。

indexOf(),lastIndexOf()

indexOf方法返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1。

indexOf方法还可以接受第二个参数,表示搜索的开始位置。

lastIndexOf方法返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1。

注意,这两个方法不能用来搜索NaN的位置,即它们无法确定数组成员是否包含NaN。

这是因为这两个方法内部,使用严格相等运算符(===)进行比较,而NaN是唯一一个不等于自身的值。

链式使用

包装对象

定义

对象是 JavaScript 语言最主要的数据类型,三种原始类型的值——数值、字符串、布尔值——在一定条件下,也会自动转为对象,也就是原始类型的“包装对象”。

所谓“包装对象”,就是分别与数值、字符串、布尔值相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。

包装对象的最大目的,首先是使得 JavaScript 的对象涵盖所有的值,其次使得原始类型的值可以方便地调用某些方法。

Number、String和Boolean如果不作为构造函数调用(即调用时不加new),常常用于将任意类型的值转为数值、字符串和布尔值。

即,这三个对象作为构造函数使用(带有new)时,可以将原始类型的值转为对象;作为普通函数使用时(不带有new),可以将任意类型的值,转为原始类型的值。

实例方法

包装对象的实例可以使用Object对象提供的原生方法,主要是valueOf方法和toString方法。

valueOf()

valueOf方法返回包装对象实例对应的原始类型的值。

toString()

toString方法返回对应的字符串形式。

原始类型与实例对象的自动转换

原始类型的值,可以自动当作包装对象调用,即调用各种包装对象的属性和方法。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,在使用后立刻销毁实例。

比如,字符串可以调用length属性,返回字符串的长度。

abc是一个字符串,本身不是对象,不能调用length属性。JavaScript 引擎自动将其转为包装对象,在这个对象上调用length属性。调用结束后,这个临时对象就会被销毁。这就叫原始类型与实例对象的自动转换。

自动转换生成的包装对象是只读的,无法修改。所以,字符串无法添加新属性。

调用结束后,包装对象实例会自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个新生成的对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。如果要为字符串添加属性,只有在它的原型对象String.prototype上定义。

自定义方法

三种包装对象除了提供很多原生的实例方法,还可以在原型上添加自定义方法和属性,供原始类型的值直接调用。

这种自定义方法和属性的机制,只能定义在包装对象的原型上,如果直接对原始类型的变量添加属性,则无效。

Boolean 对象

概述

Boolean对象是 JavaScript 的三个包装对象之一。作为构造函数,它主要用于生成布尔值的包装对象实例。

Boolean 函数的类型转换作用

Boolean对象除了可以作为构造函数,还可以单独使用,将任意值转为布尔值。这时Boolean就是一个单纯的工具方法。

Number对象

概述

Number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。

作为构造函数时,它用于生成值为数值的对象。

属性

实例方法

Number对象有4个实例方法,都跟将数值转换成指定格式有关。

Number.prototype.toString()

Number对象部署了自己的toString方法,用来将一个数值转为字符串形式。

toString方法可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串。

10一定要放在括号里,这样表明后面的点表示调用对象属性。如果不加括号,这个点会被 JavaScript 引擎解释成小数点,从而报错。

除了为10加上括号,还可以在10后面加两个点,JavaScript 会把第一个点理解成小数点(即10.0),把第二个点理解成调用对象属性,从而得到正确结果。

意味着,可以直接对一个小数使用toString方法。

通过方括号运算符也可以调用toString方法。

toString方法只能将十进制的数,转为其他进制的字符串。如果要将其他进制的数,转回十进制,需要使用parseInt方法。

Number.prototype.toFixed()

toFixed方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串。

Number.prototype.toExponential()

toExponential方法用于将一个数转为科学计数法形式。

toExponential方法的参数是小数点后有效数字的位数,范围为0到20,超出这个范围,会抛出一个 RangeError 错误。

Number.prototype.toPrecision()

toPrecision方法用于将一个数转为指定位数的有效数字。

toPrecision方法的参数为有效数字的位数,范围是1到21,超出这个范围会抛出 RangeError 错误。

toPrecision方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关。

自定义方法

与其他对象一样,Number.prototype对象上面可以自定义方法,被Number的实例继承。

注意,数值的自定义方法,只能定义在它的原型对象Number.prototype上面,数值本身是无法自定义属性的。

String对象

概述

String对象是 JavaScript 原生提供的三个包装对象之一,用来生成字符串对象。

字符串对象是一个类似数组的对象(很像数组,但不是数组)。

String对象还可以当作工具方法使用,将任意类型的值转为字符串。

静态方法

String.fromCharCode()

该方法的参数是一个或多个数值,代表 Unicode 码点,返回值是这些码点组成的字符串。

String.fromCharCode方法的参数为空,就返回空字符串;否则,返回参数对应的 Unicode 字符串。

注意,该方法不支持 Unicode 码点大于0xFFFF的字符,即传入的参数不能大于0xFFFF(即十进制的 65535)。

String.fromCharCode发现参数值大于0xFFFF,就会忽略多出的位(即忽略0x20BB7里面的2)。

码点大于0xFFFF的字符占用四个字节,而 JavaScript 默认支持两个字节的字符。这种情况下,必须把0x20BB7拆成两个字符表示。

码点大于0xFFFF的字符的四字节表示法,由 UTF-16 编码方法决定。

实例属性

String.prototype.length

字符串实例的length属性返回字符串的长度。

实例方法

String.prototype.charAt()

charAt方法返回指定位置的字符,参数是从0开始编号的位置。

如果参数为负数,或大于等于字符串的长度,charAt返回空字符串。

String.prototype.charCodeAt()

charCodeAt方法返回字符串指定位置的 Unicode 码点(十进制表示),相当于String.fromCharCode()的逆操作。

如果没有任何参数,charCodeAt返回首字符的 Unicode 码点。

如果参数为负数,或大于等于字符串的长度,charCodeAt返回NaN。

charCodeAt方法返回的 Unicode 码点不会大于65536(0xFFFF),也就是说,只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符(四个字节的字符),必需连续使用两次charCodeAt,不仅读入charCodeAt(i),还要读入charCodeAt(i+1),将两个值放在一起,才能得到准确的字符。

String.prototype.concat()

concat方法用于连接两个字符串,返回一个新字符串,不改变原字符串。

如果参数不是字符串,concat方法会将其先转为字符串,然后再连接。

String.prototype.slice()

slice方法用于从原字符串取出子字符串并返回,不改变原字符串。它的第一个参数是子字符串的开始位置,第二个参数是子字符串的结束位置(不含该位置)。

如果省略第二个参数,则表示子字符串一直到原字符串结束。

如果参数是负值,表示从结尾开始倒数计算的位置。

如果第一个参数大于第二个参数,slice方法返回一个空字符串。

String.prototype.substring()

substring方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice方法很相像。它的第一个参数表示子字符串的开始位置,第二个位置表示结束位置(返回结果不含该位置)。

如果省略第二个参数,则表示子字符串一直到原字符串的结束。

如果第一个参数大于第二个参数,substring方法会自动更换两个参数的位置。

如果参数是负数,substring方法会自动将负数转为0。

由于这些规则违反直觉,因此不建议使用substring方法,应该优先使用slice。

String.prototype.substr()

substr方法用于从原字符串取出子字符串并返回,不改变原字符串,跟slice和substring方法的作用相同。

substr方法的第一个参数是子字符串的开始位置(从0开始计算),第二个参数是子字符串的长度。

如果省略第二个参数,则表示子字符串一直到原字符串的结束。

如果第一个参数是负数,表示倒数计算的字符位置。如果第二个参数是负数,将被自动转为0,因此会返回空字符串。

String.prototype.indexOf(),String.prototype.lastIndexOf()

indexOf方法用于确定一个字符串在另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配。

indexOf方法还可以接受第二个参数,表示从该位置开始向后匹配。

lastIndexOf方法的用法跟indexOf方法一致,主要的区别是lastIndexOf从尾部开始匹配,indexOf则是从头部开始匹配。

lastIndexOf的第二个参数表示从该位置起向前匹配。

String.prototype.trim()

trim方法用于去除字符串两端的空格,返回一个新字符串,不改变原字符串。

该方法去除的不仅是空格,还包括制表符(\t、\v)、换行符(\n)和回车符(\r)。

String.prototype.toLowerCase(),String.prototype.toUpperCase()

toLowerCase方法用于将一个字符串全部转为小写,toUpperCase则是全部转为大写。它们都返回一个新字符串,不改变原字符串。

String.prototype.match()

match方法用于确定原字符串是否匹配某个子字符串,返回一个数组,成员为匹配的第一个字符串。如果没有找到匹配,则返回null。

match方法还可以使用正则表达式作为参数。

String.prototype.search(),String.prototype.replace()

search方法的用法基本等同于match,但是返回值为匹配的第一个位置。如果没有找到匹配,则返回-1。

search方法还可以使用正则表达式作为参数。

replace方法用于替换匹配的子字符串,一般情况下只替换第一个匹配。

replace方法还可以使用正则表达式作为参数。

String.prototype.split()

split方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。

如果分割规则为空字符串,则返回数组的成员是原字符串的每一个字符。

如果省略参数,则返回数组的唯一成员就是原字符串。

如果满足分割规则的两个部分紧邻着(即两个分割符中间没有其他字符),则返回数组之中会有一个空字符串。

如果满足分割规则的部分处于字符串的开头或结尾(即它的前面或后面没有其他字符),则返回数组的第一个或最后一个成员是一个空字符串。

split方法还可以接受第二个参数,限定返回数组的最大成员数。

split方法还可以使用正则表达式作为参数。

String.prototype.localeCompare()

localeCompare方法用于比较两个字符串。它返回一个整数,如果小于0,表示第一个字符串小于第二个字符串;如果等于0,表示两者相等;如果大于0,表示第一个字符串大于第二个字符串。

该方法的最大特点,就是会考虑自然语言的顺序。举例来说,正常情况下,大写的英文字母小于小写字母。

JavaScript 采用的是 Unicode 码点比较但是,localeCompare方法会考虑自然语言的排序情况,大写字母比小写字母大。

localeCompare还可以有第二个参数,指定所使用的语言(默认是英语),然后根据该语言的规则进行比较。

Math对象

Math是 JavaScript 的原生对象,提供各种数学功能。该对象不是构造函数,不能生成实例,所有的属性和方法都必须在Math对象上调用。

静态属性

这些属性都是只读的,不能修改。

静态方法

Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空, Math.min返回Infinity, Math.max返回-Infinity。

Math.floor方法返回小于参数值的最大整数(地板值)。

Math.ceil方法返回大于参数值的最小整数(天花板值)。

Math.pow方法返回以第一个参数为底数、第二个参数为幂的指数值。

Math.sqrt方法返回参数值的平方根。如果参数是一个负值,则返回NaN。

如果要计算以10为底的对数,可以先用Math.log求出自然对数,然后除以Math.LN10;求以2为底的对数,可以除以Math.LN2。

Math.random()返回0到1之间的一个伪随机数,可能等于0,但是一定小于1。

三角函数方法

Date对象

Date对象是 JavaScript 原生的时间库。它以1970年1月1日00:00:00作为时间的零点,可以表示的时间范围是前后各1亿天(单位为毫秒)。

普通函数的用法

Date对象可以作为普通函数直接调用,返回一个代表当前时间的字符串。

即使带有参数,Date作为普通函数使用时,返回的还是当前时间。

无论有没有参数,直接调用Date总是返回当前时间。

构造函数的用法

Date还可以当作构造函数使用。对它使用new命令,会返回一个Date对象的实例。如果不加参数,实例代表的就是当前时间。

Date实例有一个独特的地方。其他对象求值的时候,都是默认调用.valueOf()方法,但是Date实例求值的时候,默认调用的是toString()方法。这导致对Date实例求值,返回的是一个字符串,代表该实例对应的时间。

作为构造函数时,Date对象可以接受多种格式的参数,返回一个该参数对应的时间实例。

关于Date构造函数的参数,

第一点,参数可以是负整数,代表1970年元旦之前的时间。

第二点,只要是能被Date.parse()方法解析的字符串,都可以当作参数。

第三,参数为年、月、日等多个整数时,年和月是不能省略的,其他参数都可以省略的。也就是说,这时至少需要两个参数,因为如果只使用“年”这一个参数,Date会将其解释为毫秒数。

各个参数的取值范围如下。

注意,月份从0开始计算,但是,天数从1开始计算。另外,除了日期的默认值为1,小时、分钟、秒钟和毫秒的默认值都是0。

这些参数如果超出了正常范围,会被自动折算。比如,如果月设为15,就折算为下一年的4月。

日期设为0,就代表上个月的最后一天。

参数还可以使用负数,表示扣去的时间。

日期的运算

类型自动转换时,Date实例如果转为数值,则等于对应的毫秒数;如果转为字符串,则等于对应的日期字符串。所以,两个日期实例对象进行减法运算时,返回的是它们间隔的毫秒数;进行加法运算时,返回的是两个字符串连接而成的新字符串。

静态方法

Date.now()

Date.now方法返回当前时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数,相当于 Unix 时间戳乘以1000。

Date.parse()

Date.parse方法用来解析日期字符串,返回该时间距离时间零点(1970年1月1日 00:00:00)的毫秒数。

日期字符串应该符合 RFC 2822 和 ISO 8061 这两个标准,即YYYY-MM-DDTHH:mm:ss.sssZ格式,其中最后的Z表示时区

如果解析失败,返回NaN。

Date.UTC()

Date.UTC方法接受年、月、日等变量作为参数,返回该时间距离时间零点(1970年1月1日 00:00:00 UTC)的毫秒数。

该方法的参数用法与Date构造函数完全一致,比如月从0开始计算,日期从1开始计算。区别在于Date.UTC方法的参数,会被解释为 UTC 时间(世界标准时间),Date构造函数的参数会被解释为当前时区的时间。

实例方法

Date的实例对象,有几十个自己的方法,除了valueOf和toString,可以分为以下三类。

Date.prototype.valueOf()

valueOf方法返回实例对象距离时间零点(1970年1月1日00:00:00 UTC)对应的毫秒数,该方法等同于getTime方法。

to 类方法

Date.prototype.toString()

toString方法返回一个完整的日期字符串。

Date.prototype.toUTCString()

toUTCString方法返回对应的 UTC 时间,也就是比北京时间晚8个小时。

Date.prototype.toISOString()

toISOString方法返回对应时间的 ISO8601 写法。

toISOString方法返回的总是 UTC 时区的时间。

Date.prototype.toJSON()

toJSON方法返回一个符合 JSON 格式的 ISO 日期字符串,与toISOString方法的返回结果完全相同。

Date.prototype.toDateString()

toDateString方法返回日期字符串(不含小时、分和秒)。

Date.prototype.toTimeString()

toTimeString方法返回时间字符串(不含年月日)。

Date.prototype.toLocaleDateString()

toLocaleDateString方法返回一个字符串,代表日期的当地写法(不含小时、分和秒)。

get类方法

Date对象提供了一系列get*方法,用来获取实例对象某个方面的值。

所有这些get*方法返回的都是整数,不同方法返回值的范围不一样。

上面这些get*方法返回的都是当前时区的时间,Date对象还提供了这些方法对应的 UTC 版本,用来返回 UTC 时间。

set 类方法

Date对象提供了一系列set*方法,用来设置实例对象的各个方面。

set*方法的参数都会自动折算。以setDate为例,如果参数超过当月的最大天数,则向下一个月顺延,如果参数是负数,表示从上个月的最后一天开始减去的天数。

set*系列方法除了setTime()和setYear(),都有对应的 UTC 版本,即设置 UTC 时区的时间。