《JavaScript 语言精粹(修订版)》
Douglas Crockford 著
北京:电子工业出版社
2012 年 9 月第 2 版
U1 精华
- 词法作用域
- 词法作用域/静态作用域:作用域在词法分析阶段就确定了,不会改变
- 动态作用域:运行时根据程序的流程信息来动态确定,而非写代码时静态确定
- 参考
- JavaScript 是一门弱类型的语言,所以 JavaScript 编译器不能检测出类型错误
U2 语法
-
没有用的注释比没有注释更糟糕
-
/* */
可能出现在正则表达式字面量里面,所以块注释对于被注释的代码块来说不安全 -
没有分离出整数类型,完全避免了短整形的溢出问题
-
NaN 不等于任何值,包括它自己
isNaN(NaN); // true
NaN === NaN; //false
NaN == NaN; //false
-
\u
指定数字字符编码("A" === "\u0041"
) -
JavaScript 中的代码块不会创建新的作用域
-
假:false、null、undefined、''、0、NaN
-
break 可以指定一个可选的标签,那退出的就是带该标签的语句(break 和标签之间不能换行)
function foo ()
{
dance:
for(var k = 0; k < 4; k++){
for(var m = 0; m < 4; m++){
if(m == 2){
break dance;
}
}
}
}
-
typeof
运算数为数组或者 null 时,结果是'object'
-
求模运算
7 % 2 // 1
7 % -2 // 1
-7 % 2 // -1
-7 %-2 // -1
U3 对象
-
属性的名字可以是包括空字符串在内的任意字符串
-
如果属性名是一个合法的 JavaScript 标识符且不是保留字,则不强制要求用引号括住属性名(JavaScript 的标识符中包含连接符
-
是不合法的,但允许包含下划线_
)
var stooge = {
"first-name": "Jerome",
last_name: "Howard"
}
- 对象是可嵌套的
4. ||
运算可以用来填充默认值
var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";
5. &&
避免从 undefined 成员属性中取值导致的 TypeError
异常
flight.euipment // undefined
flight.euipment.model // throw "TypeError"
flight.euipment && flight.euipment.model // undefined
- 对象通过引用来传递,它们永远不会被复制
var a = {}, b = {}, c = {}; // 每个都引用一个不同的空对象
a = b = c = {}; // 都引用同一个空对象
-
原型连接在更新时是不起作用的。当我们对某个对象作出改变时,不会触及该对象的原型
-
原型关系是动态的关系(当添加一个新的属性到原型中,该属性会立即对所有属于该原型创建的对象可见)
9. 处理不需要的属性
- 检查并丢弃值为函数的属性值(
typeof
) -
hasOwnPropety
方法(若对象拥有独有的属性,返回true
)
-
用枚举
for in
属性名出现的顺序是不确定的;要确保特定的顺序,可以使用数组+for
-
用枚举
for in
会列出所有的属性(包括 函数 和 原型中的属性) -
delete
不会触及原型链中的任何对象;删除对象的属性可能会让来自原型链中的属性透现出来
13. 减少全局变量污染
- 为应用只创建一个唯一的全局变量(把全局性的资源都纳入一个名称空间之下)
- 闭包
----------------------------2019.1.8----------------------------
----------------------------未完待续----------------------------
网友评论