《Effective JavaScript 编写高质量JavaScript代码的68个有效方法》大佬推荐书籍

第1章 让自己习惯JavaScript
第1条 了解你使用的JavaScript版本
确保你使用的任何JavaScript特性对于应用程序将要运行的所有环境都是支持的;

总是在执行严格模式检查的环境中测试严格代码。

第2条 理解JavaScript的浮点数
事实上,JavaScript中所有的数字都是双精度浮点数。

位运算将数字视为32位的有符号整数。

浮点数权衡了精度和性能,当我们关心精度时,要小心浮点数的局限性。一个有效的解决方法是尽可能地采用整数值运算,因为整数在表示时不需要舍入。

第3条 当心隐式的强制转换
NaN是JavaScript中唯一一个不等于其自身的值,因此,你可以通过检查一个值是否等于其自身的方式来测试该值是否是NaN。

检查参数是否为undefined更为严格的方式是使用typeof。

对象通过valueOf方法强制转换为数字,通过toString方法强制转换为字符串。

第4条 原始类型优于封装对象
除了对象之外,JavaScript有5个原始值类型:布尔值、数字、字符串、null、undefined。

当对原始值提取属性和进行方法调用时,它表现得就像已经使用了对应的对象类型封装了该值一样。

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

第5条 避免对混合类型使用==运算符
null== undefined; 不转换,总是返回true

当参数类型不同时,==运算符应用了一套难以理解的隐式强制转换规则。

第6条 了解分号插入的局限
仅在“|”标记之前、一行的结束和程序的结束处推导分号。

仅在紧接着标记不能被解析的时候推导分号。

在return、throw、break、continue、++或—的参数之前绝不能换行。

第7条 视字符串为16位的代码单元序列
JavaScript字符串由16位的代码单元组成,而不是由Unicode代码点组成。

JavaScript使用两个代码单元表示2^16及以上的Unicode代码点,这两个代码单元被称为代理对。

第2章 变量作用域
第8条 尽量少用全局对象
避免声明全局变量,尽量使用局部变量,避免对全局对象添加属性。

使用全局对象来做平台特性检测。

第9条 始终声明局部变量
考虑使用lint工具帮助检查未绑定的变量。

第10条 避免使用with
避免使用with语句。

使用简短的变量名代替重复访问的对象。

第11条 熟练掌握闭包
闭包的3个事实:

1.JavaScript允许你引用在当前函数以外定义的变量;

2.即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量;

3.闭包可以更新外部变量的值。

第12条 理解变量声明提升
在代码块中的变量声明会被隐式地提升到封闭函数的顶部。

重声明变量被视为单个变量。

第13条 使用立即调用的函数表达式创建局部作用域
闭包通过引用而不是值捕获它们的外部变量。

使用立即调用的函数表达式来创建局部作用域。

当心在立即调用的函数表达式中包裹代码块可能改变其行为的情形。

第14条 当心命名函数表达式笨拙的作用域
第15条 当心局部块函数声明笨拙的作用域
始终将函数声明置于程序或被包含的函数的最外层以避免不可移植的行为。

第16条 避免使用eval创建局部变量
避免使用eval函数创建的变量污染调用者的作用域。

如果eval函数代码可能创建全局变量,将此调用封装到嵌套的函数中以防止作用域污染。

第17条 间接调用eval函数优于直接调用
尽可能间接调用eval函数,而不要直接调用eval函数。

第3章 使用函数
第18条 理解函数调用、方法调用及构造函数调用之间的不同
方法调用将被查找方法属性的对象作为调用接收者。

函数调用将全局对象作为其接收者。

构造函数需要通过new运算符调用,并产生一个新的对象作为其接收者。

第19条 熟练掌握高阶函数
高阶函数无非是那些将函数作为参数或返回值的函数。

第20条 使用call方法自定义接收者来调用方法
使用call方法可以调用在给定对象中不存在的方法。

第21条 使用apply方法通过不同数量的参数调用函数
使用apply方法指定一个可计算的参数数组来调用可变参数的函数。

第22条 使用arguments创建可变参数的函数
JavaScript给每个函数都隐式地提供了一个名为arguments的局部变量。

第23条 永远不要修改arguments对象
永远不要修改arguments对象。

使用[].slice.call(arguments)将arguments对象复制到一个真正的数组中再进行修改。

