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
相关推荐
Dxy123931021632 分钟前
如何使用jQuery获取一类元素并遍历它们
前端·javascript·jquery
csdn小瓯44 分钟前
AI质量评估体系:LLM-as-a-Judge实现与自动化测试实战
前端·网络·人工智能
jiayong231 小时前
第 43 课:任务详情抽屉里的批量处理闭环与删除联动
java·开发语言·前端
likerhood1 小时前
Java 访问修饰符:public、protected、private讲解
java·开发语言·javascript
刀法如飞1 小时前
JavaScript 数组去重的 20 种实现方式,学会用不同思路解决问题
前端·javascript·算法
小江的记录本1 小时前
【AI大模型选型指南】《2026年5月(最新版)国内外主流AI大模型选型指南》(个人版)
前端·人工智能·后端·ai·aigc·ai编程·ai写作
@PHARAOH1 小时前
HOW - 前端输入场景支持拼音匹配
前端
计算机安禾2 小时前
【c++面向对象编程】第21篇:运算符重载基础:语法、规则与不可重载的运算符
java·前端·c++
__log2 小时前
Vue 3 核心技术深度解析:从“会用API“到“懂原理、能表达“
前端·javascript·vue.js