包装类对象
介绍
js里的三个主原始数据类型(数值,字符串及布尔)每一个都有其对应的对象类。
JavaScript中不仅提供了数值型,字符串型及布尔型,它还提供了数值类,字符串类及布尔类。这些类将对应的原始数据类型包装了起来,它不但拥有其原始数据值,而且还定义了属性和操作值的方法。
JavaScript能够很灵活的转换各种数据类型。当你访问一个字符串的属性或方法时,JavaScript内部会自动创建
其包装对象。这个字符串包装对象将替换原始字符串值,它拥有已定义的属性和方法。
这样的使用方法是对的:
var s="hello";//这是一个原始数据值
var S=new String("hello");//这是一个字符串对象
typeof s //"string"
typeof S //"object"
字符串在需要的时候会自动的转换为字符串对象。当你对S使用+运算符时,一个对应的原始字符串值将被创建,以便执行运算。
记住,这里讨论的所有内容都同样作用于数值型和布尔型。最后一点,所有的数值,字符串及布尔都可以通过Object()函数转换成其对应的对象: var number_wrapper=Object(22)
优点
可以使用很多使用方法
封装类对象结合隐式强制转换,让我们可以使用很多实用的方法。
当对原始值提取属性 和 进行方法调用时, 它表现的就像已经使用了对应的对象类型封装了该值一样。如——
"hello".toUpperCase(); //"HELLO"
缺点
获取和设置原始类型值的属性会隐式地创建封装对象,导致没有符合预期行为
一是,隐式转换+封装类 使得对原始值设置属性,可能会没有任何作用
"hello".someProperty=17;
"hello".someProperty; //undefined
这会导致有时候本想给一个对象设置属性,但没想到其是个原始值,这样设置的属性之后获取不到,会造成隐藏的错误。
并且,因为每次隐式封装都会产生一个新的String对象,更新第一个封装对象并不会造成持久的影响。
当做相等比较时,原始类型的封装对象与其原始值行为不一样
二是,这意味着,你不能使用内置的操作符来比较两个截然不同的String对象的内容
var s1 = new String("hello")
var s2 = new String("hello")
s1 === s2 //false
由于每个String对象都是一个单独的对象,气重视值等于自身。对于非严格相等运算符,结果同样如此
s1 == s2 //false
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。