第24条 使用变量保存arguments的引用
当引用arguments时当心函数嵌套层级。

绑定一个明确作用域的引用到arguments变量,从而可以在嵌套的函数中引用它。

第25条 使用bind方法提取具有确定接收者的方法
要注意,提取一个方法不会将方法的接收者绑定到该方法的对象上。

使用bind方法创建绑定到适当接收者的函数。

第26条 使用bind方法实现函数柯里化
将函数与其参数的一个子集绑定的技术称为函数柯里化。

使用bind方法实现函数柯里化,即创建一个固定需求参数子集的委托函数。

传入null或undefined作为接收者的参数来实现函数柯里化,从而忽略其接收者。

第27条 使用闭包而不是字符串来封装代码
当将字符串传递给eval函数以执行它们的API时,绝不要在字符串中包含局部变量引用。

接受函数调用的API优于使用eval函数执行字符串的API。

第28条 不要信赖函数对象的toString方法
由于在不同的引擎下调用toString方法的结果可能不同,所以绝不要信赖函数源代码的详细细节。

toString方法的执行结果并不会暴露存储在闭包中的局部变量值。

通常情况下,应该避免使用函数对象的toString方法。

第29条 避免使用非标准的栈检查属性
避免使用非标准的arguments.caller和arguments.callee属性,因为它们不具备良好的移植性。

避免使用非标准的函数对象的caller属性,因为在包含全部栈信息方面,它是不可靠的。

第4章 对象和原型
第30条 理解prototype、getPrototypeOf和__proto__之间的不同
C.prototype用于建立由new C()创建的对象的原型。

Object.getPrototypeOf(obj)是ES5中用来获取obj对象的原型对象的标准方法。

obj.__proto__是获取obj对象的原型对象的非标准方法。

JavaScript中的类本质上是一个构造函数(User)与一个用于在该类(User.prototype)实例间共享方法的原型对象的结合。

第31条 使用Object.getPrototypeOf函数而不要使用__proto__属性
使用符合标准的Object.getPrototypeOf函数而不要使用非标准的__proto__属性。

在支持__proto__属性的非ES5环境中实现Object.getPrototypeOf函数。

第32条 始终不要修改__proto__属性
避免修改__proto__属性的最明显的原因是可移植性问题,因为并不是所有的平台都支持修改对象原型的特性,所以根本无法编写可移植的代码。

可以使用ES5中的Object.create函数来创建一个具有自定义原型链的新对象。

第33条 使构造函数与new操作符无关
通过使用new操作符或Object.create方法在构造函数定义中调用自身使得该构造函数与调用语法无关。

当一个函数期望使用new操作符调用时,清晰地文档化该函数。

第34条 在原型中存储方法
将方法存储在原型中,使其可以被所有的实例使用,而不需要存储方法实现的多个副本,也不需要给每个实例对象增加额外的属性。

第35条 使用闭包存储私有数据
JavaScript为信息隐藏提供了一种非常可靠的机制—闭包。闭包是一种简朴的数据结构,它们将数据存储到封闭的变量中而不提供对这些变量的直接访问。

闭包变量是私有的,只能通过局部的引用获取。

将局部变量作为私有数据从而通过方法实现信息隐藏。

第36条 只将实例状态存储在实例对象中
共享可变数据可能会出问题,因为原型是被其所有的实例共享的。

将可变的实例状态存储在实例对象中。

第37条 认识到this变量的隐式绑定问题
this变量的作用域总是由其最近的封闭函数所确定。

使用一个局部变量(通常命名为self、me或that)使得this绑定对于内部函数是可用的。

第38条 在子类的构造函数中调用父类的构造函数
在子类构造函数中显式地传入this作为显式的接收者调用父类构造函数。

使用Object.create函数来构造子类的原型对象以避免调用父类的构造函数。

第39条 不要重用父类的属性名
留意父类使用的所有属性名。

不要在子类中重用父类的属性名。

第40条 避免继承标准类
Length的行为只被定义在内部属性[[class]]的值为“Array”的特殊对象中。

继承标准类往往会由于一些特殊的内部属性(如[[class]])而被破坏,所以最好避免继承以下的标准类:Array、Boolean、Date、Function、Number、RegExp或String。

使用属性委托优于继承标准类。

未完待续...
————————————————
版权声明:本文为CSDN博主「Gyoung阿广」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012755393/article/details/83415321

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值