每一种基本的数据类型在对象中都有一个类,基本数据类型和对象的类之间是可以互相转换的,转换的过程称之为装箱和拆箱。但是在转换之前我们还需要了解如何判断类型,通常情况下我们可以使用typeof或者instanceof来判断数据的类型,但是其实他们之间却存在着不小的区别。
typeof
typeof运算符是判断value是属于原生数据类型的哪一种,其输出结果可为object,undefined,string,number,boolean,function,symbol。注意,其中function并不属于哪一种数据类型,实际运行中函数的数据类型其实为object,但是在typeof运算符的结果会对function value输出function。
instanceof
在javascript中,每一个对象都有一个内置属性称之为原型,而instanceof就是判断value是否是类或者构造函数的一个实例,输出结果通常是boolean value (true/false)。使用方法是操作符左边是object,右边是判断的原型。但是instanceof无法判断原生的数据类型。
装箱操作
装箱操作就是把基本类型和对应的对象转换的过程。装箱分为自动装箱和手动装箱,当对原生数据类型调用函数的时候,js会自动装箱,创建一个与之类型对应的对象;手动装箱就是使用new关键字创建一个与之类相对应的实例,e.g. new String('hello')。
但是全局的Symbol函数是无法使用new来调用的,但是我们仍然可以使用call来强制装箱,我们可以定义一个函数,函数内容只有return this,然后对函数调用call方法到一个Symbol类型的值上。因为装箱操作会频繁地创建临时对象,所以如果想提升性能的话应该避免对基本类型进行装箱操作。
每一类装箱对象都有Class私有属性,所以我们可以使用Object.prototype.toString.call()的方式来对象对应的基础类型,但是call函数本身会进行装箱操作,所以无法判断value是否是基础类型,所以还有搭配前文提及的typeof进行判断。
拆箱操作
拆箱操作通常会使用valueOf或者是toString来将对象类型转换成原生类型。
Reference: time.geekbang.org/column/arti… www.codingninjas.com/codestudio/… javascript.plainenglish.io/javascript-… thisthat.dev/instanceof-… www.codingninjas.com/codestudio/…