《JavaScript权威指南》第6版中文版 勘误记录(只记录中文版引入的新bug)

第3章

3.1.5节“日期和时间”的示例代码最后一行为 later.getUTCHours(),遗漏英文原版下一页后5行代码。

3.2.2节“转义字符”表3-1主体内容第一行\o应为\0 (数字0)。

3.8.2节“显式类型转换”本人认为译注6是多余的。

3.10节“变量作用域”第二个代码示例
myscope = “local”; //这里显式地声明了一个新的全局变量
应为
myscope = “local”; //这里隐式地声明了一个新的全局变量

3.10节“变量作用域”第三个代码示例缩进格式丢失。

3.10节“变量作用域”第三个代码示例最后一行
checkscope() // => “嵌套的作用域
注释部分应保持英文不翻译,应为
checkscope() // => “nested scope

3.10.2节“作为属性的变量”第一段
是全局对象的正常的可配值属性
应为
是全局对象的正常的可配置属性

第4章

第4章引言
程序中的常量是最简单的一类表达式。
应为
程序中的直接量是最简单的一类表达式。

4.5节“调用表达式”
包括当形参表达式的个数和函数定义中的实参的个数不匹配……
应为
包括当实参表达式的个数和函数定义中的形参的个数不匹配……

4.5节“调用表达式”
作为属性访问主题的对象和数组
应为
作为属性访问主体的对象和数组

4.8.2节“一元算术运算符”“递减(–)”
当递减运算符在操作符的右侧时,运算符和操作数之间不能有换行符。
应为
当递减运算符在操作数的右侧时,运算符和操作数之间不能有换行符。

4.8.3节“位运算符”“按位异或(^)”
位运算符“|
应为
位运算符“^

4.9.1节“相等和不相等运算符”严格相等(===)比较规则第2条
如果两个值都是null或者都是undefined,则它们不相等
应为
如果两个值都是null或者都是undefined,则它们相等

4.9.2节“比较运算符”
String.localCompare()方法
应为
String.localeCompare()方法

第6章

6.2.2节“继承”第三段
如果之前o继承自属性x
应为
如果之前o继承了属性x
下同,所有“继承自”都应改为“继承了”。

6.4节“检测属性”末节示例代码
//如果x是undefined、null、false、” “、0或NaN,则它保持不变
字符串中应没有空格:
//如果x是undefined、null、false、””、0或NaN,则它保持不变

6.8.2节“类属性”
本人认为译注7是多余的而且造成误导,实际原文的说法是对的。

6.8.3节“可扩展性”
Object.esExtensible()
应为
Object.isExtensible()

6.8.3节“可扩展性”第四段
Object.seal() …不过它已有的可写属性依然可以设置
建议翻译为
不过它已有的可写属性依然可以赋值

第7章

7.9.5节“reduce()和reduceRight()”
到目前位置
应为
到目前为止

7.9.6节“indexOf和lastIndexOf”
对于splice()方法
应为
和splice()方法一样

第8章

8.2.3节
Max.max()
应为
Math.max()

第9章

9.2节“类和构造函数”
var r = range(1, 3);
应为
var r = new Range(1,3);

9.4节“类的扩充” 第二段示例代码中的正则表达式

