JavaScript红宝书第5章:基本引用类型

简介: 基本引用类型

引用类型是什么?


引用类型又称复杂数据类型,展开就是某个特定引用类型的实例。实例又称为对象,对象通过new操作符后跟一个构造函数来创建,构造函数就是用来创建新对象的函数,例:


let obj=new Object();//普通引用类型
let dat=new Date();//日期引用类型
let reg=new RegExp(/hello/);//正则引用类型
let boo=new Boolean(true);//布尔特殊引用类型
let str=new String('string');//字符特殊引用类型
let num=new Number(100);//数字特殊引用类型


接下来我们展开讲解一下这几个引用类型是语法格式,使用场景,和需要注意的部分。


Date


Date类型早期是参考了Java的java.util.Date,它可以表示一个具体的日期。


创建日期对象:


let dat=new Date();//Thu Sep 28 2023 10:10:52 GMT+0800 (中国标准时间)


常用方法


Date.parse()


这个方法主要作用就是用来判断输入的内容来转换Date对象,比如:

let dat1=new Date(Date.parse("5/23/1990"))//月/日/年
let dat2=new Date(Date.parse("May 5,2019"))//月名 日,年
let dat3=new Date(Date.parse("Tue May 23 2019 00:00:00 GMT-0700"))
//周几 月名 日 年 时:分:秒 时区



同时如果传给Date.parse的不是一个日期,那么就会返回一个Invalid Date 翻译就是无效的日期。


Date.UTC()


UTC和parse返回的参数相同,但是UTC中输入的参数只有年和月是必需的,剩余的可以加也可以不加,月如果是0的话,默认为1。举例:

let dat=new Date(Date.UTC(2000,0))
console.log(dat);



Date.now()


Date.now()就是返回当前时间,举个例子,我们想知道这个函数从开始到结束,需要用到多长时间,可以用Date.now得到这个值。

function Times(){
  return 0;
}
let start=Date.now()
Times()
let stop=Date.now()
let ans=stop-start
console.log(stop-start);



因为这个函数比较简单,所以占用时间甚至不超过1毫秒,所以stop-start等于0.但如果是较难的就会发现。


剩余Date方法简述


toLocalleString和toString方法


toString返回的是包含时区的日期和时间,而toLocalString会返回于浏览器运行的本地环境一致的日期和时间,不包含日期和时间。


getTime、getFullYear、getDate、getMonth方法


getTime和valueof相等,返回一个Date对象的毫秒数。


getFullYear返回年,getDate返回日,getMonth返回月。

const dat = new Date();
const date=dat.getFullYear()+'-'+dat.getMonth()+'-'+dat.getDate()
console.log(date); // 2023-8-28
// Expected output: 8


getMonth因为是从0算起,所以它默认需要进行一个+1操作,才能实现正确数据,同时这个问题是Js存在的问题。


RegExp


正则 与字符串方法search replace split match


ES通过RegExp类型支持正则表达式,创建语法格式:

let reg=/pattern/flags;
let reg=new RegExp(/pattern/)



就比如我们想校验某个字符串里面hello在什么位置,可以调用search方法和正则表达式实现。


let a='abcdhello'
console.log(a.search(/hello/))//4


如果想替换这个字符,可以用replace加这个正则表达式

let a='adhellofafdhello'
while(a.search(/hello/)!=-1){
  a=a.replace(/hello/,'Tom')
}
console.log(a);//adTomfafdTom



在上述代码中,我们想实现替换的操作,search+while进行查询是否还有hello这个字符串,没有search就返回-1。用replace方法实现了hello替换。

也可以通过全局替换/g来进行一个实现。

console.log(reg.replace(/hello/g,'Tom'));


利用split+正则可以实现去除字符和切割的效果


举例:想要去掉某个字符串的所有d字符,后重新拼接在一起。

let reg='abchelloasdasdhelloasd'
let temp=reg.split(/d/)
let ans=''
for(let i=0;i<temp.length;i++){
  ans+=temp[i]
}
console.log(ans);//abchelloasashelloas



在上述代码中,有reg作为字符串变量,我们通过调用split+正则,去把d进行一个切割,然后又用ans+for进行一个拼接操作。


那如果我们想知道这个字符串中到底有多少个d,就可以通过match方法进行查询。

console.log('abchelloasdasdhelloasd'.match(/hello/g).length);//2


正则方法 test exec


let a=new RegExp(/hello/)
console.log(a.test('abchello'));//true
console.log(a.exec('abcdhello'));//['hello', index: 4, input: 'abcdhello', groups: undefined]


在上述代码中,我们首先调用了这个test,test主要是用于判断,这个字符串有没有正则表达式里面的子字符串,有就true,没有就false。


exec方法主要是用于提取第一个正则表达式中的值和所在索引,同时也会返回它的初始值。但是不管这个正则表达式有没有加上全局属性/g,它都只会返回第一个属性值和索引值。多出来的不会返回。




包装对象(Boolean、Number、String)


那么好,在基本数据类型中,有这三种数据类型,可以被new出来,那new出来的数据类型,就变成了包装对象类型,它们也可以调用对应的方法进行使用。同时通过new出来的这三个属性可以被添加新的属性和方法,这也被称为特殊引用类型。


let str1='ddd'
let str2=new String()
str2.color='red'
str1.color='blue'
console.log(str2,str1);//String {'', color: 'red'} 'ddd'
console.log(str2.color,str1.color);//red undefined



