用字面量和用new创建基本类型值到底有什么区别?
每次创建数组或对象的时候,都能用以下两种方法创建
var s1 = "some text";
var s2 = new String("some text");
字面量
- 字面量语法简单,直接,优雅
- 且省去了大量new中的构造方法
第一点很好理解,第二点是什么意思呢?结合资料个人理解如下:
我们知道,基本类型值不是对象,因为从逻辑上讲它们不应该有方法,但是事实:
var s1 = "some text";
var s2 = s1.substring(2); //'me text'
???
其实,为了让我们实现这种直观的操作,当读取一个基本类型值的时候,后台会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
这里当第二行代码执行到是s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台会完成以下处理:
- 创建String类型的一个实例;
- 在实例上调用指定的方法;
- 销毁这个实例;
可以将以上三个步骤想象成是执行了下列ECMAScript代码。
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null
经过此番处理,基本的字符串值就变的跟对象一样了。上面三个步骤同样适用于Boolean和Number类型对应的布尔值和数字值。
除此外,自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法:
var s1 = "some text";
s1.color = "red";
alert(s1.color); //undefined
平时当然可以显示调用Boolean、Number、String来创建基本包装类型的对象,但最好不要,除非必要。因为这种做法有时候很容易让人分不清自己是在处理基本类型还是引用类型。