/function\s*([^()*]\(/

应为

/function\s*([^(]*)\(/

9.7节“子类”
覆盖(override)和重载(overload)在面向对象编程中是两个不同的概念,9.7节将所有的override都错误地翻译成了“重载”,应为“覆盖”。

9.7.2节“构造函数和方法链”
但它需要完全重新实现一个add()方法
应为
但它不需要完全重新实现一个add()方法

9.9.2节“作为私有命名空间的函数”
译注16:
“它们”是指构造函数创建的新实例
译者没有理解代码本意,“它们”是指需要导出的公用API

第10章

10.1.1节“直接量字符”表10-1
*o**
应为
*
0**

10.1.2节“字符类”表10-2

\w  任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W  任何不是ASCII字符组成的单词,等价于[^a-zA-Z0-9]

是字符而非单词,且遗漏原文中等价类的下划线,应为

\w  任何ASCII字符,等价于 [a-zA-Z0-9_]
\W  任何非ASCII字符,等价于 [^a-zA-Z0-9_]

10.1.3节”重复“例子
/\w{3}\d?/ // 精确匹配三个单词和一个可选的数字
建议翻译为
/\w{3}\d?/ // 精确匹配三个普通字符和一个可选的数字

10.1.5节“指定匹配位置”第四段

/Java(?! Script)([A-Z]\w*)/  

根据原文,断言中的文本并无开头的空格,应为

/Java(?!Script)([A-Z]\w*)/

10.1.5节“指定匹配位置”第四段
它可以匹配“JavaScript”,但不能匹配“JavaScripter”。
根据原文,应为
它可以匹配“JavaScrip”,但不能匹配“JavaScript”或“JavaScripter”。

10.3.2节“RegExp方法”最后一段
要么在每个字符串中找出所有的匹配以便将lastIndex自动重置为零,要么显式将lastIndex手动设置为0(当最后一次检索失败时需要手动设置lastIndex
这里翻译不但改动了原文语句的顺序,而且括号里的补充说明与原文意思刚好相反,应为:
要么在每个字符串中找出所有的匹配以便将lastIndex自动重置为零(发生在最后一次搜索失败时),要么显式将lastIndex手动设置为0

第13章

13.2.4节“HTML中的事件处理程序”最后一段
相互之间用逗号分隔
应为
相互之间用分号分隔

第14章

14.8.1节“打开和关闭窗口”
w.opener !== null; // true,对于由w创建的任意窗口
根据原文应为
w.opener !== null; // true,对于由open()创建的任意窗口w

第15章

15.3.1节“作为节点树的文档”
previoursSibling
应为
previousSibling

15.8.4节“滚动”
Window对象的ScrollTop()方法
应为
Window对象的ScrollTo()方法

15.10.4节“可编辑的内容”
function bold() { document.execCommand(“bold”, false, url); }
根据原文应为
function bold() { document.execCommand(“bold”, false, null); }

15.10.4节“可编辑的内容”
document.queryCommandSupport()
应为
document.queryCommandSupported()

第16章

16.2.2节“查询、插入与删除样式表规则”
selectText
应为
selectorText

第17章

17.1.2节“DOM事件”
3级DOM事件规范标准化了不冒泡的focusin和focusout事件来取代冒泡的focus和blur事件
应为
3级DOM事件规范标准化了冒泡的focusin和focusout事件来取代不冒泡的focus和blur事件

17.1.2节“DOM事件”
标准化了冒泡的mouseenter和mouseleave事件来取代不冒泡的mouseover和mouseout事件
应为
标准化了不冒泡的mouseenter和mouseleave事件来取代冒泡的mouseover和mouseout事件

17.2.3节“addEventListener()” 示例代码

<button id="my button">

应为

<button id="mybutton">

第18章

18.1.1节“指定请求”插文“顺序问题”
setRequestHeader()方法的调用必须在调用open()之前但在调用send()之后
应为
setRequestHeader()方法的调用必须在调用open()之后但在调用send()之前

第19章

19.5.3节“动画的取消、延迟和队列”
可以使用queque()方法给队列添加一个新的函数
应为
可以使用queue()方法给队列添加一个新的函数

19.6.1节插文“jQuery的Ajax状态码”
“timout”
应为
“timeout”

第20章

20章导言
本书第8章介绍过现在主流浏览器都支持一个文件对象
应为
本书第18章介绍过现在主流浏览器都支持一个文件对象

20.4.2节“缓存的更新” 例20-4代码progress事件处理程序
“process”事件
应为
“progress”事件(共2处)

第22章

22.4.1节“Worker对象”
Worker的postMessage()方法是没有参数的
应为
Worker的postMessage()方法是没有origin这个参数的

22.4.2节“Worker作用域“
同时,WorkerGlobalSpace会添加一个相同基本API的异步版本
应为
同时,WorkerGlobalSpace会添加一个相同基本API的同步版本

22.5节“类型化数组和ArrayBuffer”示例代码
last.bytelength
应为
last3.byteLength

DateView
应为
DataView(共2次)

JavaScript核心参考

String.trim() 缺少 EcmaScript 5 标注

客户端JavaScript参考

DataTransfer类, dropEffect属性
它的值必须为“none”、“copy”、“move”、“copy”、或link之一
应为
它的值必须为“none”、“copy”、“move”或link之一

Window.atob()及Window.btoa()
“base64″是技术术语,应保持原样不翻译。

Win7及以下虚拟机初始化配置一般流程

禁用系统还原、禁用屏幕保护程序、禁止关闭屏幕、禁止自动休眠

禁用Windows Defender、禁用自动播放

禁用整理磁盘碎片的计划任务

禁止自动更新

调整按键重复频率(可选)

禁用休眠转储文件,以管理员身份运行:powercfg -h off

安装性能增强驱动

关闭不必要的服务:

Windows Update
Windows Defender
Security Center
Print Spooler
Volume Shadow Copy

文件夹选项,显示隐藏文件、系统文件,不隐藏已知文件扩展名,不缓存缩略图。(可选)

如果是IE6,先访问一次网址,因为第一次打开网址总会关闭窗口并弹出连接向导。
否则,设置始终在新选项卡打开,然后打开两个选项卡,关闭浏览器,为的是勾选关闭多个标签页不要再提醒。

如果IE版本>=10,在关于窗口取消勾选“自动安装新版本”。(可选)

清空Temp目录,清除IE缓存和历史记录。

移除虚拟机的光盘镜像。

我的Sublime Text 3配置

{
    "default_encoding": "UTF-8",
    "default_line_ending": "unix",
    "font_size": 10,
    "highlight_line": true,
    "hot_exit": false,
    "line_padding_bottom": 0.5,
    "line_padding_top": 0.5,
    "remember_open_files": false,
    "tab_size": 4,
    "draw_white_space": "selection",        //all
    "translate_tabs_to_spaces": false,
    "update_check": false,
    "word_wrap": false,
    "update_check": false,
}

解决Debian PXE方式安装找不到硬盘的问题

该问题是由于网络启动模式的initrd.gz中并未包含对应的驱动模块,导致无法发现硬盘。可以拿DVD光盘中install[.arch]目录下的initrd解压后获取驱动模块,与网络方式(netboot)安装的initrd合并后,重新制作新的initrd文件。

1. gunzip解压dvd中的initrd.gz并重命名为initrd-dvd

2. gunzip解压netboot中的initrd.gz并重命名为initrd-net

3. 解包initrd-dvd到dvd目录

mkdir /tmp/dvd
cd /tmp/dvd
cpio -i < initrd-dvd

4. 解包initrd-net到net目录

mkdir /tmp/net
cd /tmp/net
cpio -i < initrd-net

5. 将dvd版本中的驱动复制到net版(请调整目录名称)

cd /tmp
cp -a dvd/lib/modules/3.2.0-4-amd64/kernel/drivers/* net/lib/modules/3.2.0-4-amd64/kernel/drivers/

6. 重新打包initrd

cd /tmp/net
find | cpio -o -R 0:0 -H newc | gzip > ../initrd.gz

7. 复制initrd.gz到tftp目录测试PXE引导,Enjoy!

本文参考了以下资料:
http://unix.stackexchange.com/questions/68387/preseeding-debian-install-from-local-mirror-no-disks-detected

在Linux终端递归下载ftp服务器某个目录的方法

假如要将ftp://127.0.0.1/pub/a/b/c/中的c目录及其内容下载到本地~/目录,即本地~/c/目录对应服务器的/pub/a/b/c目录,该如何操作呢?

方法一:使用lftp工具

cd ~
lftp 127.0.0.1
user <username> [<password>]
cd /pub/a/b
mirror c #或 mirror c ~/c
#mirror c 指把服务器c的内容镜像到本地当前目录,如果指定第二个参数(存放到的本地目录),则第一个c是指c下的所有文件,而不是c目录本身

方法二:使用wget

wget -r ftp://127.0.0.1/pub/a/b/c -P ~ -nH --cut-dirs=3
  • -r 递归下载目录下的内容
  • -P –directory-prefix 指定本地目录前缀,所有下载内容将基于该目录,不指定则为当前目录
  • -nH 不要建立以主机名命名的本地目录,默认wget下载的内容会存放于以主机名命名的子目录中
    –cut-dirs 裁剪目录前缀个数,本例中裁减掉/pub/a/b/共3个目录,这样保存到本地的目录树不会出现/pub/a/b/

bash中容易搞混的几种括号运算符

$()

取得括号内运行命令的标准输出,作为当前命令行的命令或参数,其效果和``相同。
举例:mkdir $(date +%F)

$(())

执行整数运算。作用和let相似
举例:var=$((10+20))
另一种整数运算符$[]现已被标记为过时,会在将来版本中移除。

(())

可在其中使用直观的数学比较运算符,比test命令的选项 -lt -gt等要直观。
举例:

root@debian:~# (( 1 > 0 )) && echo yes
yes
root@debian:~# (( 1 > 10 )) && echo yes
root@debian:~#

[[]]

test命令或[的增强版,bash专有扩展,在sh中不支持。可以用扩展正则表达式或通配符来比较字符串。
举例:正则表达式:

root@debian:~# [[ "123456" =~ ^[0-9]+$ ]] && echo yes
yes
root@debian:~# [[ "123456X" =~ ^[0-9]+$ ]] && echo yes
root@debian:~#

举例:通配符:

root@debian:~# [[ 'abc.txt' == abc.* ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.txt ]] && echo yes
yes
root@debian:~# [[ 'abc.txt' == *.jpg ]] && echo yes
root@debian:~#

经测试等号右边的模式不能用引号括起来,否则会识别失败

新装Debian 7 重启后显示 error: file ‘/boot/grub/i386-pc/normal.mod’ not found的解决办法

新机支持EFI bios,且系统是64位,会自动安装EFI版的GRUB,不管你是否启用了EFI引导。解决办法是再次启动安装镜像,并且选择”高级选项(Advanced options)“中的”救援模式(rescue mode)“,选择正确的你所安装的根分区/的设备,并进入命令行模式。
然后:

bash  #我比较喜欢用bash,默认是sh
mount -a #把没挂载的设备都挂上
aptitude -y remove grub-efi-amd64 #删除EFI版的GRUB
aptitude -y install grub-pc #安装传统PC版GRUB
rm -rf /boot/grub/*
grub-install /dev/sdX #重新初始化GRUB到启动磁盘
update-grub #重新生成启动项菜单,等同于grub-mkconfig > /boot/grub/grub.cfg

#然后重启并从硬盘引导就OK了