(1)最新的 ECMAScript 标准定义了 7 种 数据类型:javascript
6种 原型类型:html
以及 Object 对象java
(2)这7种数据类型中,对象为“引用类型”,其余六种为“原始类型”(或叫“基本类型”)。web
(1)按原始类型和引用类型的定义来讲,只有引用类型(对象)才有属性和方法,原始类型是没有属性和方法的。segmentfault
(2)可是咱们也能常常看到有下面这样的写法。app
(3)咱们使用 toString() 方法,将 num 这个数值类型转换成了字符串类型,如此咱们用 原始类型 num 调用了 toString() 方法,那么是否是原始类型也能调用方法呢?答案是否认的。仍然只有对象才能拥有属性和方法。函数
(4)【疑问】为何 num 调用了 toString() 却没有报错呢?这就须要咱们了解包装对象的概念了。spa
(1)在JavaScript中,“一切皆对象”,包括三种原始类型的值(数值、字符串、布尔值),在必定条件下,也会自动转为对象,也就是原始类型的“包装对象”。htm
(2)包装对象是特殊的引用类型。每当读取数字、字符串和布尔值的属性或方法时,建立的 临时对象 称作包装对象。对象
(1)为了便于引用字符串的属性和方法,JavaScript将字符串值经过调用 new String() 的方式 转换成对象,这个对象继承了字符串的属性和方法,并被用来处理属性和方法的引用。数值和布尔值也是如此。
(2)虽然包装对象看上去和原来的值如出一辙,显示出来的也是如出一辙,但他们的 类型 已经变为 object !
(3)【注意】包装对象和原始值用 === 比较会返回 false。
(1)Number、String 和 Boolean,若是不做为构造函数调用(即调用时不加 new);此时,Number()、Boolean() 和 String() 被当作普通函数,把任何类型的数据转换为 number、boolean和string类型(注意不是其包装类型)。
(1)这三个包装对象做为 构造函数 使用(带有 new)时,能够将 原始类型的值转为对象;
(2)做为 普通函数 使用时(不带有 new),能够将任意类型的值,转为原始类型的值。
(1)【注意】一旦包装对象的属性或方法的引用结束,这个新建立的对象就会销毁。
(2)【说明】在上面的例子中,代码第二行 name 属性赋值时,包装对象就会登场,建立一个 str 对应的临时对象,固然,这行代码执行完成,这个对象也就被销毁。而后在第三行则会建立一个新的包装对象,这个对象固然没有 name 属性,因此输出的是 undefined。
(1)包装对象的最大目的,首先是使得 JavaScript 的对象涵盖全部的值。
(1)其次使得原始类型的值能够方便地调用某些方法。
参考文章
包装对象 -- JavaScript 标准参考教程(alpha)
javascript类型系统——包装对象 小火柴的蓝色理想