当前位置: 首页 > 科技观察

前端100题——从基本类型、引用类型到包装对象

时间:2023-03-15 23:26:58 科技观察

一、基本类型与引用类型1.1基本类型js中的基本数据类型包括:Number(值)、String(字符串)、Boolean(布尔值),Null,Undefined,Symbol(ES6引入,表示唯一),具有以下特点:基本类型的访问是按值;不能添加属性和方法;基本类型的变量存在于栈区,包括变量标识符和变量的值。(栈区不会设置太大,主要用来存放基本类型);基本类型的拷贝,就是在栈内存中开辟一个新的存储区,用来存放新的变量;基本类型的比较是值比较。image.png1.2引用类型js中引用类型分为三种:基本引用类型:Object(对象)、Array、RegExp、Date、Function;基本封装类型:String、Number、Boolean;单个内置对象:Global、Math。它具有以下特点:引用类型的值是通过引用来访问的;引用类型可以有属性和方法,并且可以动态改变;存放需要内存的栈区和堆区,栈区保存变量标识符和指向内存中的内存。指向对象的指针;引用类型的比较是引用的比较;引用类型的副本将复制引用地址。image.png1.3Extension-为什么需要“栈”和“堆”两个存储空间是因为JavaScript引擎在程序执行过程中需要使用栈来维护上下文(调用栈)的状态,如果栈空间是太大(即所有数据都存放在栈空间),会影响上下文的切换效率,进而影响整个程序的执行效率,所以通常栈空间不会设置太大,它用于存放基本类型等小数据,引用类型会存放到堆中。2.包装对象2.1后台出现异常现象。不知道你有没有注意到。字符串、数字、布尔值可以调用属性和方法,例如:conststr='123';console.log(typeof(str));//stringconsole.log(str.toString());//123constnum=123;console.log(typeof(num));//numberconsole.log(num.toString());//123constbool=true;控制台。log(typeof(bool));//booleanconsole.log(bool.toString());//true看到这个现象,是不是觉得很奇怪,这有违我们通常的想法,毕竟我们认为基本都有类型上没有属性和方法,这时候包装对象的主角就出现了。2.2包装Object数值型、布尔型、字符串型的JS变量在一定条件下也可以自动成为对象。这是包装对象的原始类型。包装对象实际上是一种特殊的引用类型,它与引用类型的主要区别在于生命周期。当一个通用引用类型使用new创建它的实例时,它会一直保存在内存中,直到执行流离开当前作用域;wrapper类型的对象只存在于这行代码执行的那一刻,然后它会立即被销毁。(这也意味着运行时不能给基本类型添加属性和方法)2.3包装对象的后台执行过程当基本类型中的String、Number、Boolean调用属性和方法时,后台是如何执行的?其实整个过程可以简化为三步:创建一个对象类型的实例,比如字符串,创建String类型的实例;在实例对象上调用特定方法;销毁实例。以一个字符串为例来演示这个过程:conststr='abc';conststrNew=str.substring(0,2);其实在运行到str.substring(0,2)的时候偷偷执行了下面三个步骤:letstrObj=newString(str);conststrNew=strObj.substring(0,2);strObj=null;2.4扩展的包装器对象是否等于同一个原始类型的值?不相等。因为包装对象是引用类型,原始类型是基本类型;wrapper对象最大的目的首先是让JavaScript对象覆盖所有的值,其次是让原始类型的值方便调用某些方法。如何向基本类型添加属性和方法?在原始包装器对象的原型下面添加,每个对象都有一个原型。如果在同一个字符串上调用两次相同的方法,包装器对象是否相等?不相等。调用结束后,被包装的对象实例自动销毁。这意味着下次调用字符串的属性时,实际上调用的是新生成的对象,而不是上次调用生成的对象,这也解释了为什么不能直接给字符串、数字、布尔值添加属性和方法。本文转载自微信公众号“牵着风筝”,可通过以下二维码关注。转载本文请联系风筝持有人公众号。