《JavaScript权威指南》(第六版)
字符串、数字、布尔值是有别于对象的。
但是,有人讲,字符串既然不是对象,为什么它会有属性和方法?对象不就是拥有属性和方法的数据吗?
其实,之所以出现这种说法,是因为一个叫“包装对象”的东西。存取字符串、数字或布尔值的属性时,会临时创建一个对象,这个对象在属性引用结束后会自动销毁。而字符串、数字和布尔值的属性都是只读的,并且不能给他们定义新属性。
举个栗子:
var s = "test"; //创建一个字符串
s.len = 4; //设置一个新属性
var t = s.len; //查询这个属性可知,t值是undefined
当运行上面的代码时,t的值是undefined。第二行代码引用到了字符串s的属性,JavaScript将字符串值通过调用new String(s)的方式创建一个临时对象,这个对象继承了字符串的方法,被用来梳理属性的引用,但该语句结束后该对象被销毁。第三行通过原始的(没有被修改过)字符串值创建一个新字符串对象,尝试读取其len属性,这个属性自然不存在,表达式求值结果为undefined。
需要注意的是,可通过String()、Number()或Boolean()构造函数来显式创建包装对象。例如:
var s = "test"; //一个字符串
var S = new String(s); //一个字符串对象
JavaScript会在必要时将包装对象转换成原始值。“==”等于运算符将原始值和其包装对象视为相等,但"==="全等运算符将它们视为不等。通过typeof运算符可以看到原始值和其包装对象的不同。