读书频道 > web开发 > Javascript > Effective JavaScript:编写高质量JavaScript代码的68个有效方法
第4条:原始类型优于封装对象
2013-12-07 14:02:26     我来说两句 
收藏    我要投稿   
本书共分为7章,分别涵盖JavaScript的不同主题。第1章主要讲述最基本的主题,如版本、类型转换要点、运算符注意事项和分号局限等。第2章主要讲解变量作用域,介绍此方面的一些基本概念,以及一些最佳实践经验。第  立即去当当网订购

除了对象之外,JavaScript有5个原始值类型:布尔值、数字、字符串、null和undefined。(令人困惑的是,对null类型进行typeof操作得到的结果为“object”,然而,ECMAScript标准描述其为一个独特的类型。)同时,标准库提供了构造函数来封装布尔值、数字和字符串作为对象。你可以创建一个String对象,该对象封装了一个字符串值。

 

在某些方面,String对象的行为与其封装的字符串值类似。你可以通过将它与另一个值连接来创建字符串。

 

你也可以提取其索引的子字符串。

 

但是不同于原始的字符串,String对象是一个真正的对象。

 

这是一个重要的区别,因为这意味着你不能使用内置的操作符来比较两个截然不同的String对象的内容。

 

由于每个String对象都是一个单独的对象,其总是只等于自身。对于非严格相等运算符,结果同样如此。

 

由于这些封装的行为并不十分正确,所以用处不大。其存在的主要理由是它们的实用方法。结合另外的隐式强制转换,JavaScript使得我们可以方便地使用这些实用方法因为这里有另一个隐式转换:当对原始值提取属性和进行方法调用时,它表现得就像已经使用了对应的对象类型封装了该值一样。例如,String的原型对象有一个toUpperCase方法,可以将字符串转换为大写。你可以对原始字符串值调用这个方法。

 

这种隐式封装的一个奇怪后果是你可以对原始值设置属性,但是对其丝毫没有影响。

 

因为每次隐式封装都会产生一个新的String对象,更新第一个封装对象并不会造成持久的影响。对原始值设置属性的确是没有意义的,但是觉察到这种行为是值得的。事实证明,这是JavaScript隐藏类型错误的又一种情形。本来你想给一个对象设置属性,但没注意其实它是个原始值,程序只是忽略更新而继续运行。这容易导致一些难以发现的错误,并且难以诊断。

 提示

当做相等比较时,原始类型的封装对象与其原始值行为不一样。

获取和设置原始类型值的属性会隐式地创建封装对象。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:第3条:当心隐式的强制转换
下一篇:第5条:避免对混合类型使用==运算符
相关文章
图文推荐
3.12 本章小结
3.10 添加新函数
3.9 递归
3.8 闭包
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站