《JavaScript语言精粹》勘误表
小马在《JavaScript语言精粹》的译者序中写道:“吉尔伯特海特(美国教育家)曾经说过:写了一本很糟糕的书只是犯错而已,而把一本好书翻译得很糟糕则是犯罪。但这样的大师经典之作,即便是冒着犯罪的风险,也值得翻译出来并推荐给大家。”这里就是弥补过错的地方,热烈欢迎您来帮助我们改正。
-
前言的致谢小节第3行2009.09.02
“Julien LeComte”应是“Julien Lecomte” -
16页表2-1右边第3排2009.09.02
“取模”应是“取余运算” -
20页,3.1 对象字面量小节的第3行代码2009.12.08
“Jerome”应是“Joe”
贡献者:约翰 -
23页,3.5节最后一行2009.12.08
“第6章”应是“第5章”
贡献者:约翰 -
28页,方法调用模式小节的第1段代码2009.09.03
“value:0;”应是“value:0,” -
29页,第一段代码的最后一句2009.11.15
document.writeln(myObject.getValue( )); // 6 //应该修改为 document.writeln(myObject.value); // 6贡献者:约翰
-
30页,第1段代码的最后1行2009.09.11
“// 令人困惑”应是“// confused”
贡献者:糖伴西红柿 -
30页,最后1行注释2010.09.22
“// stats 值为 ‘A-OK’”中的“stats”应该是“status”
贡献者:约翰 -
32页,4.6 异常小节第2段代码的最后1行2009.09.03
“Try_It();”应是“try_it();” -
33页,第2段代码及其前1行2009.09.03
“Math.ceiling”应是“Math.ceil”,“return Math[this < 0 ? 'ceiling' : 'floor'](this);”中“ceiling”应是“ceil” -
33页,最后一段代码2009.10.14
"if"条件语句结束后加入“return this;”,可以参考本页的第一段代码
贡献者:约翰 -
34页,4.8 递归的第1段代码2009.09.03
最后1个“}”后面应该加上分号变成“};” -
37页,第1段代码的倒数第2行2009.09.03
“}”后面应该加上分号变成“};” -
37页,最后一段2010.09.22
“为什么要用一个getter方法去访问”应该是“为什么要用一个获取方法去访问”
贡献者:约翰 -
39页,第1段代码的倒数第3行2009.09.03
紧接着“alert(i);”的“}”后面应该加上分号变成“};” -
39页,第2段代码块第6行2009.06.08
“alert(e);”应为“alert(i);”
贡献者:李穆 -
39页中间2009.09.03
“add_the_handlers函数目的是给每个时间处理器一个唯一值(i)”中“时间”应是“事件” -
42页,第1段代码的最后1行2009.09.11
“// unique is "Q1000"”应是“// unique 的值是 "Q1000"” -
44页,“译注5”应改为“译注6”,“译注6”应改为“译注7”。2009.12.08
贡献者:约翰 -
47页,5.1 伪类的第2段第1句2011.02.11
“当一个函数对象被创建时,Function 构造器产生的函数对象会运行类似这样的一些代码”应为“创建函数对象时,生成该函数对象的 Function 构造器会运行类似如下代码”
贡献者:Wei Lou -
47页,5.1 伪类的第2段代码2009.09.03
“var that = Object.beget(this.prototype)”后面应该加上分号变成“var that = Object.beget(this.prototype);” -
50页,5.2 对象说明符的第2段代码2009.09.03
“first: f,”后应增加1行“middle: m,”
贡献者:sofish -
51页,第1段代码2009.09.03
“return this.says + ' ' + this.name + ' ' + this.says;”应为“return this.says() + ' ' + this.name + ' ' + this.says();” -
52页,第1段代码的最后1行2009.09.03
“}”后面应该加上分号变成“};” -
54页,第2段代码2009.09.03
“return that;”前面应增加1行“};” -
59页,底部译注12010.06.19
“232-1”应该为“232-1”,即2的32次方减1。
贡献者: Landy Van Roy -
60页,6.3节的倒数第2行2009.06.08
“值为‘shi’的属性的键值从‘4’变到‘3’”中“‘4’变到‘3’”应是“‘3’变到‘2’”
贡献者:李穆 -
63页,6.7 维度第1段代码
“return a;”的下1行“}”后面应该加上分号变成“};” -
64页,第2段代码2009.09.03
两处“return mat;”的下1行“}”后面应该加上分号变成“};” -
64页,第2段代码2009.09.03
“a[j] = 0;”应为“a[j] = initial;” -
65页,第2段2011.05.01
“它以方法的形式被用于对字符串中的信息进行查找、替换和提取操作。”改成“它和与之对应的方法一起用于查找、替换和提取字符串中的信息。” -
65页,最后一段2011.04.29
“正则表达式的书写规则出奇地复杂,因为它们把某些位置上的字符串解析为运算符,而把仅在位置上稍微不同的相同字符串当作字面量。比不易书写更糟糕的是,这使得正则表达式不仅难以阅读,而且修改时充满危险。”改成“正则表达式的书写规则出奇复杂,因为它们会把某些位置上的字符解析为运算符,而位置稍有不同时又解析为字面量。比不易书写更糟糕的是,这样的正则表达式不仅难以阅读,而且给修改带来风险。” -
69页,注释2009.09.03
“+)?(?::”应为“+)(?::” -
71页,第2段代码2009.09.03
“"\"(?:\\.”应为“"\"(?:\\\\.” -
72页,第1段代码2011.05.11
这个地方应该加入一个译者注:在本书出版时ECMAScript5规范尚未发布,此处代码的运行结果遵循ECMAScript3规范,结果和在Firefox3.6中执行一致。Firefox、Chrome和Safari的最新版本都支持ECMAScript5,而IE在这个问题没有遵循ECMAScript3规范,所以此时正则表达式创建的RegExp对象都是独立的实例,输出值是0。具体可以参考ECMAScript5规范的第24页和第247页,以及《正则表达式字面量在ECMAScript5中的变化》。
贡献者:郑苏波 -
74页,第2段代码2009.09.03
“/[A-Za-z\u00C0-\u1FFF\u2800-\uFFFD'\-]+\s+\1/gi”应为“/([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD'\-]+)\s+\1/gi” - 76页,“下面是在字符类中需要被转义的特殊字符:”2011.05.11
此处需要加入译者注:ECMAScript5规范第247页指出未转义的正斜杠“/”可以直接用于字符类中,但在ECMAScript3中正斜杠“/”只能用于正则表达式的开始和结束字符,虽然所有主流浏览器都支持了ECMAScript5实现,但本书在这个问题上遵循ECMAScript3规范。对于任何特殊字符都可以使用反斜杠来使其字面化,保证其安全。 -
80页,第1行2010.07.21
“rray”应该是“array”
贡献者:Landy Van Roy -
88页,
string.charAt(pos )小节2009.09.03String.method('charAt', function () { return this.slice(0, 1); }); //应为 String.method('charAt', function (pos) { return this.slice(pos, pos + 1); }); -
90页,第3段代码最后1行注释2009.09.03
“p 是 '555-555-1212'”应为“p 是 '555-666-1212'”
贡献者:Wei Lou -
91页,
string.split(separator, limit )小节第1段代码最后1行注释2009.09.04
“['0', '1', '2', '3', '456789']”应为“['0', '1', '2', '3', '4']” -
96页,倒数第2段第1行2010.07.21
“JavaScripty拥有C语言的语法”中的“JavaScripty”应该是“JavaScript”
贡献者:Landy Van Roy -
105页,
A.10. NaN小节的最后1段代码2009.09.04function isNumber(value) { return typeof value === 'number' && isFinite(value); } //应为 var isNumber = function isNumber(value) { return typeof value === 'number' && isFinite(value); }; -
107页,译注7最后面2011.02.15
“function Object() { [native code] }”的最后面遗漏了“1”,应该是“function Object() { [native code] }1”。
贡献者:Wei Lou -
117页,表C-1,JSLint的选项2009.09.04
删掉glovar,见http://www.jslint.com/lint.html -
140页,E.3 一个JSON解析器2009.09.04
escapee字面量第1个和倒数第2个键值对代码结尾缺少逗号escapee = { '"': '"' '\\': '\\', '/': '/', b: 'b', f: '\f', n: '\n', r: '\r' t: '\t' }, //应为 escapee = { '"': '"', '\\': '\\', '/': '/', b: 'b', f: '\f', n: '\n', r: '\r', t: '\t' },贡献者:Wei Lou



