《JavaScript高级程序设计》- 第五章:基本引用类型

博客

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);

注意事项:

  1. 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"
    
  2. 原始值包装对象都会转化为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(),返回对象的原始字符串值。

关于字符编码的一些属性和方法:

  1. length属性表示字符串包含多少16位码元;

    JavaScript字符串由16位码元组成,每一个16位码元对应一个字符。

    注意:对于基本多语言平面(BMP)而言,需要采用两个16位码元来表达,又称为代理对;

  2. charAt()方法:返回给定索引位置字符;
  3. charCodeAt()方法:返回给定索引位置字符编码;
  4. fromCharCode()方法:返回给定的UTF-16编码字符

关于字符串的操作方法:

  1. concat():用于字符串的拼接。
      let string1 = "Hello,"
      console.log(string1.concat("world!"));  // Hello,world!
    
  2. slice(start[,end]):返回 [start,end)之间的元素,将传入的负参数与字符串长度相加。
      let test = "hello world";
      console.log(test.slice(3));   // lo world
      console.log(test.slice(-3));  // rld
    
  3. subString(start[,length]):返回从start开始,长度为length的字符串; 把所有的负值置为0;
      let test = "hello world";
      console.log(test.substring(3));    // lo world
      console.log(test.substring(-1));    // hello world
    

关于字符位置的方法:

  1. indexOf(aimString[,startPosition]):从前往后找给定字符串,未找到则返回-1;
      let text = "hello world";
      console.log(text.indexOf("o")); // 4
      console.log(text.indexOf("o",6)); // 7
    
  2. lastIndexOf(aimString[,startPosition]):从后往前找给定字符串并返回位置,未找到则返回-1;
      let text = "hello world";
      console.log(text.lastIndexOf("o")); // 7
      console.log(text.lastIndexOf("o",6)); // 4
    

关于字符串包含的方法:

  1. startsWith(aimString[,startPosition]):判断是否以指定字符串开头;
  2. endsWith(aimString[,startPosition]):判断是否以指定字符串结尾;
  3. includes(aimString[,startPosition]):判断是否包括指定字符串;

关于字符串删除前后空格的方法

  1. trim():删除字符串前、后的空格符
  2. trimLeft():删除字符串前面的空格符
  3. trimRight():删除字符串后面的空格符

复制字符串

  1. repeat(times):返回复制times次后的字符串。

      let test = 'hello';
      console.log( test.repeat(4) );  // hellohellohellohello
    
  2. padStart(length[,charType]):复制length长度的字符串,如果长度不够,则在前面补充charType;[默认为空格]

      let test = 'hello';
      console.log(test.padStart(8,'.'));    // ...hello
    
  3. padEnd():同上,只不过改成在后面补充

字符串大小转换

  1. toLowerCase()、toUpperCase():分别为转化为小写、转化为大写
  2. toLocaleLowerCase()、toLocaleUpperCase():分别为转化为小写、转化为大写

两者的区别在于:后者会根据不同地方,进行特定的转换。

字符串模式匹配:

  1. match():返回结果是一个数组,与RegExpexec()返回的数组一样。所以用法也基本一样。

      let text = "cat bat sat fat";
      let result = text.match(/at/g);
    
  2. search():返回结果是第一个匹配的位置索引,使用方法与match()一致。

      let text = "cat bat sat fat";
      let result = text.match(/sat/); 
      console.log(result);  // 8
    
  3. 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。如果没有捕获组则为空字符串

关于字符串比较的方法:

  1. localeCompare():大于返回1、小于返回-1、等于返回0;

5.4 单例内置对象

5.4.1 Global

Global是一个兜底对象,其实不存在于全局变量、全局函数,这些全局变量、全局函数都是Global对象属性、方法。

Global部分方法:

  1. URL编码方法

  2. 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的正切
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值