JavaScript字符串字面量,并不是对象,最多只能说它是个伪对象!

时间:2021-11-20 14:42:29
JS中字符串背后的秘密

关于JS中是不是一切都是对象这句话,其实是有争议的。例如,我们可以直接在通过单引号或双引号定义的字符串字面量上调用方法:

  

"this is liuyu" .length

 

  这个是能获取正确的结果的,我们知道一般带个点前面的都可以认为是对象,因为这里得到了正确的答案,说明字符串的确是个对象,但是问题在于没有通过构造函数而是直接使用字面量的字符串又算不算对象呢?我这不是废话吗,上面明显都有答案了,能调用属性或方法的当然是对象了。是的,我们看到的的确是这样,但事实又是如何呢?

       事实就是,通过字面量定义的字符串并不是对象,或者最多只能说它是个伪对象,因为当在字符串字面量上调用方法或属性时,程序会在背后默默的创建一个与这个字面量的值相等的临时字符串对象,然后再在这个临时对象上调用属性或方法,最后把结果返回去,这个临时字符串对象完成使命后也随之会被销毁。还有一个有力的证据就是,你可以在字符串字面量上添加一个属性,或者是改变一个属性值,但结果是无法成功的:

var  s = "this is  liuyu" ;        
   s.name = "liuyu " ;         
  alert(s.name);

 

得到undefined的原因是,s.name 这个属性是加在了程序偷偷创建的那个临时字符串对象上(可能导致内存泄露),但我们无法得到这个临时字符创对象的引用,而且这个临时字符串对象很快就被销毁了。所以给字符串字面量添加属性或改变属性值是没有任何意义的,因为它根本不会受到影响。

 还有一个证据就是使用typeof操作符告诉我们字符串的类型为“string”,是与“object”类型完全不同的。那么,为什么字符串能够使用对象操作符呢?

实际上,这三个主原始数据类型(数值,字符串及布尔)每一个都有其对应的对象类。JavaScript中不仅提供了数值型,字符串型及布尔型,它还提供了数值类,字符串类及布尔类。这些类将对应的原始数据类型包装了起来,它不但拥有其原始数据值,而且还定义了属性和操作值的方法。JavaScript能够很灵活的转换各种数据类型。当你访问一个字符串的属性或方法时,JavaScript内部会自动创建其包装对象。这个字符串包装对象将替换原始字符串值,它拥有已定义的属性和方法,所以这样的使用方法是正确的。

var  s= "this is liuyu" ; //这是一个原始数据值
 
var  S= new  String( "this is liyu" ); //这是一个字符串对象

 

字符串在需要的时候会自动的转换为字符串对象。当你对S使用+运算符时,一个对应的原始字符串值将被创建,以便执行运算。
记住,这里讨论的所有内容都同样作用于数值型和布尔型。最后一点,所有的数值,字符串及布尔都可以通过Object()函数转换成其对应的对象:
var number_wrapper=Object(22)