出版社: 电子工业出版社
原作名: JavaScript:The Good Parts
译者: 赵泽欣 / 鄢学鹍
出版年: 2009-4
页数: 155
定价: 35.00元
装帧: 平装
丛书: O'reilly系列
ISBN: 9787121084379
内容简介 · · · · · ·
本书通过对JavaScript语言的分析,甄别出好的和坏的特性,从而提取出相对这门语言的整体而言具有更好的可靠性、可读性和可维护性的JavaScript的子集,以便你能用它创建真正可扩展的和高效的代码。
雅虎资深JavaScript架构师Douglas Crockford倾力之作。
向读者介绍如何运用JavaScript创建真正可扩展的和高效的代码。
作者简介 · · · · · ·
Douglas Crockford是一名来自Yahoo!的资深JavaScript架构师,以创造和维护JSON (JavaScriptObject Notation) 格式而为大家所熟知。他定期在各类会议上发表有关高级JavaScript的主题演讲。
目录 · · · · · ·
第1章 精华 1
为什么是JAVASCRIPT? 2
分析JAVASCRIPT 3
一个简单的试验场 4
第2章 语法 5
空白 5
标识符 6
数字 7
字符串 8
语句 10
表达式 15
字面量 17
函数 19
第3章 对象 20
对象字面量 20
检索 21
更新 22
引用 22
原型 22
反射 23
枚举 24
删除 24
减少全局变量污染 25
第4章 函数 26
函数对象 26
函数字面量 27
调用 27
参数 31
返回 31
异常 32
给类型增加方法 32
递归 34
作用域 36
闭包 37
回调 40
模块 40
级联 42
套用 43
记忆 44
第5章 继承.. 46
伪类 47
对象说明符 50
原型 50
函数化 52
部件 55
第6章 数组 58
数组字面量 58
长度 59
删除 60
枚举 60
混淆的地方 61
方法 62
维度 63
第7章 正则表达式 65
一个例子 66
结构 70
元素 72
第8章 方法 78
第9章 代码风格 94
第10章 优美的特性 98
附录A:糟粕 101
附录B:鸡肋 109
附录C:JSLINT 115
附录D:语法图 125
附录E:JSON 136
索引 147
· · · · · · (收起)
原文摘录 · · · · · · ( 全部 )
-
We all find the good parts in the products that we use. We value simplicity, and when simplicity isn’t offered to us, we make it ourselves. My microwave oven has tons of features, but the only ones I use are cook and the clock. And setting the clock is a struggle. We cope with the complexity of feature-driven design by finding and sticking with the good parts. It would be nice if products and programming languages were designed to have only good parts. (查看原文) —— 引自第100页 -
Because of a design error, arguments is not really an array. It is an array-like object. arguments has a length property, but it lacks all of the array methods. (查看原文) —— 引自第31页
> 全部原文摘录
丛书信息
喜欢读"JavaScript语言精粹"的人也喜欢的电子书 · · · · · ·
喜欢读"JavaScript语言精粹"的人也喜欢 · · · · · ·
JavaScript语言精粹的话题 · · · · · · ( 全部 条 )



JavaScript语言精粹的书评 · · · · · · ( 全部 45 条 )
> 更多书评 45篇
-
王选易 (2018年度书籍:21世纪资本论)
参数 当函数被调用时,会得到一个“免费”的参数,那就是arguments数组。通过它函数可以访问所有它被调用时传递给它的参数列表,包括那些多余参数,arguments有一个属性是length。 因为语言的设计错误,arguments不是一个数组,而是一个类似数组的对象,arguments缺少数组的方法。2013-12-27 14:00 1人喜欢
-
函数化编程 // 函数方法化 将静态函数变换为方法 function methodize(fun, attr){ return function(){ var args = [].slice.call(arguments), self = attr?this[attr]:this; return fun.apply(null, [self].concat(args)); } } // 数组循环静态函数 var forEach = function(arr,callback,pThis){ for (var i =0,len=arr.length;i<len;i++){ if (i in arr) callback.call(pThis,arr[i],i,arr); } } //数组追加静态函数 var ad...
2011-05-19 04:53 4人喜欢
函数化编程
// 函数方法化 将静态函数变换为方法 function methodize(fun, attr){ return function(){ var args = [].slice.call(arguments), self = attr?this[attr]:this; return fun.apply(null, [self].concat(args)); } } // 数组循环静态函数 var forEach = function(arr,callback,pThis){ for (var i =0,len=arr.length;i<len;i++){ if (i in arr) callback.call(pThis,arr[i],i,arr); } } //数组追加静态函数 var add = function(x,y){ x.push(y); return x; } //方法化 Array.prototype.forEach = methodize(forEach); Array.prototype.add = methodize(add); //方法函数 Array.prototype.forEach2 = function(fn,idx){ for (var i =0,len=this.length;i<len;i++){ if (i in this) fn.call(idx,this[i],i,this); } }; //测试 function print(el,index){ console.log(index+" : "+el); } [1,2,3].forEach(print); [1,2,3].forEach2(print); console.log([1,2,3].add(2));
用函数式编程技术编写优美的 JavaScript http://www.ibm.com/developerworks/cn/web/wa-javascript.html 函数式JavaScript编程指南 http://shiningray.cn/functional_javascript_programming.html
回应 2011-05-19 04:53 -
德鲁 (定慧一体/Eudaimonia)
《JS精粹》 第一章 Method: Function.prototype.method = function(name, func){ This.prototype[name] = func; Return this; }; 第二章 第三章 对象 JS除了五个基本元素(数字布un)一切都是对象 对象字面量:包围在多个花括号里的键值对 创建键名只用_链接字符不用- 检索只用点语法 复制只是引用不会复制内容(所以对象只有一个?) 正因为复制使用的是指针,所以用到了原型,构建新对象,显化过程为create方法: Create: If(...2018-07-16 12:52
《JS精粹》
第一章
Method:
Function.prototype.method = function(name, func){
This.prototype[name] = func;
Return this;
};
第二章
第三章 对象
JS除了五个基本元素(数字布un)一切都是对象
对象字面量:包围在多个花括号里的键值对
创建键名只用_链接字符不用-
检索只用点语法
复制只是引用不会复制内容(所以对象只有一个?)
正因为复制使用的是指针,所以用到了原型,构建新对象,显化过程为create方法:
Create:
If(typeof Object.beget !== ‘function’){
Object.creat = function(o){
Var F = function(){};
F.property = o;
Return new F();
};
}
Var another_storage = Object.create(storage);
原型链:
1委托(寻找),找不到自己对象内的会向原型去找
4删除暴露原型链
2反射function,typeof确定类型,原型链只有function,hasOwnProperty不查原型链
3用数组存储键名依次枚举即只用for不用for in,同时避免乱序
5程序只用一个全局变量对象全大写MYAPP,不同属性存不同用处的变量
第四章 函数
编程:将一组需求分解成一组函数与数据结构的技能
函数的隐藏属性:上下文和行为代码
(函数不同之处在于可以被调用?)
调用:暂停当前函数,传递控制权和参数给新函数(包括新参数this和arguments)
调用模式的区别在于this:
1保存为属性调用被称为“方法”,指向对象(公共方法:通过this选择到的所属对象上下文的方法)
2函数写在属性内,用var that = this的方式,内部函数可以调用属性的方法
3函数用new来调用,利用基于原型的特性,用一个函数这个对象作为原型构建新的对象
4.apply可以相当于f()作用于x之上,把别的函数的方法用到这个x上面,第一个参数就是要作用的x,第二个参数是一个数组
Arguments是有length的对象
函数前面带new调用时候不返回对象而是返回this(一个新对象)
异常throw会抛出一个自带的e,可以catch(e)并且看看是什么
扩充类型功能:只在符合条件的时候才增加方法
Function.protype.method = function(name, func){
If(!this.prototype[name]){
This.prototype[name] = func;
}
Return this;
};
通过method来去除每次增加方法必写的protyotype内容
递归:尾递归在return处调用自身(速度提高的原因?)
作用域:特别JS中应在函数内对所有变量提前声明
闭包:
Var myObejct = ( function(){}() )此时得到的是一个函数定义后调用的结果,此时函数返回的对象可以调用函数内容,闭包模式的构造函数也就可以产生
不要在循环中产生函数,要尽量先定义后使用
模块:lamada写法和普通函数写法,两者都是为了定义函数内变量+返回函数或者对象,使得此时的函数内变量成为私有变量避免了全局变量的使用,明显私有变量可以使用var
级联:返回this而非undefined的链接写法
柯里化:传递带参的函数构建新函数
Var add1 = add.curry(1)
Log(add1(6))
记忆:动态规划的一种思路,自己在递归或者其他计算过程保存中间值并且计算过程中不断判断是否已经存在来节省计算时间
Var fib = function(){
Var memo = [0, 1]
Var nfib = function(n){
Var result = memo[n]
If (typeof result[n] != ‘number’){
Result = fib(n - 1) + fib(n - 2)
Memo[n] = result
}
Return results
}
Retutrn nfib
}()
此时返回的是nfib,外面还有调用
第五章 继承
基于类的语言,对象来自于类
基于原型的语言,对象来自于对象
伪类模式:构造器调用模式的函数写出来一个自己的new实现类似类构建对象的方式,进一步用inherits写的方法隐藏new并且实现自己的内容,但是所有属性是公开的并且无法访问父类的内容。
对象说明符:构造器用到的函数参数可以用对象写出来并且顺序随意排列
原型模式:用第三章的create方法构造新的更多实例,这是一种“差异化继承”
New模式(千万别用new)
函数模式:生成对象的方式用构造生成对象的函数,不用再实现伪类的各种prototype直接关注差异化继承的内容,因为用模块模式已经实现被继承的对象。
使用superior方法可以实现对父对象的方法的使用。
(我的理解是函数构造模式和模块模式区别在于是否使用“参数+that”来待定生成一个对象)
部件:(怎么用?)
第六章 数组
只比一般对象多了一个length属性
没有多维数组
没有初始值
第七章 正则表达式
第八章 方法
回应 2018-07-16 12:52
-
德鲁 (定慧一体/Eudaimonia)
《JS精粹》 第一章 Method: Function.prototype.method = function(name, func){ This.prototype[name] = func; Return this; }; 第二章 第三章 对象 JS除了五个基本元素(数字布un)一切都是对象 对象字面量:包围在多个花括号里的键值对 创建键名只用_链接字符不用- 检索只用点语法 复制只是引用不会复制内容(所以对象只有一个?) 正因为复制使用的是指针,所以用到了原型,构建新对象,显化过程为create方法: Create: If(...2018-07-16 12:52
《JS精粹》
第一章
Method:
Function.prototype.method = function(name, func){
This.prototype[name] = func;
Return this;
};
第二章
第三章 对象
JS除了五个基本元素(数字布un)一切都是对象
对象字面量:包围在多个花括号里的键值对
创建键名只用_链接字符不用-
检索只用点语法
复制只是引用不会复制内容(所以对象只有一个?)
正因为复制使用的是指针,所以用到了原型,构建新对象,显化过程为create方法:
Create:
If(typeof Object.beget !== ‘function’){
Object.creat = function(o){
Var F = function(){};
F.property = o;
Return new F();
};
}
Var another_storage = Object.create(storage);
原型链:
1委托(寻找),找不到自己对象内的会向原型去找
4删除暴露原型链
2反射function,typeof确定类型,原型链只有function,hasOwnProperty不查原型链
3用数组存储键名依次枚举即只用for不用for in,同时避免乱序
5程序只用一个全局变量对象全大写MYAPP,不同属性存不同用处的变量
第四章 函数
编程:将一组需求分解成一组函数与数据结构的技能
函数的隐藏属性:上下文和行为代码
(函数不同之处在于可以被调用?)
调用:暂停当前函数,传递控制权和参数给新函数(包括新参数this和arguments)
调用模式的区别在于this:
1保存为属性调用被称为“方法”,指向对象(公共方法:通过this选择到的所属对象上下文的方法)
2函数写在属性内,用var that = this的方式,内部函数可以调用属性的方法
3函数用new来调用,利用基于原型的特性,用一个函数这个对象作为原型构建新的对象
4.apply可以相当于f()作用于x之上,把别的函数的方法用到这个x上面,第一个参数就是要作用的x,第二个参数是一个数组
Arguments是有length的对象
函数前面带new调用时候不返回对象而是返回this(一个新对象)
异常throw会抛出一个自带的e,可以catch(e)并且看看是什么
扩充类型功能:只在符合条件的时候才增加方法
Function.protype.method = function(name, func){
If(!this.prototype[name]){
This.prototype[name] = func;
}
Return this;
};
通过method来去除每次增加方法必写的protyotype内容
递归:尾递归在return处调用自身(速度提高的原因?)
作用域:特别JS中应在函数内对所有变量提前声明
闭包:
Var myObejct = ( function(){}() )此时得到的是一个函数定义后调用的结果,此时函数返回的对象可以调用函数内容,闭包模式的构造函数也就可以产生
不要在循环中产生函数,要尽量先定义后使用
模块:lamada写法和普通函数写法,两者都是为了定义函数内变量+返回函数或者对象,使得此时的函数内变量成为私有变量避免了全局变量的使用,明显私有变量可以使用var
级联:返回this而非undefined的链接写法
柯里化:传递带参的函数构建新函数
Var add1 = add.curry(1)
Log(add1(6))
记忆:动态规划的一种思路,自己在递归或者其他计算过程保存中间值并且计算过程中不断判断是否已经存在来节省计算时间
Var fib = function(){
Var memo = [0, 1]
Var nfib = function(n){
Var result = memo[n]
If (typeof result[n] != ‘number’){
Result = fib(n - 1) + fib(n - 2)
Memo[n] = result
}
Return results
}
Retutrn nfib
}()
此时返回的是nfib,外面还有调用
第五章 继承
基于类的语言,对象来自于类
基于原型的语言,对象来自于对象
伪类模式:构造器调用模式的函数写出来一个自己的new实现类似类构建对象的方式,进一步用inherits写的方法隐藏new并且实现自己的内容,但是所有属性是公开的并且无法访问父类的内容。
对象说明符:构造器用到的函数参数可以用对象写出来并且顺序随意排列
原型模式:用第三章的create方法构造新的更多实例,这是一种“差异化继承”
New模式(千万别用new)
函数模式:生成对象的方式用构造生成对象的函数,不用再实现伪类的各种prototype直接关注差异化继承的内容,因为用模块模式已经实现被继承的对象。
使用superior方法可以实现对父对象的方法的使用。
(我的理解是函数构造模式和模块模式区别在于是否使用“参数+that”来待定生成一个对象)
部件:(怎么用?)
第六章 数组
只比一般对象多了一个length属性
没有多维数组
没有初始值
第七章 正则表达式
第八章 方法
回应 2018-07-16 12:52 -
JavaScript允许给语言的基本类型扩充功能 Object.prototype.method Function.prototype.method 举例: Number.method('integer', function () { return Math[this < 0 ? 'ceil' : 'floor'] (this); }); String.method('trim', function () { return this.replace(/^\s+|\s+$/g, ''); });
2017-12-10 22:33
这本书的其他版本 · · · · · · ( 全部4 )
-
Yahoo Press (2008)9.1分 636人读过
-
电子工业出版社 (2012)9.1分 448人读过
-
东南大学出版社 (2009)9.1分 125人读过
以下书单推荐 · · · · · · ( 全部 )
谁读这本书?
二手市场
订阅关于JavaScript语言精粹的评论:
feed: rss 2.0
3 有用 泉子 2015-09-08
大部分内容似乎都曾经在网上读过,而且总共也就几篇博文的内容吧。不过看实体书还是有收获,更成体系的介绍和更多的心理信任感。只看书的话,js确实也不错的,但是当你要同时应对DOM/DHTML/CSS/JS以及其上的数多库的时候,只能说,期望晕菜的感觉能轻点...
3 有用 LipingTaBaBa 2010-05-31
有难度,不适合初学者
12 有用 ◇ 2015-08-09
看得真爽,求推荐类似的lisp/ruby/Python/haskell书!最短的篇幅讲清楚js语言的核心特性,示例代码不trivial,不是教你写一些傻不拉几的小程序,而都是用来揭示语言特点,或者构造核心组件。我基本完全没有js基础,两个下午看了正文一百页,重点的对象、函数、继承三章看了两遍,参考性质的6~8章大概一翻。dynamic+functor+closure很强大,但是面向对象机制还是没有... 看得真爽,求推荐类似的lisp/ruby/Python/haskell书!最短的篇幅讲清楚js语言的核心特性,示例代码不trivial,不是教你写一些傻不拉几的小程序,而都是用来揭示语言特点,或者构造核心组件。我基本完全没有js基础,两个下午看了正文一百页,重点的对象、函数、继承三章看了两遍,参考性质的6~8章大概一翻。dynamic+functor+closure很强大,但是面向对象机制还是没有带类语言来的自然,另外即使good part里面坑也是挺多的……第一章和最后两章有对编程语言、代码风格和软件工程的精炼论述。不适合编程新手,不过有经验的程序员(不需要写过js)看起来会很爽。 (展开)
1 有用 蓝太阳 2010-03-13
信息量密度大,不罗嗦,适合已经有一门语言功底的人快速掌握javaScript中值得学习和使用的部分,恰当而又全面。
0 有用 Tuberose野 2014-01-11
呵呵呵系列
0 有用 管理員 2021-03-02
大部分在网上看过,居然觉得精华是附录AB。适合初学者的书
0 有用 天外小hi 2021-02-24
很不错,但觉得2021年读它的价值不太大了
0 有用 Doris 2021-02-03
花几天看完了,总的感受是很简短(很不错!)但感觉没啥收获…比较喜欢的是正则表达式的介绍,非常详细耐心的描述。
0 有用 见当加奈美 2020-12-09
那真的牛逼
0 有用 思来享趣 2020-11-25
必读书。 结合《高性能JavaScript》一起食用更佳。 一遍走马观花看全貌,二遍重点突破长知识,三四五六求贯通。 作者的思想很受启发--- 一是建立语言子集,排除语言的毒瘤、糟粕,使用好它的精华部分。 二是对于那些大多数情况下表现很好,但是一旦出错很麻烦的特性,尽量不要贪图一时之欢。 三是知道自己的代码要做什么,即使牺牲简洁性也是必要的,比如对于正则表达式,不要追求简洁而让自己看不... 必读书。 结合《高性能JavaScript》一起食用更佳。 一遍走马观花看全貌,二遍重点突破长知识,三四五六求贯通。 作者的思想很受启发--- 一是建立语言子集,排除语言的毒瘤、糟粕,使用好它的精华部分。 二是对于那些大多数情况下表现很好,但是一旦出错很麻烦的特性,尽量不要贪图一时之欢。 三是知道自己的代码要做什么,即使牺牲简洁性也是必要的,比如对于正则表达式,不要追求简洁而让自己看不懂,如果对于代码要做什么都不知道,那么很可能会出问题。 (展开)