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
相关推荐
2401_894915539 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
rockey62714 小时前
C#脚本引擎之AScript与Jurassic、Jint对比
javascript·c#·.net·js·script·动态脚本
Profile排查笔记15 小时前
指纹浏览器哪个好?从 Profile、代理、权限和自动化能力判断是否适合
前端·人工智能·后端·自动化
lzhdim15 小时前
12、JavaScript常见的内存泄露问题 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
denggun1234515 小时前
yield
前端·数据库·python
前端snow15 小时前
ai agent -- prompt汇总
前端
muddjsv17 小时前
前端性能优化实战:从加载到渲染的全面提速指南
前端·性能优化
deli00700717 小时前
JSON 树形查看器:粘贴即解析,折叠展开一目了然
前端·数据库·json·ai编程
guanguan0_017 小时前
PageProxy:页面维度接口地图 + 一键场景切换
前端·ai编程·请求代理·proxy工具
liangshanbo121518 小时前
虚拟列表深度面试题整理
java·开发语言·前端