[...] 勘误表 [...]
你好,提供个 javascript 精粹的错误。40页。
// 构造一个 Quo 实例
其中 document.writeln(myQuo.get_status()); // 令人困惑
后面的注释,应该是 返回 confused 这个字符串。感觉这个地方不应该翻译吧,容易引起误解。
“取模”和“取余运算”?这个在数学正确性上没区别呀。
@糖伴西红柿:多谢。这的确是一个翻译错误,位于在30页,我已经增加到勘误表中。
@Sutra:取模(modulo)和取余(remainder)大部分情况下是等同的,但是还是有些不同,取模结果的符号和除数相同,取余结果符号和被除数相同,而JavaScript中的%和取余相同:
3 modulo 2 = 1
3 modulo -2 = -1
-3 modulo 2 = 1
-3 modulo -2 = -1
3 remainder 2 = 1
3 remainder -2 = 1
-3 remainder 2 = -1
-3 remainder -2 = -1
15. 50页,5.2 对象说明符的第2段代码 “middle:m,”后应增加1行“last:l,”
似乎是: “first:f,”后应增加1行“middle: m,”…
@sofish:你是对的,我本意想写的是“last:l,”后应增加1行“middle:m,”,结果写反了。不过你的建议更能表达这个例子的含义,所以我采用了你的建议。非常感谢。
首页那个《JavaScript语言精粹》勘误表的图片里少了个“粹”字。
@xthsky:这真是一个很讽刺的事情哈,做图那天被出了问题的PS给整郁闷了,也没有仔细检查,所以就出了这出戏了。多谢,多谢。
有一个问题请教,在书本35页,定义的getElementsByAttribute函数里有这么一行代码:
var actual=node.nodeType===1&&node.getAttribute(att);不是很明白,还有,node是不是要先声明呢?有好心人给我讲解下这个函数,更好。
谢谢了!
整个函数如下:
walk_the_DOM是一个遍历整个DOM树函数,它有2个参数node是根节点,func是一个要对遍历到的节点进行操作的函数。这是一个典型的递归函数。
关于函数的细节可以看27页的4.2节。
getElementsByAttribute函数有两个参数,att表示属性,value是可选的属性值,这个函数调用了wal_the_DOM函数,改写后或许可以看得更明白点:
另外如果对这种长表达式的运算顺序感到迷惑可以看看16页表2-1的运算符优先级。
秦歌,你好!
我公司正在寻觅JS开发高手,薪水绝对有吸引力。有兴趣请联系:zqrain@yeah.net 或 MSN: qingrui_zeng(at)hotmail.com
公司简介:
开拓天际是一家专注于无线技术领域的IT公司。我们公司一贯比较低调,有别于国内大多数公司在技术和管理上比较浮躁的,我们一直眼光高远,非常注重在技术上深入积累,形成核心竞争力。在管理上,公司在文化上非常重视一线员工的创造力和贡献,公司CEO到各阶层管理人员,都十分“亲民”,十分尊重一线员工。所以这里相比国内其他公司(包括相比一些知名外企),离职率是非常低的。我们的工程师队伍中,有大量来自国内外一流公司的员工和国内著名大学的毕业生(包括Oracle,Motorola,Nokia,AOL,网易,易查等等)。在公司发展上,我们属于国内中型偏大的IT公司,技术实力,资金实力和市场营销能力都是十分不错的。同时,公司处于战略转型的关键期,公司的发展潜力和员工的发展空间都是非常巨大。
呵呵,感谢您的关注,不过目前没有这方面的计划,欢迎就前端相关的任何问题进行交流。
Hi,我想问问,P39页的第一段代码的第四行”…function(e){ “第五行”alert(i);” 这个e在这里做什么?好像没有用?
接上一问题,是不是应该像第11条勘误一样,把第五行的i改成e呢?
貌似是去掉第四行的e?
呵呵,不是,那个e是传入事件参数,比如你在非IE浏览器中运行一下,注意我新增加了alert(e):
在IE下会弹出undefined,因为IE的事件保存在window.event上。
第2短段return function(e)这个e的意义是一样的。
29页,第一段代码的最后一行是不是错了?
getValue应该是value吧?
113页,
var foo = function foo() {};
应该是:
var foo = function () {};
吧?
@约翰:29页那个的确是个错误,您的修正也是对的,已添加到勘误表中,非常感谢。113页那个没错,两种写法都是对的,第一种写法中的那个foo可以省略,它主要用于递归。具体细节可以看看27页的4.2节。
11 页底部 “下面列出的值被当做假(falsy)”,falsy 应该改为 false 。
@DemoJameson :falsy即假值就是相对于truthy即真值来说。这个地方没有错,它是说下面列出的false、null、undefined、’ ‘、0和NaN都是假值falsy。多谢。
更正中的第3条,21页,3.2 检索小节的第1行代码
“Joe”应是“Jerome”
不如把20页中的Jerome改为Joe,否则22页的3.3更新很难理解,因为其中的第一行代码也是Jerome,没有任何“更新”。而把20页的Jerome改为Joe后,22的代码意思就是:把Joe更新为Jerome,而21页无须更正。
一个疑问,向你们请教。
第48页第二行中saying 看不懂,前面(包括前一页)似乎没有定义,到了11行似乎才出现定义,这一页下面的代码也读不太懂,望译者能够做些说明。
[...] 鄢学鵾曾与淘宝的小马一起翻译了 Douglas Crockford 的大作《JavaScript语言精粹》。 [...]
这本书非常不错,是我床头必备书籍之一……
再提交一个印刷错误:
第44页,译注5应为译注6,译注6应为译注7.
我愿意向译者提供翻译或印刷错误,可惜没人对我前面的疑问回答,失望啊。
@约翰:
1、您在#23提出的修改方案的确是非常恰当的方式。
2、#27提出的印刷错误的确存在非常感谢。
3、48页的saying和前面一页定义是一样,都是对构造函数Mammal原型的扩充,并且当this.saying不存在时返回空。对原型进行扩充是为了实现基于原型的继承,所使用的属性并不需要构造函数一定定义了,如果理解还是比较费劲建议多看看上一章函数以及找一些prototype相关的资料。
4、49页是一个典型函数链式调用,这种方式在jQuery和YUI3.0中大量使用,看起来比较方便,这段代码本身是对48页倒数第二段那整段代码的重构,这段函数其实可以等同于:
最后,非常感谢你对本书的关注和建议。另外,最近一直在生病,加上乱七八糟的事情集中在一起,如果不及时的回复让你失望,实在抱歉。
第7页的name的铁路图,name最下面的那一条走线圆圈里面到底是 _ 还是 – 让人分不清
想和秦歌讨论个问题,我在实际的使用中标识符常常以下划线开头,这样的使用从书上看是不规范的,额,书中的第七页的name铁路图指示必须以letter开头,但是使用的时候用下划线开头也没有引发什么错误,你怎么看这个规范
@KUN10 : 第7页的铁路图还好吧,可能是周围没有字母作为参照物所致。至于6页2.2小节中,作者对标识符的定义是比ECMA262中定义的窄的问题,也有朋友问过我,我准备在下一版的时候,增加一个注释来说明这个问题。原因是作者认为很多人以_作为私有变量的开头,但是JavaScript中没有私有变量,容易让人误解,私有变量应该采用私有成员的组成形式。这些想法作者在《JavaScript程序编码规范》中有说明。
译言翻译了这篇文章,由于译言出了意外,所以我就做了一个人工快照。但我发现有些地方漏掉翻译,或者不准。我准备找个时间重新整理一下。
您好,秦歌,请问能否对第49页部件一小节做一个解释,兴许是我的理解力问题,这一节感觉比较费力…thx
错了,是第55页~
大哥,俺昨天真的就被P30的“// 令人困惑”困惑了好久,今天发到CSDN求达人解惑,又困惑了一群人。
《javascript语言精粹》里4.12节函数模块里的一个例子:
String.method(‘deentityify’,function(){
var entity={
quot:’”‘,
lt: ”
};
return function() {
return this.replace(/&([^&;]+);/g,function(a,b) {
var r=entity[b];
return typeof r===’string’?r:a;
}
);
};
}());
document.writeln(‘<">’.deentityify());
在 firefox里一定会报错,我不知道为什么作者在给原型添加方法时要用object.method(name,func)这种形式,我把上面的例子改为:
String.prototype.deentityify=function(){
var entity={
quot:’”‘,
lt: ”
};
return function() {
return this.replace(/&([^&;]+);/g,function(a,b) {
var r=entity[b];
return typeof r===’string’?r:a;
}
);
};
};
document.writeln(‘<">’.deentityify());
结果输出的是:
function () { return this.replace(/&([^&;]+);/g, function (a, b) {var r = entity[b];return typeof r === “string” ? r : a;}); }
明明返回的是个函数对象,怎么输出这么个结果?
我又试着将第8行的return function() { 和 第15行的};注释掉,然后运行得到了正确结果: 。
不知道有没有高人指点一下这个程序的问题所在,还有书上表示希望利用函数作用域和闭包来使得只有deentityify方法有权访问entity这个数据对象。我不清楚如果将第8、15行注释掉,是否还能达到这个效果?另外,如果不能注释掉的话,这个程序应该怎么改?
秦歌 为什么我String或者Fonction . method方法不能用
发错一个错误,P40的原代码有错误
应该更正为
@tyfor & @有光 :你们的问题是相同的,在整个第四章例子是相互贯穿的,在33页 4.7中,作者通过Function.prototype.method给Function原型增加了方法,这样String和Number等都会继承该方法,两位之所以运行失败,是没有前面的增加method到Function原型的代码。加上之后,一切都ok了。
@kenn:这个地方没有错,29页的方法是解决在函数中非对象方法的函数引用时this是全局对象的错误设计,但此处是返回一个定义函数,这个函数通过method方法将变成String的一种方法,所以此时的this就是String。
23页,3.5节最后一行,“第6章”似乎应该是“第5章”。
@约翰:的确是这样,原文也错了,已加入勘误表中,多谢。
37页,倒数第5行,“getter方法”应该是“get_status方法”吧?
另外,30页的拼写错误:stats 应是status
47页,“如果 new 运算符是一个方法而不是一个运算符,”这话不好懂,是不是指“如果 new 是一个方法而不是一个运算符,”?
一个问题需要帮助:
33页中最后一段代码,是不是漏了一句代码:return this;
请比较这一页的第一段代码。
@约翰:47页的说法是ok的,new本身就是一个运算符,此处想说的是“如果new运算符不是一个运算符”,其余你提出的问题都很的确存在,具体修改方案请看上面的勘误表。
你好,第一版印刷错误比较多,想请问一下什么时候会有修正好的再版?
收藏了,正在看。这本书貌似没提到隐式__proto__,有些地方让人疑惑。
在第49页中,“我们的inherits和method方法都返回this”,其中,method方法是在第33页定义的。method方法并没有返回this啊,事实上没有指定return,那就是反馈undefined了。
既然method没有返回this,那么49页就不能有2个级联一起使用了,第二个method应该会出问题的。
请大家指教!谢谢!
@weilou:你的理解是对的,第四章的代码是贯穿的,但33页最下面method的定义漏掉了return this,所以导致误解,在勘误表中也说明了这个问题,希望出版社能够在第三版中纠正这个问题。
勘误做的不错,可是重新印刷的时候为什么不把这些错误修正了呢。
手里的书是10年5月第二次印刷的,上述错误无一修改。
另外P39页那段 better example 代码跟英文版不同啊,是版本的问题么?英文版是定义了一个helper函数,中文版里是个匿名函数。
92页里也有错误,在string.toLocaleLowerCase()那一段
> 因为在土耳其语中‘I’转换为‘1’,而不是‘i’
我考据一下,那个不是数字“1”,而是一个unicode字符“ı”
见 http://zh.wikipedia.org/zh/%E5%B8%A6%E7%82%B9%E4%B8%8E%E4%B8%8D%E5%B8%A6%E7%82%B9I
下面的string.toLocaleUpperCase(),也有类似错误
> 因为在土耳其语中`i’转换为`I’,而不是`I‘。
单引号错误。
当然不知道是不是字体问题了,但我在维基页面在文泉驿正黑和xp自带的宋体都可以明显看出这几个字母是不同的。
终于明白什么样的模板看久了会看什么都是斑马线了。
请问此书会发行第二版吗,现在网上缺货,我们这个地区已经买不到了
再说一处错误:
P81 by函数倒数第五行“ ……sorting by’ + name; ”中最后的分号要去掉,同样的错误还出现在P82
[...] 技术和业务间的结合。业余时间参入翻译了Douglas Crockford的《JavaScript语言精粹》和Steve Souders的《高性能网站建设进阶指南》,博客是http: [...]
您修改的第19条:44页,“译注5”应改为“译注6”,“译注6”应改为“译注7”。
44页更本没有译注7
修订版的勘误:
12页,倒数第4行
“首先,执行condition,”是“首先,执行initialization,”
修订版
29页,第一部分代码倒数第1行
去掉 //6
【接上】
我理解6是接着方法调用模式的代码写的,不过由于两段代码分开并不方便阅读,29页的代码也不需要依赖29页的代码运行,因此觉得原版(不写注释)的方式处理较为妥当
更正:不需要依赖28页的代码运行
想看看这本书
你的铁路图的说明翻译的不怎么通顺
这本书的第一章第一个试验场。
document.writeln(‘hello,world!’)
这个例子作者想表达什么意思?打开浏览器什么也看不到呀?
这个例子根本就不能运行。
求解