《Effective JavaScript:编写高质量JavaScript代码的68个有效方法》章节试读

出版社:机械工业出版社
出版日期:2014-1-1
ISBN:9787111446231
作者:赫尔曼 (David Herman)
页数:164页

《Effective JavaScript》的笔记-第1页 - 1

2014年看完的第20本书

《Effective JavaScript》的笔记-第37页 - 变量作用域-使用立即表达式创建局部作用域

除了书上所说,还有另一种闭包方式如下,感觉更优雅

《Effective JavaScript》的笔记-第56页 - 永远不要修改arguments对象

之前只知道arguments是个伪数组,这章节说明了arguments还有隐藏的坑。。。说白了就是在非严格模式下,函数参数始终对应着arguments的索引值!
以章节中的callMethod函数为例,即callMethod(obj, method)中obj对应着arguments[0],method对应着arguments[1],这个是定死的,无论arguments变成什么样子,始终obj对应着arguments[0],method对应着arguments[1],所以章节例子中当shift了arguments前两个元素后,以为obj[method]是在引用obj.add方法,但实际上却是引用17[25]。。。
而在严格模式下,函数参数始却并不是终对应着arguments的索引值的,以strict(x)函数为例,即修改了arguments[0]却和x没有任何关系,但非严格模式下却是始终对应一起的。。。
截个ff下代码图,为了不报错,注释掉错误的obj[method].apply(obj, arguments)这句:注意标红和标紫代码对应的输出就明白了

《Effective JavaScript》的笔记-第1页 - 1

P9 isNaN 不可靠,用ES6 Number.isNaN
P21 空循环体的while循环需要显式的分号
() => {while(true)} //Uncaught SyntaxError:
() => {while(true);}
P29 正常的作用域中,会有与局部作用域中的变量同样多的作用域绑定储存在与之对应的环境层级中。但对于with作用域,绑定集合依赖于碰巧在给定时间点的对象。
var f = (x, y) => {
with(Math) {
return min(round(x), sqrt(y))
}
}
f(5.5,4)
//2
Math.x = 0;
Math.y = 0;
f(5.5,4)
//0
P35 JavaScript没有块级作用域的一个例外,try...catch捕获的异常绑定到一个变量,该变量的作用域只是catch语句。
(() => {
var x = 'var',result = [];
result.push(x);
try{
throw 'exception'
}catch(x){
x = 'catch'
}
result.push(x);
return result;
})()
//["var", "var"]
P43 将eval封装到嵌套函数中防止作用域污染
var y = 'global';
var test = src => {
(() => {eval(src)})();
return y;
}
test("var y = 'local'")
test("var z = 'local'")
P44 间接调用eval优于直接调用
var x = 'global';
(() => {
var x = 'local';
return eval('x') //direct eval
})()
// local
var x = 'global';
(() => {
var x = 'local';
var f = eval;
return f("x") //indirect eval
})()
//global
直接调用eval函数性能损耗高昂,间接调用eval 失去对局部作用域的访问能力
强制间接调用eval (0,eval)('alert(0)')
P74
现代JavaScript引擎优化了原型查找
将方法储存在实例对象中将创建该函数的多个副本,比原型方法占用更多的内存
P87 继承标准类会由于内部属性(如[[Class]])而被破坏
P96 使用hasOwnProperty方法避免原型污染
使用call避免hasOwnProperty被覆盖
function Dict() {}
dict = new Dict;
'toString' in dict;//true
Object.hasOwnProperty.call(dict, 'toString');//false
P103 如果确实需要在Object.prototype添加属性,使用Object.defineProperty enumerable 设false,不可枚举
P104 for...in 循环枚举一个对象属性时确保不要修改该对象
P114 数组行为:
将length属性值设为小于n的值会自动删除索引值大于或等于n的所有属性。
增加一个索引值为n(大于或等于length属性值)的属性会自动地设置length属性为n+1
p152 事件循环单次轮次中执行递归不会导致栈溢出
156 使用计数器执行并行操作

《Effective JavaScript》的笔记-第35页 - 变量作用域-理解变量声明提升

中文版35页代码勘误,中文版的代码完全贴错了。。。审核也不认真,现贴上英文原版的代码


 Effective JavaScript:编写高质量JavaScript代码的68个有效方法下载 更多精彩书评


 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024