问题
我们先通过一段代码的问题来引入包装类的概念
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