在上述代码中可以发现,没有new出来的原始值是无法进行添加属性方法的操作的,new出来的就可以实现,new出来的就变成了包装对象类型也叫特殊引用类型。


这些new出来的特殊引用类型,需要在它们的构造函数里面进行初始值填写,也就是()里面,就比如let boo=new Boolean(true).接下来我们就对这三个特殊引用对象,进行一一的讲解。


Boolean


语法格式:

let boo=new Boolean()


因为所有对象在布尔表达式当中都为true,作为特殊引用类型的Boolean类型也不例外,所以就会出现这样滑稽的一幕。

let boo=new Boolean(false)
let result=boo&&true
console.log(result);//true


除了布尔表达式有问题之外,Boolean实例会重写valueOf方法,toString方法被调用也会被覆盖,同时在进行类型判断的时候大多数的判断结果都是object而不是boolean,所以不建议使用Boolean对象来进行开发。


Number

语法格式

let num=new Number(10)



Number也重写了toString、valueOf方法,它的参数值,主要是用于进制的转换。

let num=new Number(16)
console.log(num.toString(2));//1000
console.log(num.toString(8));//20
console.log(num.toString(16));//10
console.log(num.toString(7));//22
console.log(num,num.valueOf());//Number {16} 16


如果想将数字转换成字符串,number对象类型也提供了toFixed方法,这个方法不仅能转换,还能包含指定小数点位数的数值字符串。


console.log(num.toFixed(10),typeof(num.toFixed(10)));//16.0000000000 string


它还有toExponential,toPrecisionisInteger方法等等,不常用,这里就不赘述了。


String


语法格式:

let str=new String('content')



简述valueOf,toString,toLocalSting,charAt,concat,slice,substr,substring


valueOf,toString,toLocalString这三个方法都能够返回String对象的原始值。

同时它也有length属性,用于判断它当前的长度。可以利用charAt方法来进行输入索引输出索引下的值。js字符串是由16位码元组成。通过charCodeAt方法可以查看指定码元下.拼接字符串用到concat,同时concat可以一次拼接多个字符串,举例

let str=new String('hello')
str=str.concat('world',str)
console.log(str);//helloworldhello



同时想从字符串中提取子字符串可以通过三个方法实现:slice,substr,substring,区别在于,举例说明:

let str=new String('hello')
console.log(str.substr(-1));//o
console.log(str.slice(-1));//o
console.log(str.substring(-1));//hello



substr和slice能转换负数为倒数,而substring会把负数转换成0,输出全部字符串。

再次举例说明如果第二个参数是负数它们之间会发生什么区别

let str=new String('hello world')
console.log(str.substr(3,-4));//''
console.log(str.slice(3,-4));//'lo w'
console.log(str.substring(3,-4));//hel



slice方法将-4转换为7,substring方法转换为0,substring会将两个参数大小作为起点和终点的判断,而substr方法会将第二个参数转换为0,也就是说获取0个字符,返回空。


includes indexOf repeat toLowerCase toUpperCase


includes判断某个字符是否存在于另一个字符。repeat是指可以将该字符串复制多少次,toLowerCase、toUpperCase是指大小写字母。举例说明:

let str='hello World'
let str1='hello'
console.log(str.includes(str1));//true
console.log(str.indexOf(str1),str.indexOf('1'));//0 -1
console.log(str.repeat(2));//hello Worldhello World
console.log(str.toUpperCase(),str.toLowerCase());//HELLO WORLD hello world


常用的还有match,search方法,在正则讲过,这里就不赘述了。


单例内置对象Global


浏览器将window对象实现为Global的代理,所有在全局声明的变量都是window变量。


Math对象


常用方法:min,max,random,ceil(向上取整),floor(向下取整),abs(正数)


当代码开始执行时,全局上下文会存在Global和Math这两个内置对象。前者在浏览器中用window代理,后者主要用于复杂的数学运算。



相关文章
|
12天前
|
存储 JavaScript 前端开发
js的基础类型和引用类型
【10月更文挑战第29天】理解 JavaScript 中的基础类型和引用类型的区别对于正确地编写代码和理解程序的行为非常重要。在实际开发中,需要根据具体的需求合理地选择和使用不同的数据类型,以避免出现一些意想不到的错误和问题。同时,在处理引用类型数据时,要特别注意对象的引用关系,避免因共享引用而导致的数据不一致等问题。
|
29天前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
67 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
6月前
|
存储 JavaScript
JS中原始类型与引用类型
JS中原始类型与引用类型
|
11月前
|
存储 JavaScript 前端开发
|
前端开发 JavaScript 索引
前端祖传三件套JavaScript的对象之常用引用类型的RegExp
正则表达式是一种强大的文本处理工具,可以在前端开发中实现许多高效、灵活的文本操作。JavaScript 中的 RegExp 对象给我们提供了一个简单而强大的方式来匹配和搜索字符串。在本文中,我们将深入探讨 JavaScript 正则表达式对象,并介绍其中一些常用的引用类型。
90 0
|
前端开发 JavaScript
前端祖传三件套JavaScript的对象之常用引用类型的Date
在前端开发中,日期和时间处理是不可避免的任务之一,JavaScript 中的 Date 对象提供了一组强大的方法和属性,可以帮助我们更轻松地操作和管理日期和时间。在本文中,我们将深入探讨 JavaScript 日期对象,并介绍其中一些常用的引用类型。
115 0
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
95 2
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
122 4
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
81 4