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
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端