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
相关推荐
你这个代码我看不懂3 分钟前
Vue子父组件.sync
javascript·vue.js·ecmascript
灰灰勇闯IT8 分钟前
Flutter for OpenHarmony:布局组件实战指南
前端·javascript·flutter
⑩-32 分钟前
Vue框架学习
前端·vue.js·学习
a程序小傲35 分钟前
京东Java面试被问:基于Gossip协议的最终一致性实现和收敛时间
java·开发语言·前端·数据库·python·面试·状态模式
小二·38 分钟前
Python Web 开发进阶实战:AI 原生应用商店 —— 在 Flask + Vue 中构建模型即服务(MaaS)与智能体分发平台
前端·人工智能·python
Devlive 开源社区1 小时前
技术日报|推理RAG文档索引PageIndex登顶日增1374星,React视频工具Remotion二连冠进前二
前端·react.js·前端框架
xkxnq1 小时前
第三阶段:Vue 路由与状态管理(第 45 天)(路由与状态管理实战:开发一个带登录权限的单页应用)
前端·javascript·vue.js
编程大师哥1 小时前
JavaScript 和 Python 哪个更适合初学者?
开发语言·javascript·python
方方洛1 小时前
技术实践总结:schema-bridgion:json、xml、yaml、toml文件相互转换
xml·前端·typescript·node.js·json
2601_949575861 小时前
Flutter for OpenHarmony二手物品置换App实战 - 自定义组件实现
android·javascript·flutter