5.引用类型
引用值(或者对象)是某个特定**引用类型**的实例,在js中 引用类型是吧数据和功能组织到一起的结构,
对象被认为是摸个特定引用类型的**实例**,新对象通过使用new操作符后跟一个构造函数来创建.后遭函数就是用来创建新对象的函数;
Date
Date.parse(),Date.UTC() Date.now()
1.1 继承的方法
Date 类型重写了 toLocaleString()、toString()和 valueOf()方法。
toLocaleString() - 2/1/2019 12:00:00 AM
toString() - Thu Feb 1 2019 00:00:00 GMT-0800 (Pacific Standard Time)
Date 类型的 valueOf()方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。
let date1 = new Date(2019, 0, 1); // 2019 年 1 月 1 日
let date2 = new Date(2019, 1, 1); // 2019 年 2 月 1 日
console.log(date1 < date2); // true
console.log(date1 > date2); // false
1.2日期格式化方法
Date 类型有几个专门用于格式化日期的方法,它们都会返回字符串:
toDateString()显示日期中的周几、月、日、年(格式特定于实现);
toTimeString()显示日期中的时、分、秒和时区(格式特定于实现);
toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区);
toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区);
toUTCString()显示完整的 UTC 日期(格式特定于实现)。
1.3日期/时间组件方法
方 法 说 明
getTime() 返回日期的毫秒表示;与 valueOf()相同
setTime(milliseconds) 设置日期的毫秒表示,从而修改整个日期
getFullYear() 返回 4 位数年(即 2019 而不是 19)
getUTCFullYear() 返回 UTC 日期的 4 位数年
setFullYear(year) 设置日期的年(year 必须是 4 位数)
setUTCFullYear(year) 设置 UTC 日期的年(year 必须是 4 位数)
getMonth() 返回日期的月(0 表示 1 月,11 表示 12 月)
getUTCMonth() 返回 UTC 日期的月(0 表示 1 月,11 表示 12 月)
setMonth(month) 设置日期的月(month 为大于 0 的数值,大于 11 加年)
setUTCMonth(month) 设置 UTC 日期的月(month 为大于 0 的数值,大于 11 加年)
getDate() 返回日期中的日(1~31)
getUTCDate() 返回 UTC 日期中的日(1~31)
setDate(date) 设置日期中的日(如果 date 大于该月天数,则加月)
setUTCDate(date) 设置 UTC 日期中的日(如果 date 大于该月天数,则加月)
getDay() 返回日期中表示周几的数值(0 表示周日,6 表示周六)
getUTCDay() 返回 UTC 日期中表示周几的数值(0 表示周日,6 表示周六)
getHours() 返回日期中的时(0~23)
getUTCHours() 返回 UTC 日期中的时(0~23)
setHours(hours) 设置日期中的时(如果 hours 大于 23,则加日)
setUTCHours(hours) 设置 UTC 日期中的时(如果 hours 大于 23,则加日)
getMinutes() 返回日期中的分(0~59)
getUTCMinutes() 返回 UTC 日期中的分(0~59)
setMinutes(minutes) 设置日期中的分(如果 minutes 大于 59,则加时)
setUTCMinutes(minutes) 设置 UTC 日期中的分(如果 minutes 大于 59,则加时)
getSeconds() 返回日期中的秒(0~59)
getUTCSeconds() 返回 UTC 日期中的秒(0~59)
setSeconds(seconds) 设置日期中的秒(如果 seconds 大于 59,则加分)
setUTCSeconds(seconds) 设置 UTC 日期中的秒(如果 seconds 大于 59,则加分)
getMilliseconds() 返回日期中的毫秒
getUTCMilliseconds() 返回 UTC 日期中的毫秒
setMilliseconds(milliseconds) 设置日期中的毫秒
setUTCMilliseconds(milliseconds) 设置 UTC 日期中的毫秒
getTimezoneOffset() 返回以分钟计的 UTC 与本地时区的偏移量(如美国 EST 即“东部标准时间”
返回 300,进入夏令时的地区可能有所差异)
5.2 RegExp
js通过RegExp类型支持正则表达式.正则表达式使用类似Perl的简洁语法来创建.
g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束.
i:不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写.
m:多行模式,表示查找到一行文本末尾时会继续查找.
y:粘附模式,表示值查找从lastindex开始之后的字符串.
u:Unicode模式.启用Unicode模式
s:dotAll模式,表示元字符,匹配任何字符(包括\n \r)
// 匹配第一个"bat"或"cat",忽略大小写
let pattern1 = /[bc]at/i;
// 跟 pattern1 一样,只不过是用构造函数创建的
let pattern2 = new RegExp("[bc]at", "i");//两种写法一样
5.2.1 RegExp实例属性
每个RegExp实例都有夏雷属性.提供有关模式的各方面信息.
global:布尔值,表示是否设置了 g 标记。
ignoreCase:布尔值,表示是否设置了 i 标记。
unicode:布尔值,表示是否设置了 u 标记。
sticky:布尔值,表示是否设置了 y 标记。
lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。
multiline:布尔值,表示是否设置了 m 标记。
dotAll:布尔值,表示是否设置了 s 标记。
source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的
斜杠。
flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没
有前后斜杠)。
5.2.2RegExp实例方法
RegExp实例的主要方法是exec(),主要用于配合捕获组使用,这个方法只接受一个参数,即要应用模式的字符串,如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没有找到匹配项,则返回null.返回的数组虽然是Array的实例,但包含两个额外的属性,index和input,index是字符串中匹配模式的起始位置,input是要查找的字符串,这个数组的第一元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串,如果模式中没有捕获组,则数组只包含一个元素,
exec()方法 调用的时候按顺序返回符合的index第二次调用会从下个index开始
test() 接受一个字符串参数,如果输入的文本与模式匹配.则参数返回true,否则false一般用作判断.
5.2.3 RegExp构造函数属性
input $_ 最后搜索的字符串(非标准特性)
lastMatch $& 最后匹配的文本
lastParen $+ 最后匹配的捕获组(非标准特性)
leftContext $` input 字符串中出现在 lastMatch 前面的文本
rightContext $' input 字符串中出现在 lastMatch 后面的文本
通过这些属性可以提取出与 exec()和 test()执行的操作相关的信息。来看下面的例子:
let text = "this has been a short summer";
let pattern = /(.)hort/g;
if (pattern.test(text)) {
console.log(RegExp.input); // this has been a short summer
console.log(RegExp.leftContext); // this has been a
console.log(RegExp.rightContext); // summer
console.log(RegExp.lastMatch); // short
console.log(RegExp.lastParen); // s
}
5.4单例内置对象
ECMAScript对内置对象的定义是"任何有ECMAScript实现提供,与宿主环境无关,并在ECMAScript程序开始执行时就存在的对象"这就意味着,开发者不用显示的实例化内置对象.因为他们已经实例化好了,前面我们已经解除了大部分内置对象,包括Object,Array,和String 本章介绍Global和Math
5,4,1Global
Global对象是ECMAScript中最特别的对象因为代码不会显示的访问他,ECMAScript规定Global对象为一种兜底对象,它所针对的是不属于任何对象的属性和方法.事实上,不存在全局变量或全局函数这种东西.在全局作用域中定义的变量和函数都会变成Global对象的属性,前面介绍的函数,包括isNaN(),isFinite().parseInt()和parseFloat()实际上都是Global对象的方法,除了这些Global还有一些别的方法
1URL编码方法
2eval() 这个方法是一个完整的ECMAScript解释器,他接受一个参数,即一个要执行的ECMAScript字符串. 并且没有块级作用域这个限制
3Global对象属性 Global对象有很多属性,其中一些前面已经提到过了.像undefined,NaN和Infinity等特殊值都是Global对象的属性.此外所有原生引用类型构造函数.比如Object和Function也都是Global对象的属性
4window对象 虽然ECMAScript没有规定直接访问Global对象的方式,但浏览器将window对象时限为Global对象的代理,因此,所有全局作用域中声明的变量和函数都变成了window的属性.
5.4.2 Math
ECMAScript提供了Math对象座位保存数据额共识.信息和计算的地方.Math对象提供了一些辅助计算属性和方法.
Math对象上提供了计算要比直接在js实现的快得多,因为Math对象上的计算使用了js引擎中更高效的实现和处理器指令.但使用Math计算的问题是精度会因浏览器,操作系统,指令集和硬件而异;
1Math对象属性
2min()和max()方法 取数组内最大最小值
3舍入方法 Math.ceil()、Math.floor()、Math.round()和 Math.fround()。
4random()方法 包含0而不包含1的随机数
5.5小结
js中的对象称为引用值.几种内置的引用类型可用于创建特定类型的对象.
引用值与传统面向对象编程语言中的类相似.但实现不同
Date类型提供关于日期和时间的信息.包括当前日期,时间及相关计算
RegExp类型是ECMAScript支持正则表达式的接口.提供了大多数基础的和部分高级的正则表达式功能.
js比较独特的一点是,函数实际上是Function类型的实例,也就是说函数也是对象.因为韩束也是对象.所以函数也有方法.可用于增强其能力.
由于原始值包装类型的存在,js中的原始值可以被当成对象来使用,有三种原始值包装类型Boolean Number和String 他们都具备如下特点
每种包装类型都映射到同名的原始类型
以读模式访问原始值时,后台会实例化一个原始值包装类型的对象,借助这个对象可以操作相应的数据.
涉及原始值的语句执行完毕后,包装对象就会被销毁.
当代码开始执行时.全局上下文中会存在两个内置对象:Global和Math,七中Global对象在大多数ECAMScript视线中无法直接访问.不过浏览器将其实现为window对象,所有全局变量和函数都是Global对象的属性,Math对象包含辅助完成复杂计算的属性和方法.