[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值、数字、字符串、null和undefined。
用typeof检测一下:
typeof true; //"boolean"
typeof 2; //"number"
typeof “s”;//"string"
typeof null;//"object":ECMAScript把null描述为独特的类型,但返回值却是对象类型,有点困惑。
可以使用Object.prototype.toString.call(null);//"[object Null]" 可以正确判断出null类型。
typeof undefined;//"undefined"
标准库提供了构造函数来封装布尔值、数字、字符串作为对象。
var s1=”hello”;
以构造函数的方法来创建则为
var s2=new String(“hello”);
String对象的行为和其封装的字符串值类似。
1、可以用加运算符
s1+” world”;//”hello world”
s2+” world”;//”hello world”
2、可以进取其索引的字符串
s1[4];//”o”
s2[4];//”o”
不同于原始的字符串,String对象s2是真正的对象。
typeof s1;//”string”
typeof s2;//”object”
每个String对象都是一个单独的对象,其总是只等于自身。对于非严格相等运算符,结果也一样。
var s3=new String(“hello”);
s2==s3;//false
另:
s1==s2;//true
因为s2调用了toString方法隐式转化了,此处见《[Effective JavaScript笔记]第3条:当心隐式的强制转换》
其存在的主要理由是它们的实用方法。结合另外的隐式强制转换,js使得我们可以方便地使用这些实用方法,这里是另一种隐式转换:当对原始值提取属性和进行方法调用时,它表现得就像已经使用了对应的对象类型封装了该值一样。
举例:String的原型对象有一个toUpperCase方法,可以将字符串转换为大写。你也可以对原始字符串调用这个方法。
“hello”.toUpperCase();//”HELLO”
注意:这种隐式转换可以对原始值设置属性,但是对其没有任何影响
“hello”.someProperty=17;
“hello”.someProperty;//undefined
原因:因为每次的隐式转换都会生成一个全新的封装对象,更新第一个对象并不会造成持久的影响。
对原始值设置属性是没有意义的,但觉察到这种行为是值得的。可以避免下面BUG的产生。
本来你想给一个对象设置属性,但没注意其实它是个原始值,程序只是忽略这个设置,继续执行。这种错误很难调试。
提示
1、当做相等比较时,原始类型的封装对象与其原始值行为不一样。原始值一定等于原始值,封装对象不等于相同的值的封装对象。“mm”==”mm” ; new String(“mm”) != new String(“mm”)
2、获取和设置原始类型的属性会隐式地创建封装对象。每次都会创建一个新的封装对象,所以设置的值不会保留。
[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象的更多相关文章
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- [Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法
前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数argument ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第57条:使用结构类型设计灵活的接口
想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更 ...
- [Effective JavaScript 笔记]第68条:使用promise模式清洁异步逻辑
构建异步API的一种流行的替代方式是使用promise(有时也被称为deferred或future)模式.已经在本章讨论过的异步API使用回调函数作为参数. downloadAsync('file.t ...
- [Effective JavaScript笔记]第3条:当心隐式的强制转换
js对类型错误出奇的宽容 3+true; //4 3*””; //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...
- [Effective JavaScript 笔记]第20条:使用call方法自定义接收者来调用方法
不好的实践 函数或方法的接收者(即绑定到特殊关键字this的值)是由调用者的语法决定的.方法调用语法将方法被查找的对象绑定到this变量,(可参阅之前文章<理解函数调用.方法调用及构造函数调用之 ...
- [Effective JavaScript 笔记]第66条:使用计数器来执行并行操作
第63条建议使用工具函数downloadAllAsync接收一个URL数组并下载所有文件,结果返回一个存储了文件内容的数组,每个URL对应一个字符串.downloadAllAsync并不只有清理嵌套回 ...
随机推荐
- Unity3D独立游戏开发日记(一):动态生成树木
目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...
- SSRS开发的经验记录
虽然工作经验相当的长,但是之前在SSRS上还没有象今天这样的经验.这只是工作经验的一点记录. 1. 定义DataSet 定义DataSet的时后,可以采用Text的方式.用Text的方式可以用一段比较 ...
- Python2和Python3 爬虫 转换
由于Python3的不断完善,很多新入Python的小伙伴选择了Python3的阵营,很多人选择了爬虫这一热门话题,但是网络上大部分教程都是Python2 教程,Python3这一块做了些许的改动,对 ...
- [USACO2005][POJ2226]Muddy Fields(二分图最小点覆盖)
题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木 ...
- DOM(八)使用DOM控制表单
1.表单简介 表单<form>是网页中交互最多的形式之一,它通过各种形式接收用户的数据,包括下拉列表框,单选按钮,复选框和文本框,本篇主要介绍表单中常用的属性和方法 javascript中 ...
- 【The final】软件工程实践总结
软件工程就这么告一段落了,竟然有那么一丢丢的舍不得-- 一.为拖延找的种种借口 [首先声明]以下纯粹是个人吐槽,仅作记录以便日后自己可以回顾一下往昔罢了,可以直接忽略,跳到第二大点:我的拖延之 ...
- java.lang.NoSuchFieldError: deferredExpression
处理:遇到这个异常的时候是用jstl标签,是版本问题,由于MyEclipse添加Java EE5,其中自动包括了jstl1.2的版本,lib中又存在一个jstl1.1.2的jar包,把旧版本的删掉就可 ...
- SQLHelper初实现---杨中科版(易懂,代码多点)
public class SQLHelper { //获取连接字符串,,引用Configurationl类库,并引用命名空间using System.Configuration; private st ...
- iOS7(iPhone4)button不能改变button的title
最近整了个高端的iPhone4测试机,系统是iOS7.1,测出一个问题,两个button,第二个的enable为NO,点击第一个button,第二个的title改变,然而在iPhone4上并不能运行, ...
- zabbix_监控_进程
一.根据进程名称监控 1.创建Item(只能通过进程名.用户过滤进程) http://www.2cto.com/os/201405/302249.html http://www.ithao1 ...