博客
zyzcos.gitee.io
基本引用类型
基本概念:
引用值
:又称对象
,是某个特定引用类型
的实例
。引用类型
:又称对象定义
,引用类型描述了对象
的属性
和方法
。- 新对象通过
new
操作符后面跟一个构造函数
来创建。
let now = new Date();
注意:虽然
引用类型
有点像类
,但是和类
不是同一个概念。
5.1 Date
怎样使用?
let timeFormat = 2/12/2022;
let now = new Date(timeFormat);
可使用的timeFormat有多少种?
- 月/日/年
- 月名/日,年
- 周几 月名 日 年 时:分:秒 时区
- YYYY-MM-DDTHH:mm:ss:sssZ
5.1.1 继承的方法
以下所继承的方法,可能会因浏览器而有不同
- toLocaleString():返回日期时间
- toString():返回
带有时区
的日期时间 - valueOf():返回日期的毫秒表示
5.1.2 日期格式化方法
在
Date
类型中,有几个专门格式化日期
的方法,返回值都是字符串
- toDateString()显示日期中的周几、 月、 日、 年(格式特定于实现) ;
- toTimeString()显示日期中的时、 分、 秒和时区(格式特定于实现) ;
- toLocaleDateString()显示日期中的周几、 月、 日、 年(格式特定于实现和地区) ;
- toLocaleTimeString()显示日期中的时、 分、 秒(格式特定于实现和地区) ;
- toUTCString()显示完整的UTC日期(格式特定于实现) 。
5.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
RegExp用来支持
正则表达式
// 类似Perl的简洁语法创建
let expression1 = /pattern/flags;
// 上下两种定义方法是等效的
// RegExp语法创建
let expression2 = new RegExp(pattern,flags);
pattern就是
正则表达式
,而flags有什么值?
- g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
- i:不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写。
- m:多行模式,表示查找到一行文本末尾时会继续查找。
- y:粘附模式,表示只查找从lastIndex开始及之后的字符串。
- u:Unicode模式,启用Unicode匹配。
- s:dotAll模式,表示元字符.匹配任何字符(包括\n或\r)。
5.2.1 RegExp实例属性
每个
RegExp
实例都具有如下属性
:
- global:布尔值,表示是否设置了g标记。
- ignoreCase:布尔值,表示是否设置了i标记。
- unicode:布尔值,表示是否设置了u标记。
- sticky:布尔值,表示是否设置了y标记。
- lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从0开始。
- multiline:布尔值,表示是否设置了m标记。
- dotAll:布尔值,表示是否设置了s标记。
- source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。
- flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)。
5.2.2 RegExp实例方法
RegExp的实例方法主要是
exec()
;主要用于配合捕获组
使用。
let text = "cat, bat, sat, fat";
let pattern = new RegExp(/.at/,'g');
let results = pattern.exec(text);
console.log(results); // [ 'cat', index: 0, input: 'cat, bat, sat, fat', groups: undefined ]
results = pattern.exec(text);
console.log(results); // [ 'bat', index: 5, input: 'cat, bat, sat, fat', groups: undefined ]
results = pattern.exec(text);
console.log(results); // [ 'sat', index: 10, input: 'cat, bat, sat, fat', groups: undefined ]
对于
exec()
,如果找到了匹配项,则会返回包含第一个匹配信息
的数组
。反之则返回null
5.2.3 RegExp构造函数属性
在其他语言中,可以叫做
静态属性
。RegExp的静态属性有两种访问方式:全名访问
、简写访问
。
注意:这些
构造函数属性
,没有任何Web标准出处,所以不要在生产环境中使用。【好像已经弃用了】
let text = "this has been a short summer";
let pattern = /(.)hort/g;
if (pattern.test(text)) {
console.log(RegExp["$_"]); // 简写用法
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
}
静态属性
概括如下:
全名 | 简写 | 说明 |
input | $_ | 最后搜索的字符串 |
lastMatch | $& | 最后匹配的文本 |
lastParen | $+ | 最后匹配的捕获组 |
leftContext | $` | input字符串左边的文本 |
rightContext | $' | input字符串右边的文本 |
5.3 原始包装类型
ECMAScript提供3种特殊的引用类型:Boolean、Number和String。使其既有
引用类型特点
,又有原始类型的特殊行为
。
// 表面上:
let s1 = 'hello world';
let s2 = s1.substring(2);
console.log(s1);
console.log(s2);
为什么s1是原始值,但是可以使用
substring()
方法?
- 因为每次使用原始值的
方法
和属性
的时候,后台会创建一个对于的原始包装类型的对象,暴露原始值的操作方法,然后销毁对象。
// 实际上:
let s1 = 'hello world';
let s2 = s1.substring(2);
/* 后台中操作
let temp = new String(s1);
s2 = temp.substring(2);
temp = null;
*/
console.log(s1);
console.log(s2);
注意事项:
Number()
和new Number()
有什么区别?let value = "25"; let number = Number(value); // 转型函数 console.log(typeof number); // "number" let obj = new Number(value); // 构造函数 console.log(typeof obj); // "object"
原始值包装对象
都会转化为true
let falseObject = new Boolean(false); let result = falseObject && true; console.log(result); // 输出true
所以不推荐显示创建
原始值包装对象
,但是它们对于操作原始值的功能很重要。
5.3.1 Boolean
Boolean类型重写了
valueOf() toLocaleString() toString()
valueOf()
:返回对象表示的原始数值
- 其他两个返回
字符串表示
5.3.2 Number
Number与上面Boolean说的一样。
Number中一些方法:
方法 | 参数 | 说明 |
toFixed() | 一个参数:保留的小数点位数【会自动四舍五入】 | 返回包含指定小数点位数的数值字符串 |
toExponential() | 一个参数:表示结果中小数的位数 | 返回以科学记数法表示的数值字符串 |
toPrecision() | 一个参数:总位数(不包括指数) | 返回合理的数字 |
isInteger() | 一个参数:待判断的数值 | 判断是不是合理的整数,返回布尔值 |
5.3.3 String
String是对应字符串的应用类型,具有3个继承的方法:
valueOf()、toLocaleString()、toString()
,返回对象的原始字符串值。
关于字符编码的一些属性和方法:
length
属性表示字符串包含多少16位码元;JavaScript字符串由
16位码元
组成,每一个16位码元
对应一个字符。
注意:对于基本多语言平面(BMP)
而言,需要采用两个16位码元
来表达,又称为代理对
;charAt()
方法:返回给定索引位置
的字符
;charCodeAt()
方法:返回给定索引位置
的字符编码
;fromCharCode()
方法:返回给定的UTF-16编码字符
关于字符串的操作方法:
concat()
:用于字符串的拼接。let string1 = "Hello," console.log(string1.concat("world!")); // Hello,world!
slice(start[,end])
:返回 [start,end)之间的元素,将传入的负参数与字符串长度相加。let test = "hello world"; console.log(test.slice(3)); // lo world console.log(test.slice(-3)); // rld
subString(start[,length])
:返回从start开始,长度为length的字符串; 把所有的负值置为0;let test = "hello world"; console.log(test.substring(3)); // lo world console.log(test.substring(-1)); // hello world
关于字符位置的方法:
- indexOf(aimString[,startPosition]):
从前往后
找给定字符串,未找到则返回-1;let text = "hello world"; console.log(text.indexOf("o")); // 4 console.log(text.indexOf("o",6)); // 7
- lastIndexOf(aimString[,startPosition]):
从后往前
找给定字符串并返回位置,未找到则返回-1;let text = "hello world"; console.log(text.lastIndexOf("o")); // 7 console.log(text.lastIndexOf("o",6)); // 4
关于字符串包含的方法:
- startsWith(aimString[,startPosition]):判断是否以指定字符串开头;
- endsWith(aimString[,startPosition]):判断是否以指定字符串结尾;
- includes(aimString[,startPosition]):判断是否包括指定字符串;
关于字符串删除前后空格的方法
- trim():删除字符串前、后的空格符
- trimLeft():删除字符串前面的空格符
- trimRight():删除字符串后面的空格符
复制字符串
-
repeat(times):返回复制times次后的字符串。
let test = 'hello'; console.log( test.repeat(4) ); // hellohellohellohello
-
padStart(length[,charType]):复制
length
长度的字符串,如果长度不够,则在前面补充charType
;[默认为空格]let test = 'hello'; console.log(test.padStart(8,'.')); // ...hello
-
padEnd():同上,只不过改成在后面补充
字符串大小转换
- toLowerCase()、toUpperCase():分别为转化为小写、转化为大写
- toLocaleLowerCase()、toLocaleUpperCase():分别为转化为小写、转化为大写
两者的区别在于:后者会根据不同地方,进行特定的转换。
字符串模式匹配:
-
match():返回结果是
一个数组
,与RegExp
的exec()
返回的数组一样。所以用法也基本一样。let text = "cat bat sat fat"; let result = text.match(/at/g);
-
search():返回结果是
第一个匹配的位置索引
,使用方法与match()
一致。let text = "cat bat sat fat"; let result = text.match(/sat/); console.log(result); // 8
-
replace():返回一个
字符串副本
,第一个参数是被替换目标
:可以是正则表达式、也可以是字符串。第二个参数是替换字符串
;let text = "cat bat sat fat"; let result = text.replace(/at/,"ond"); // 只替换一个 console.log(result); // cond bat sat fat let result = text.replace(/at/g,"ond"); // 全部替换 console.log(result); // cond bond sond fond
对于replace而言,第二个参数可有
几个特殊的字符串序列
:
let text = "cat bat sat fat";
let result = text.replace(/(.at)/g,"word($1)");
console.log(result); // word(cat) word(bat) word(sat) word(fat)
字符串序列 | 替换的文本含义 |
$$ | $ |
$& | 匹配整个模式的子字符串。与RegExp.lastMatch相同 |
$' | 匹配的子字符串之前的字符串。与RegExp.rigthContext相同 |
$` | 匹配的字符串之后的字符串。与RegExp.leftContext相同 |
$n | 匹配第n个捕获组的字符串,n=0~9。如果没有捕获组则为空字符串 |
$nn | 匹配第n个捕获组的字符串,n=01~99。如果没有捕获组则为空字符串 |
关于字符串比较的方法:
- localeCompare():大于返回1、小于返回-1、等于返回0;
5.4 单例内置对象
5.4.1 Global
Global
是一个兜底对象,其实不存在于全局变量、全局函数,这些全局变量、全局函数都是Global
对象属性、方法。
Global
部分方法:
-
URL编码方法
-
eval()方法
Global
属性:
- undefined:特殊值undefined
- NaN: 特殊值NaN
- Infinity: 特殊值Infinity
- Object: Object的构造函数
- Array: Array的构造函数
- Function: Function的构造函数
- Boolean: Boolean的构造函数
- String: String的构造函数
- Number: Number的构造函数
- Date: Date的构造函数
- RegExp: RegExp的构造函数
- Symbol: Symbol的伪构造函数Error Error的构造函数
- EvalError: EvalError的构造函数
- RangeError: RangeError的构造函数
- ReferenceError: ReferenceError的构造函数
- SyntaxError: SyntaxError的构造函数
- TypeError: TypeError的构造函数
- URIError: URIError的构造函数
Global
对象的浏览器代理——window
对象【后面12章会详细讲解】
5.4.2 Math
Math对象,保存数学公式、信息和计算的地方。因为Math对象使用了JavaScript引擎中更高效的实现和处理指令,所以比直接在JavaScript中实现要
快得多
。
Math的属性
- Math.E: 自然对数的基数e的值
- Math.LN10: 10为底的自然对数
- Math.LN2: 2为底的自然对数
- Math.LOG2E: 以2为底e的对数
- Math.LOG10E: 以10为底e的对数
- Math.PI: π的值
- Math.SQRT1_2: 1/2的平方根
- Math.SQRT2: 2的平方根
Math的一些方法:
- Math.min()和max():返回参数中,最小、最大的值
- Math.ceil():
向上舍入
为最接近的整数 - Math.floor():
向下舍入
为最接近的整数 - Math.round():
四舍五入
- Math.fround():返回最接近
单精度(32位)浮点值
表示 - Math.random():返回一个[0,1)的随机数。
- Math.abs(x): 返回x的绝对值
- Math.exp(x): 返回Math.E的x次幂
- Math.expm1(x): 等于Math.exp(x) - 1
- Math.log(x): 返回x的自然对数
- Math.log1p(x): 等于1 + Math.log(x)
- Math.pow(x, power): 返回x的power次幂
- Math.hypot(…nums): 返回nums中每个数平方和的平方根
- Math.clz32(x): 返回32位整数x的前置零的数量Math.sign(x) 返回表示x符号的1、 0、 -0或-1
- Math.trunc(x): 返回x的整数部分, 删除所有小数
- Math.sqrt(x): 返回x的平方根
- Math.cbrt(x): 返回x的立方根
- Math.acos(x): 返回x的反余弦
- Math.acosh(x): 返回x的反双曲余弦
- Math.asin(x): 返回x的反正弦
- Math.asinh(x): 返回x的反双曲正弦
- Math.atan(x): 返回x的反正切
- Math.atanh(x): 返回x的反双曲正切
- Math.atan2(y, x): 返回y/x的反正切
- Math.cos(x): 返回x的余弦
- Math.sin(x): 返回x的正弦
- Math.tan(x):返回x的正切
的平方根
- Math.clz32(x): 返回32位整数x的前置零的数量Math.sign(x) 返回表示x符号的1、 0、 -0或-1
- Math.trunc(x): 返回x的整数部分, 删除所有小数
- Math.sqrt(x): 返回x的平方根
- Math.cbrt(x): 返回x的立方根
- Math.acos(x): 返回x的反余弦
- Math.acosh(x): 返回x的反双曲余弦
- Math.asin(x): 返回x的反正弦
- Math.asinh(x): 返回x的反双曲正弦
- Math.atan(x): 返回x的反正切
- Math.atanh(x): 返回x的反双曲正切
- Math.atan2(y, x): 返回y/x的反正切
- Math.cos(x): 返回x的余弦
- Math.sin(x): 返回x的正弦
- Math.tan(x):返回x的正切