js中包装类知多少?浅析包装类(含阿里面试真题)

问题

我们先通过一段代码的问题来引入包装类的概念

js当中变量分为基本数据类型引用数据类型 。引用数据类型具有属性和方法,也就是可以通过"变量名.属性名"、"变量名.方法名()"访问调用自身有的属性和方法,而基本数据类型是没有的。

那么问题来了,我们知道为对象中不存在的属性为其赋值会直接创建该属性,为什么以下代码中的基本数据类型变量num不能使用创建属性,为什么最终的打印语句没有报错而还打印出"undefined",那就是说明了存在abc属性,只是没有赋值。

js 复制代码
var num=123
num.abc='hello'
console.log(num.abc)//打印undefined
js 复制代码
var obj={}
obj.a='hello'
console.log(obj.a)//打印hello

原因

知识点

实际上基本数据类型(比如字符串、数字、布尔值)被视为对象,因为它们具有与对象相似的特性。 JavaScript提供了包装类来使基本数据类型像对象一样操作。

js 复制代码
//包装类对象
var num=new Number(123)
num.name='abc'
console.log(num.name)//打印abc
//当参与四则预算的时候,引擎会将其识别为数字
num=2
console.log(num*2) //打印4

也就是说当你想让基本数据类型访问属性或者使用方法的时候,引擎会临时将该基本数据类型转化为对应的包装类,随后又立即删除该对象。

过程分析

我们知道对一个对象没有的属性值去赋值的话,会直接在该对象创建这个没有的属性

js 复制代码
var obj={}
obj.a='hello'
console.log(obj.a)//打印hello

也就是说引擎在执行obj.a='hello'时,去获取obj的a属性的值时,会直接创建属性a

我们刚刚知道JavaScript提供了包装类来使基本数据类型像对象一样操作,也就是说以下代码

js 复制代码
var num=123
num.abc='hello'
console.log(num.abc)//打印undefined

当引擎执行到num.abc='hello'时,引擎会做以下操作

js 复制代码
//生成对应的包装类对象
var num=new Number(123) 
num.abc='hello'//给num对象中创建了一个abc属性
              //但是规定了基本数据类型是不能有属性和方法
              //于是下一步就顺手把这个对象删了
num=null

于是我们便可以知道当引擎执行到console.log(num.abc)时也会立即将num转化为对应的包装类

js 复制代码
var num=new Number(123) 
         //寻找abc属性不存在返回undefined给console.log函数
 num=null//删除对象

故最后打印undefined而不是报错

阿里面试题

题目

js 复制代码
 var str='abc'
 str +=1 
 var test=typeof(str)//内置函数判断变量类型并返回(字符串)
 if(test.length==6){ 
    test.sign='typeof 的返回结果可能为String'
 }
 console.log(test.sign)

解析

js 复制代码
 var str='abc'
 str +=1 //值为abc1
 var test=typeof(str)//值为String,test是字符串类型
 if(test.length==6){ //符合条件执行
    test.sign='typeof 的返回结果可能为String'
    // 等效:var test=new String('abc'); test.sign='typeof 的返回结果可能为String';test=null
 }
 console.log(test.sign)
  // 等效: var test=new String('abc'); 在test的封装类中创建sign值为undefined;test=null
  //打印函数在test的包装类对象删除前读取到值为undefined,故打印undefined
相关推荐
也无晴也无风雨36 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang1 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、4 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤5 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui