JavaScript: 装箱/包装类型/万能检测数据类型
在JavaScript中,值的类型分为基本数据类型和引用数据类型,也可以叫做:原始值类型 和 对象类型
基本数据类型分为: string、boolean、number、null 和 undefined
引用数据类型即:object
其中,string、boolean、number有着对应的String、Boolean、Number对象,两者存在一定的区别
typeof 'hello'; // 'string'
typeof new String('hello'); // 'object'
但是,我们会发现即使使用的是基本数据类型的数据,依旧可以使用其对应的对象中的方法,这里就涉及到了JavaScript中的装箱了
装箱:
装箱就是把基本数据类型转化为对应的引用数据类型的操作,即:对基本数据类型进行包装
所以,包装数据类型也就是装箱
var s = "abc"
s.indexOf("a"); //即使是基本类型的数据,依然可以使用String对象中的方法
装箱的实现机制(原理):
1、创建一个基本数据类型的数据,这个时候,js会自动创建一个对应的对象,这个对象也可以叫做包装数据类型对象
2、通过这个对象,我们的基本类型数据就可以使用对象中的方法了
3、使用完方法之后,销毁这个实例
//实现原理
var s1 = "abc";
var s2 = new String("abc");
s1 = s2.indexOf("a");
s2 = null;
拆箱
拆箱就是把引用数据类型转化为基本数据类型的操作
//将引用数据类型的数据转换为对应的基本数据类型
var s = new String("abc");
console.log(typeof s); //object
var s1 = s.toString();
var s2 = s.valueOf();
console.log(typeof s1);//string
console.log(typeof s2);//string
拆箱的实现机制:
toString() 或 valueOf() 可以获取到数据最原始的数据类型,
通过这个机制,可以实现对引用数据类型的转化。
万能检测数据类型
对所有数据的检测也是根据拆箱所提供的方法,
Object.prototype.toString.call(数据)
括号中填要检测的数据,返回值为检测数据的数据类型
var a = Object.prototype.toString.call("abc");
var b = Object.prototype.toString.call(10);
var c = Object.prototype.toString.call(undefined);
var d = Object.prototype.toString.call([1,2,3,4]);
var e = Object.prototype.toString.call({name: "zs"});
var f = Object.prototype.toString.call(function(){console.log("函数");});
console.log(a); // [object String]
console.log(b); // [object Number]
console.log(c); // [object Undefined]
console.log(d); // [object Array]
console.log(e); // [object Object]
console.log(f); // [object Function]
注:
这行代码不懂什么意思不重要,直接可以拿来用;
当然,代码的意思还是得解释一下:
Object:最顶层的对象,也可以叫做对象的构造函数。由于object有一个构造函数Obejct ,即 var o = new Obejct() 可以创造对象
prototype: 函数的原型(是一个对象,里面存放操作着object类型的方法)
tostring(): 获取数据最原始的数据类型,
call() : 改变this的指向
所有代码的意思为:通过对象的原型中的tostring方法,让方法中的this指向数据,来获取到数据的数据类型