什么是包装对象?
- 存取字符串、数字或布尔值的属性时创建的临时对象称作包装对象
哪里会使用到包装对象?
不知道你是否会注意到我们平时在操作字符串时注意到如下现象
我们看到普通的的字符串变量竟然有属性和方法:
var str = 'hello world';
var s = str.substring(2, str.length - 2);
我们知道,只有对象才有属性和方法,字符串既然不是对象,为什么它会有属性呢?
- 只要引用了字符串str的属性,JavaScript就会将字符串值通过调用
new String(str)
的方式转换成对象,这个对象继承了字符串的方法,并被用来处理数据的引用,一旦属性引用结束,这个新创建的对象就会销毁,我们也称这个新创建的对象为包装对象
布尔值与数字
同字符串一样,数字和布尔值也具有各自的方法:通过Number()
和Boolean()
构造函数创建一个包装对象,这些方法的调用均是来自于这个包装对象,null
和undefined
没有包装对象
var num = 3.1415926;
num.toString(); // => "3.1415926",转为字符串
num.toFixed(3); // => "3.142",转为保留小数点后三位的字符串
var bool = true;
bool.toString(); // => "true",转为字符串
bool.valueOf(); // => 1,转为数字
加深对包装对象的理解
看如下代码,思考他们的执行结果:
var str = 'hello';
str.len = 5; //给它设置一个属性
console.log(str.len); //尝试输出这个属性值
当运行这段代码时,输出的结果为undefined
。
思考:
第二行代码意思是JavaScript给str
变量创建一个包装对象,并且给这个包装对象一个len
属性,但执行完毕后这个包装对象被销毁
第三行我们尝试输出str.len
时,也就是引用字符串的属性时,JavaScript又给我们创建一个str
变量的包装对象,这是新创建的对象,显然,这个新创建对象的len
属性不存在,输出undefined
注意事项
需要注意的是,可通过String()
,Number()
或者Boolean()
构造函数来显示创建包装对象:
var s = "hello";
var n = 18;
var b = false;
var S = new String(s);
var N = new Number(n);
var B = new Boolean(b);
JavaScript会在必要的时将包装对象装换为原始值(undefined、null、布尔值、数字和字符串),因此上述代码中的对象S、N、B常常–但不总是–表现的值和s、n、b一样。"==“等于运算符将原始值和其包装对象视为相等,但”==="全等运算符将它们视为不等,通过typeof
运算符可以看到原始值和其包装对象的不同
- 说到运算符的转换,不如再来看一下这里(待更新)