众所周知,在JavaScript中,数据类型主要分为基本数据类型和引用数据类型。基本数据类型主要就是number,String,boolean,undefined,null,引用数据类型就是对象。基本数据类型本身不直接拥有方法,因为它们不是对象,不具有属性或方法的承载结构。那我们平常用的那些let a = 'hello' ;let b = a.length是怎么回事呢?
创建对象的方法
在讲这个之前我们先了解一下对象的创建方法。我们常见的创建对象的方法有三种:
- 使用对象字面量,这是一种非常直观且常见的方法。
var car = {
name:'xiaomi SU7',
color:'green'
}
- 使用
new Object()构造函数创建一个空对象,这是一种很基础的方法,但是现在很少使用。
var car = new Object()
car.name = 'xiaomi SU7'
car.color = 'green'
- 使用构造函数,批量创建对象。
function Car(name, color) {
this.name = name;
this.color = color;
}
var car = new Car('xiaomi SU7', 'green');
为什么要讲这个对象的创建方法呢,因为我们的包装类其实就是就是将基本数据类型转换为对象。所以了解一下对象的创建方法还是挺有必要的。
初识包装类
下面,大家来分析一下这段代码,它的执行结果是什么呢?
var num = 123
num.a='aaa'
console.log(num.a)
可能有的兄弟们没有从头看我的这篇文章,所以就认为最后的打印结果是aaa,有的兄嘚知道基本数据类型不能有属性,所以认为这是段错误的代码。可是结果真的是这样吗?请看我们电脑跑出来的结果!
什么?结果居然是undefined ?这不符合常规吧?
其实当你知道这段代码的执行过程之后你就会感觉其实还是挺合规的。
var num = 123 // 这在v8引擎眼里其实就是 var num = new Number(123)
num.a='aaa' // new Number(123).a = 'aaa'
// v8还会隐式执行num.valueOf() 这个操作来判断他是不是个基础数据类型
//如果是的话就会删除掉这个属性 delete num.a
console.log(num.a)
这就是一整套的代码执行过程。看完上面v8完整的执行代码是不是就觉得这个undefined结果挺合理的。如果你要问我为什么会这样执行,我只能说这就是JavaScript中的底层规则。
深入了解包装类
var num = 123;这种创建的叫数字字面量,而var num = new Number(123);创建的叫包装对象(数字对象) 他具有普通的数字具有的加减方法,同时也具有相应的对象具有的属性。
所以下面这段代码就是运行结果是什么?
var num = new Number(123)
num +=1
console.log(num)
num.a='aaa'
console.log(num.a)
很明显,第一个打印结果就是124,第二个打印结果是aaa。
简单来说,这个东西,你当他是数字用他就是数字,你当他是对象用他就是对象。
这样写在实际编程中其实作用并不是很大,哪有人会专门给数字加属性啊,是吧?在这里提一下就是给大家拓展一下。
再见包装类
了解包装类其实就是让我们能够心里有底的去使用原本这些基本数据类型带的属性。例如我们在经常用到的判断字符串的长度:
var str ='abcd'
console.log(str.length);
这里我们可以得到数组的长度,那这个符合常规吗? 其实也是符合常规的哦!按照之前说的在v8眼中,代码会执行成这样
var str = new String('abcd')
console.log(str.length)
而在 new String('abcd')中就有个length方法,这下面就是她的所有方法,好多!!!但是我们记住一些常用的就行了。
这个方法是隐式存在的,上述代码并不存在添加属性的过程,所以使用这个方法时v8就会历尽千辛万苦找到这个方法。
再例如,我们可以使用number中的toString()方法将其转换为字符串
var num = 123
var a = num.toString();
a+=1
console.log(a)
此时打印出来就是'1231'这个字符串。
讲到这里包装类就差不多讲完了,因为里面还有些细节牵扯到其他的知识点,一句两句根本讲不完。主要就是牵扯到原型和原型链这方面,在后期我也会专门在整理一下。先给大家看段代码来检验一下是不是真的懂了!
var str ='abc'
str += 1
var test=typeof(str) // 'string'
if(test.length===6){
test.sign='typrOf的返回结果可能是String'
}
console.log(test.sign);
结果是什么?
总结
在这里我们主要学习了对象的创建方法,什么是包装类以及包装类的作用。包装类(Wrapper Classes)是指三个特殊的对象类型,分别是String、Number和Boolean,它们分别对应于基本数据类型:字符串(string)、数字(number)和布尔值(boolean)。我个人认为包装类还是比较简单的,只有三个,就是让我们了解平时常用的一些基本数据类型的方法的底层原理。也许我的认知还是有点简单了,所以如果有不对的地方还请大佬们指正一下。