05、基本引用类型
2023-09-25 18:17:39 0 举报
AI智能生成
JavaScript高级程序设计(第4版)第5章基本引用类型 笔记
作者其他创作
大纲/内容
Date
Date类型将日期保存为自协调世界时(UTC,Universal Time Coordinated)时间1970年1月1日午夜(零时)至今所经过的毫秒数
这种存储格式,Date类型可以精确表示1970年1月1日之前及之后285 616年的日期
创建日期对象:let now = new Date()
在不给Date构造函数传参数的情况下,创建的对象将保存当前日期和时间。要基于其他日期和时间创建日期对象,必须传入其毫秒表示
两个辅助方法:Date.parse()和Date.UTC()返回毫秒数
Date.parse()方法接收一个表示日期的字符串参数,返回该日期的毫秒数
日期格式
“月/日/年”,如"5/23/2019"
“月名日, 年”,如"May 23, 2019"
“周几月名日年时:分:秒时区”,如"Tue May 23 2019 00:00:00 GMT-0700"
ISO 8601扩展格式“YYYY-MM-DDTHH:mm:ss.sssZ”,如2019-05-23T00:00:00
如果直接把表示日期的字符串传给Date构造函数,那么Date会在后台调用Date.parse()
Date.UTC()方法也返回日期的毫秒表示
传给Date.UTC()的参数是年、零起点月数(1月是0,2月是1,以此类推)、日(1~31)、时(0~23)、分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为1日。其他参数的默认值都是0。
let y2k = new Date(Date.UTC(2000, 0))
let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55))
Date.UTC()也会被Date构造函数隐式调用,但有一个区别:这种情况下创建的是本地日期,不是GMT日期。不过Date构造函数跟Date.UTC()接收的参数是一样的
Date.now()方法,返回表示方法执行时日期和时间的毫秒数
继承的方法
Date类型重写了toLocaleString()、toString()和valueOf()方法
Date类型的toLocaleString()方法返回与浏览器运行的本地环境一致的日期和时间
toString()方法通常返回带时区信息的日期和时间,而时间也是以24小时制(0~23)表示的。
Date类型的valueOf()方法被重写后返回的是日期的毫秒表示,因此,操作符(如小于号和大于号)可以直接使用它返回的值
日期格式化方法:返回字符串
toDateString()显示日期中的周几、月、日、年(格式特定于实现)
toTimeString()显示日期中的时、分、秒和时区(格式特定于实现)
toLocaleDateString()显示日期中的周几、月、日、年(格式特定于实现和地区)
toLocaleTimeString()显示日期中的时、分、秒(格式特定于实现和地区)
toUTCString()显示完整的UTC日期(格式特定于实现)
这些方法的输出与toLocaleString()和toString()一样,会因浏览器而异。因此不能用于在用户界面上一致地显示日期
日期/时间组件方法
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,进入夏令时的地区可能有所差异
RegExp
字面量定义:let expression = /pattern/flags;
每个正则表达式可以带零个或多个flags(标记),用于控制正则表达式的行为
匹配模式的标记
g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
i:不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写
m:多行模式,表示查找到一行文本末尾时会继续查找。
y:粘附模式,表示只查找从lastIndex开始及之后的字符串
u:Unicode模式,启用Unicode匹配
s:dotAll模式,表示元字符.匹配任何字符(包括\n或\r)
元字符
( [ { \ ^ $ | ) ] } ? * + .
要匹配上面这些字符本身,就必须使用反斜杠来转义
任何使用字面量定义的正则表达式也可以通过构造函数来创建
let pattern2 = new RegExp("[bc]at", "i")
RegExp构造函数的两个参数都是字符串。因为RegExp的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符序列,如\n(\转义后的字符串是\\,在正则表达式字符串中则要写成\\\\)
RegExp实例属性
global:布尔值,表示是否设置了g标记
ignoreCase:布尔值,表示是否设置了i标记
unicode:布尔值,表示是否设置了u标记
sticky:布尔值,表示是否设置了y标记
lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从0开始
multiline:布尔值,表示是否设置了m标记
dotAll:布尔值,表示是否设置了s标记
source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠
flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)
RegExp实例方法
exec(),主要用于配合捕获组使用
只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null
返回的数组虽然是Array的实例,但包含两个额外的属性:index和input。index是字符串中匹配模式的起始位置,input是要查找的字符串
这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素
模式如果没有设置全局标记,因此调用exec()只返回第一个匹配项。lastIndex在非全局模式下始终不变。
如果模式设置了粘附标记y,则每次调用exec()就只会在lastIndex的位置上寻找匹配项。粘附标记覆盖全局标记
test(),接收一个字符串参数。如果输入的文本与模式匹配,则参数返回true,否则返回false。
无论正则表达式是怎么创建的,继承的方法toLocaleString()和toString()都返回正则表达式的字面量表示
RegExp构造函数属性
通过两种不同的方式访问它们(每个属性都有一个全名和一个简写)
input ($_)最后搜索的字符串(非标准特性)
lastMatch($&)最后匹配的文本
lastParen$+ 最后匹配的捕获组(非标准特性)
leftContext($`) input字符串中出现在lastMatch前面的文本
rightContext($') input字符串中出现在lastMatch后面的文本
RegExp还有其他几个构造函数属性,可以存储最多9个捕获组的匹配项。这些属性通过RegExp. $1~RegExp.$9来访问,分别包含第1~9个捕获组的匹配项。在调用exec()或test()时,这些属性就会被填充
原始值包装类型
3种特殊的引用类型:Boolean、Number和String。
每当用到某个原始值的方法或属性时,后台都会创建一个相应原始包装类型的对象,从而暴露出操作原始值的各种方法
创建一个类型的实例
调用实例上的特定方法
销毁实例
引用类型与原始值包装类型的主要区别在于对象的生命周期。在通过new实例化引用类型后,得到的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。这意味着不能在运行时给原始值添加属性和方法
Object构造函数作为一个工厂方法,能够根据传入值的类型返回相应原始值包装类型的实例
如果传给Object的是字符串,则会创建一个String的实例。如果是数值,则会创建Number的实例。布尔值则会得到Boolean的实例
Boolean
要创建一个Boolean对象,就使用Boolean构造函数并传入true或false
Boolean的实例会重写valueOf()方法,返回一个原始值true或false。toString()方法被调用时也会被覆盖,返回字符串"true"或"false"。
Number
要创建一个Number对象,就使用Number构造函数并传入一个数值
Number类型重写了valueOf()、toLocaleString()和toString()方法。valueOf()方法返回Number对象表示的原始数值,另外两个方法返回数值字符串。toString()方法可选地接收一个表示基数的参数,并返回相应基数形式的数值字符串
toFixed()方法返回包含指定小数点位数的数值字符串
toExponential(),返回以科学记数法(也称为指数记数法)表示的数值字符串。
toPrecision()方法会根据情况返回最合理的输出结果,可能是固定长度,也可能是科学记数法形式。这个方法接收一个参数,表示结果中数字的总位数(不包含指数)
Number.isInteger()方法,用于辨别一个数值是否保存为整数,返回true或false
IEEE 754数值格式有一个特殊的数值范围,在这个范围内二进制值可以表示一个整数值。这个数值范围从Number.MIN_SAFE_INTEGER(253 + 1)到Number.MAX_SAFE_INTEGER(253 1)。对超出这个范围的数值,即使尝试保存为整数。为了鉴别整数是否在这个范围内,可以使用Number.isSafeInteger()方法
String
要创建一个String对象,使用String构造函数并传入一个字符串
String对象的方法可以在所有字符串原始值上调用。3个继承的方法valueOf()、toLocaleString()和toString()都返回对象的原始字符串值
每个String对象都有一个length属性,表示字符串中字符的数量(按单字符来计数)
每16位码元对应一个字符,字符串的length属性表示字符串包含多少16位码元
charAt()方法返回给定索引位置的字符,由传给方法的整数参数指定。这个方法查找指定索引位置的16位码元,并返回该码元对应的字符
使用charCodeAt()方法可以查看指定码元的字符编码。这个方法返回指定索引位置的码元值,索引以整数指定
fromCharCode()方法用于根据给定的UTF-16码元创建字符串中的字符。这个方法可以接受任意多个数值,并返回将所有数值对应的字符拼接起来的字符串
String.fromCharCode(0x61, 0x62, 0x63, 0x64, 0x65); // "abcde"
JavaScript字符串使用了两种Unicode编码混合的策略:UCS-2和UTF-16。对于U+0000~U+FFFF范围内的字符,length、charAt()、charCodeAt()和fromCharCode()返回的结果都跟预期是一样的
为正确解析既包含单码元字符又包含代理对字符的字符串,可以使用codePointAt()来代替charCodeAt()
fromCharCode()也有一个对应的fromCodePoint()。这个方法接收任意数量的码点,返回对应字符拼接起来的字符串
字符串操作方法
concat(),用于将一个或多个字符串拼接成一个新字符串,原值保持不变
对于拼接多个字符串来说,使用加号更方便
从字符串中提取子字符串的方法:slice()、substr()和substring()。这3个方法都返回调用它们的字符串的一个子字符串,而且都接收一或两个参数。第一个参数表示子字符串开始的位置,第二个参数表示子字符串结束的位置
对slice()和substring()而言,第二个参数是提取结束的位置(即该位置之前的字符会被提取出来)。对substr()而言,第二个参数表示返回的子字符串数量。
任何情况下,省略第二个参数都意味着提取到字符串末尾。
不会修改调用它们的字符串,而只会返回提取到的原始新字符串值
当某个参数是负值时
slice()方法将所有负值参数都当成字符串长度加上负参数值
substr()方法将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换为0。
substring()方法会将所有负参数值都转换为0。这个方法会将较小的参数作为起点,将较大的参数作为终点
在字符串中定位子字符串:indexOf()和lastIndexOf()
这两个方法从字符串中搜索传入的字符串,并返回位置(如果没找到,则返回-1)
indexOf()方法从字符串开头开始查找子字符串
lastIndexOf()方法从字符串末尾开始查找子字符串
这两个方法都可以接收可选的第二个参数,表示开始搜索的位置
字符串包含方法:用于判断字符串中是否包含另一个字符串的方法
startsWith()检查开始于索引0的匹配项
endsWith()检查开始于索引(string.length - substring.length)的匹配项
includes()检查整个字符串
startsWith()和includes()方法接收可选的第二个参数,表示开始搜索的位置。如果传入第二个参数,则意味着这两个方法会从指定位置向着字符串末尾搜索,忽略该位置之前的所有字符
endsWith()方法接收可选的第二个参数,表示应该当作字符串末尾的位置。如果不提供这个参数,那么默认就是字符串长度。如果提供这个参数,那么就好像字符串只有那么多字符一样
trim()方法
这个方法会创建字符串的一个副本,删除前、后所有空格符,再返回结果
trimLeft()和trimRight()方法分别用于从字符串开始和末尾清理空格符
repeat()方法
这个方法接收一个整数参数,表示要将字符串复制多少次,然后返回拼接所有副本后的结果
padStart()和padEnd()方法会复制字符串,如果小于指定长度,则在相应一边填充字符,直至满足长度条件。这两个方法的第一个参数是长度,第二个参数是可选的填充字符串,默认为空格
可选的第二个参数并不限于一个字符。如果提供了多个字符的字符串,则会将其拼接并截断以匹配指定长度。
如果长度小于或等于字符串长度,则会返回原始字符串
字符串迭代与解构
字符串的原型上暴露了一个@@iterator方法,表示可以迭代字符串的每个字符
字符串大小写转换
toLowerCase()、toLocaleLowerCase()、toUpperCase()和toLocaleUpperCase()
toLocaleLowerCase()和toLocaleUpperCase()方法旨在基于特定地区实现
字符串模式匹配方法
match()方法
这个方法本质上跟RegExp对象的exec()方法相同。match()方法接收一个参数,可以是一个正则表达式字符串,也可以是一个RegExp对象
match()方法返回的数组与RegExp对象的exec()方法返回的数组是一样的:第一个元素是与整个模式匹配的字符串,其余元素则是与表达式中的捕获组匹配的字符串(如果有的话)
search()
唯一的参数与match()方法一样:正则表达式字符串或RegExp对象
方法返回模式第一个匹配的位置索引,如果没找到则返回1
replace()方法
这个方法接收两个参数,第一个参数可以是一个RegExp对象或一个字符串(这个字符串不会转换为正则表达式),第二个参数可以是一个字符串或一个函数。
如果第一个参数是字符串,那么只会替换第一个子字符串。要想替换所有子字符串,第一个参数必须为正则表达式并且带全局标记
第二个参数是字符串的情况下,有几个特殊的字符序列,可以用来插入正则表达式操作的值
$$ $
$& 匹配整个模式的子字符串。与RegExp.lastMatch相同
$' 匹配的子字符串之前的字符串。与RegExp.rightContext相同
$` 匹配的子字符串之后的字符串。与RegExp.leftContext相同
$n匹配第n个捕获组的字符串,其中n是0~9。比如,$1是匹配第一个捕获组的字符串,如果没有捕获组,则值为空字符串
replace()的第二个参数可以是一个函数。在只有一个匹配项时,这个函数会收到3个参数:与整个模式匹配的字符串、匹配项在字符串中的开始位置,以及整个字符串。在有多个捕获组的情况下,每个匹配捕获组的字符串也会作为参数传给这个函数,但最后两个参数还是与整个模式匹配的开始位置和原始字符串。这个函数应该返回一个字符串,表示应该把匹配项替换成什么。
split()
这个方法会根据传入的分隔符将字符串拆分成数组
作为分隔符的参数可以是字符串,也可以是RegExp对象
还可以传入第二个参数,即数组大小,确保返回的数组不会超过指定大小
localeCompare()方法
这个方法比较两个字符串,返回如下-1,0,1值中的一个
如果按照字母表顺序,字符串应该排在字符串参数前头,则返回负值。
如果字符串与字符串参数相等,则返回0
如果按照字母表顺序,字符串应该排在字符串参数后头,则返回正值。
单例内置对象
Global
代码不会显式地访问它
在全局作用域中定义的变量和函数都会变成Global对象的属性
URL编码方法
encodeURI()和encodeURIComponent()方法用于编码统一资源标识符(URI),以便传给浏览器。有效的URI不能包含某些字符,比如空格
ecnodeURI()方法用于对整个URI进行编码。encodeURIComponent()方法用于编码URI中单独的组件
encodeURI()不会编码属于URL组件的特殊字符,比如冒号、斜杠、问号、井号,而encodeURIComponent()会编码它发现的所有非标准字符
decodeURI()只对使用encodeURI()编码过的字符解码
decodeURIComponent()解码所有被encodeURIComponent()编码的字符,基本上就是解码所有特殊值
eval()方法
这个方法就是一个完整的ECMAScript解释器,它接收一个参数,即一个要执行的ECMAScript(JavaScript)字符串
当解释器发现eval()调用时,会将参数解释为实际的ECMAScript语句,然后将其插入到该位置。通过eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的作用域链。
通过eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在一个字符串中的。它们只是在eval()执行的时候才会被创建。
在严格模式下,在eval()内部创建的变量和函数无法被外部访问。
浏览器将window对象实现为Global对象的代理
获取Global对象的方式
let global = function() { return this; }();
Math
Math对象属性
Math.E 自然对数的基数e的值
Math.LN10 10为底的自然对数
Math.LN2 2为底的自然对数
Math.LOG2E 以2为底e的对数
Math.LOG10 E以10为底e的对数
Math.PI π的值
Math.SQRT1_2 1/2的平方根
Math.SQRT2 2的平方根
min()和max()方法用于确定一组数值中的最小值和最大值。这两个方法都接收任意多个参数
舍入方法
Math.ceil()方法始终向上舍入为最接近的整数
Math.floor()方法始终向下舍入为最接近的整数
Math.round()方法执行四舍五入
Math.fround()方法返回数值最接近的单精度(32位)浮点值表示
Math.random()方法返回一个0~1范围内的随机数,其中包含0但不包含1
0 条评论
下一页