什么是包装类:
Number() 、String() 、 Boolean() 函数分别是数字,字符串,布尔值的包装类。
很多编程语言都有“包装类”的设计,包装类的目的就是为了让基本类型可以从它们的构造函数的prototype上获得方法。
见案例:
var a = new Number(123);
var b = new String('慕课网');
var c = new Boolean(true);
console.log(a); // Number {123}
console.log(typeof a); // object
console.log(b); // String {"慕课网"}
console.log(typeof b); // object
console.log(c); // Boolean {true}
console.log(typeof c); // object
注意:面试的时候经常问console.log(typeof a);
,所以要牢记类型是Object。
还有:虽然它们的类型是Object但它们还是可以进行基本的运算:
见代码:
var a = new Number(123);
var b = new String('慕课网');
var c = new Boolean(true);
console.log(a);
console.log(typeof a);
console.log(b);
console.log(typeof b);
console.log(c);
console.log(typeof c);
console.log(a + 5); // 128
console.log(b.slice(0,2)); // 慕课
console.log(c && true); // true
再看一个案例:
var d = 100;
console.log(d.__proto__ == Number.prototype); // true
var s = 'aaaa';
console.log(s.__proto__ == String.prototype); // true
var f = false;
console.log(f.__proto__ == Boolean.prototype); // true
通过上面的案例我们就能知道为什么字符串可以打点调用slice等方法了,就是因为在包装类的原型上有这些方法,所以可以通过原型链查找到,因此可以打点调用了,见下面代码验证:
var s = 'aaaa';
console.log(s.__proto__ == String.prototype);
console.log(String.prototype.hasOwnProperty('slice')); // true
console.log(String.prototype.hasOwnProperty('substring')); // true
总结:
1、Number()、String()、Boolean() 的实例都是Object类型,它们的PrimitiveValue属性存储它们的本身值,还有要注意一点,这个PrimitiveValue不能直接打点调用,因为它是一个内部属性。
2、new出来的基本类型值可以正常参与运算
3、包装类的目的就是为了让基本类型值可以从它们的构造函数的Prototype上获取方法。
4、包装类是对于基本类型值的面向对象的一种体现,所以像undefined null 是没有包装类的。