Skip to content

Commit

Permalink
Cleaned up Chinese translation
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhangYiJiang committed Mar 24, 2011
1 parent 0f0ffb2 commit e387a6a
Show file tree
Hide file tree
Showing 28 changed files with 379 additions and 423 deletions.
49 changes: 21 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,36 +1,33 @@
JavaScript 秘密花园
JavaScript Garden
=================

**JavaScript 秘密花园**是一个不断更新的文档,主要关心 JavaScript 一些古怪用法。
对于如何避免常见的错误,难以发现的问题,以及性能问题和不好的实践给出建议,
初学者可以籍此深入了解 JavaScript 的语言特性。
**JavaScript Garden** is a growing collection of documentation about the most
quirky parts of the JavaScript programming language. It gives advice to
avoid common mistakes, subtle bugs, as well as performance issues and bad
practices that non-expert JavaScript programmers may encounter on their
endeavours into the depths of the language.

JavaScript 秘密花园**不是**用来教你 JavaScript。为了更好的理解这篇文章的内容,
你需要事先学习 JavaScript 的基础知识。在 Mozilla 开发者网络中有一系列非常棒的 JavaScript 学习[向导][1]
JavaScript Garden does **not** aim to teach you JavaScript. Former knowledge
of the language is strongly recommended in order to understand the topics covered
in this guide. In order to learn the basics of the language, please head over to
the excellent [guide][1] on the Mozilla Developer Network.

### 关于作者
### The authors

这篇文章的作者是两位 Stack Overflow 的用户, [Ivo Wetzel][6] (写作) 和 [Zhang Yi Jiang][5] (设计)。
This guide is the work of two lovely Stack Overflow users, [Ivo Wetzel][6]
(Writing) and [Zhang Yi Jiang][5] (Design).

### Contributors

### 贡献者
- [Caio Romão][8] (Spelling corrections)
- [Andreas Blixt][9] (Language corrections)

- [Caio Romão][8] (拼写检查)
- [Andreas Blixt][9] (语言修正)

### 中文翻译

- [三生石上][29]

此中文翻译由[三生石上][29]独立完成,[博客园][30]首发,转载请注明出处。


### 许可

JavaScript 秘密花园在 [MIT license][2] 许可协议下发布,并存放在开源社区 [GitHub][4]
如果你发现错误或者打字错误,请 [file an issue][3] 或者 pull request。
你也可以在 Stack Overflow 的聊天室 [JavaScript room][10] 找到我们。
### License

JavaScript Garden is published under the [MIT license][2] and hosted on
[GitHub][4]. If you find errors or typos please [file an issue][3] or a pull
request on the repository. You can also find us in the [JavaScript room][10] on
Stack Overflow chat.

[1]: https://developer.mozilla.org/en/JavaScript/Guide
[2]: https://github.com/BonsaiDen/JavaScript-Garden/blob/next/LICENSE
Expand All @@ -41,7 +38,3 @@ JavaScript 秘密花园在 [MIT license][2] 许可协议下发布,并存放在
[8]: https://github.com/caio
[9]: https://github.com/blixt
[10]: http://chat.stackoverflow.com/rooms/17/javascript

[29]: http://sanshi.me/
[30]: http://cnblogs.com/sanshi/

16 changes: 8 additions & 8 deletions doc/zh/array/constructor.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## `Array` 构造函数
##`Array` 构造函数

由于 `Array` 的构造函数在如何处理参数时有点模棱两可,因此总是推荐使用数组的字面语法 - `[]` - 来创建数组。

Expand All @@ -8,18 +8,17 @@
[3]; // 结果: [3]
new Array(3); // 结果: []
new Array('3') // 结果: ['3']

译者注:这里的模棱两可指的是数组的[两种构造函数语法][1]
var arr1 = new Array(arrayLength);
var arr2 = new Array(element0, element1, ..., elementN);

// 译者注:因此下面的代码将会使人很迷惑
new Array(3, 4, 5); // 结果: [3, 4, 5]
new Array(3) // 结果: [],此数组长度为 3

> **译者注:**这里的模棱两可指的是数组的[两种构造函数语法][1]
由于只有一个参数传递到构造函数中(译者注:指的是 `new Array(3);` 这种调用方式),并且这个参数是数字,构造函数会返回一个 `length` 属性被设置为此参数的空数组。
需要特别注意的是,此时只有 `length` 属性被设置,真正的数组并没有生成。
译者注:在 Firebug 中,你会看到 [undefined, undefined, undefined],这其实是不对的。在上一节有详细的分析。

> **译者注:**在 Firebug 中,你会看到 `[undefined, undefined, undefined]`,这其实是不对的。在上一节有详细的分析。
var arr = new Array(3);
arr[1]; // undefined
Expand All @@ -28,9 +27,10 @@ var arr2 = new Array(element0, element1, ..., elementN);
这种优先于设置数组长度属性的做法只在少数几种情况下有用,比如需要循环字符串,可以避免 `for` 循环的麻烦。

new Array(count + 1).join(stringToRepeat);
// 译者注:new Array(3).join('#') 将会返回 "##"

### 结论(In conclusion)
> **译者注:** `new Array(3).join('#')` 将会返回 `##`
###结论

应该尽量避免使用数组构造函数创建新数组。推荐使用数组的字面语法。它们更加短小和简洁,因此增加了代码的可读性。

Expand Down
26 changes: 12 additions & 14 deletions doc/zh/array/general.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 数组遍历与属性
##数组遍历与属性

虽然在 JavaScript 中数组是是对象,但是没有好的理由去使用 [`for in` 循环](#object.forinloop) 遍历数组。
相反,有一些好的理由**不去**使用 `for in` 遍历数组。
Expand All @@ -9,7 +9,7 @@
由于 `for in` 循环会枚举原型链上的所有属性,唯一过滤这些属性的方式是使用 [`hasOwnProperty`](#object.hasownproperty) 函数,
因此会比普通的 `for` 循环慢上好多倍。

### 遍历(Iteration)
###遍历

为了达到遍历数组的最佳性能,推荐使用经典的 `for` 循环。

Expand All @@ -25,8 +25,7 @@

实际上,不使用缓存数组长度的方式比缓存版本要慢很多。


### `length` 属性(The `length` property)
###`length` 属性

`length` 属性的 *getter* 方式会简单的返回数组的长度,而 *setter* 方式会**截断**数组。

Expand All @@ -37,20 +36,19 @@
foo.length = 6;
foo; // [1, 2, 3]

译者注:
在 Firebug 中查看此时 foo 的值是: [1, 2, 3, undefined, undefined, undefined]
但是这个结果并不准确,如果你在 Chrome 的控制台查看 foo 的结果,你会发现是这样的: [1, 2, 3]
因为在 JavaScript 中 undefined 是一个变量,注意是变量不是关键字,因此上面两个结果的意义是完全不相同的。

// 译者注:为了验证,我们来执行下面代码,看序号 5 是否存在于 foo 中。
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 false
foo[5] = undefined;
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 true
**译者注:**
在 Firebug 中查看此时 `foo` 的值是: `[1, 2, 3, undefined, undefined, undefined]`
但是这个结果并不准确,如果你在 Chrome 的控制台查看 `foo` 的结果,你会发现是这样的: `[1, 2, 3]`
因为在 JavaScript 中 `undefined` 是一个变量,注意是变量不是关键字,因此上面两个结果的意义是完全不相同的。

// 译者注:为了验证,我们来执行下面代码,看序号 5 是否存在于 foo 中。
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 false
foo[5] = undefined;
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 true

`length` 设置一个更小的值会截断数组,但是增大 `length` 属性值不会对数组产生影响。

### 结论(In conclusion)
###结论

为了更好的性能,推荐使用普通的 `for` 循环并缓存数组的 `length` 属性。
使用 `for in` 遍历数组被认为是不好的代码习惯并倾向于产生错误和导致性能问题。
Expand Down
13 changes: 6 additions & 7 deletions doc/zh/core/eval.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 为什么不要使用 `eval`
##为什么不要使用 `eval`

`eval` 函数会在当前作用域中执行一段 JavaScript 代码字符串。

Expand All @@ -23,7 +23,7 @@
test(); // 2
foo; // 3

[译者注][30]:上面的代码等价于在全局作用域中调用 `eval`,和下面两种写法效果一样:
**[译者注][30]**上面的代码等价于在全局作用域中调用 `eval`,和下面两种写法效果一样:

// 写法一:直接调用全局作用域下的 foo 变量
var foo = 1;
Expand All @@ -35,7 +35,7 @@
test(); // 2
foo; // 3

// 写法二:使用 call 函数修改 `eval` 执行的上下文为全局作用域
// 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域
var foo = 1;
function test() {
var foo = 2;
Expand All @@ -47,22 +47,21 @@

**任何情况下**我们都应该避免使用 `eval` 函数。99.9% 使用 `eval` 的场景都有**不使用** `eval` 的解决方案。

### 伪装的 `eval``eval` in disguise)
###伪装的 `eval`

[定时函数](#other.timeouts) `setTimeout``setInterval` 都可以接受字符串作为它们的第一个参数。
这个字符串**总是**在全局作用域中执行,因此 `eval` 在这种情况下没有被直接调用。


### 安全问题(Security issues)
###安全问题

`eval` 也存在安全问题,因为它会执行**任意**传给它的代码,
在代码字符串未知或者是来自一个不信任的源时,绝对不要使用 `eval` 函数。

### 结论(In conclusion)
###结论

绝对不要使用 `eval`,任何使用它的代码都会在它的工作方式,性能和安全性方面受到质疑。
如果一些情况必须使用到 `eval` 才能正常工作,首先它的设计会受到质疑,这**不应该**是首选的解决方案,
一个更好的不使用 `eval` 的解决方案应该得到充分考虑并优先采用。


[30]: http://cnblogs.com/sanshi/
23 changes: 7 additions & 16 deletions doc/zh/core/semicolon.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 自动分号插入
##自动分号插入

尽管 JavaScript 有 C 的代码风格,但是它****强制要求在代码中使用分号,实际上可以省略它们。

Expand All @@ -17,12 +17,10 @@ JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来

自动的分号插入被认为是 JavaScript 语言**最大**的设计缺陷之一,因为它**改变代码的行为。


### 工作原理(How it works)
### 工作原理

下面的代码没有分号,因此解析器需要自己判断需要在哪些地方插入分号。


(function(window, undefined) {
function test(options) {
log('testing!')
Expand All @@ -47,15 +45,14 @@ JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来

(function(window) {
window.someLibrary = {}

})(window)

下面是解析器"猜测"的结果。

(function(window, undefined) {
function test(options) {

// Not inserted, lines got merged
// 没有插入分号,两行被合并为一行
log('testing!')(options.list || []).forEach(function(i) {

}); // <- 插入分号
Expand All @@ -67,27 +64,22 @@ JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来

return; // <- 插入分号, 改变了 return 表达式的行为
{ // 作为一个代码段处理

// a label and a single expression statement
foo: function() {}
}; // <- 插入分号
}
window.test = test; // <- 插入分号

// The lines got merged again
// 两行又被合并了
})(window)(function(window) {
window.someLibrary = {}; // <- 插入分号

})(window); //<- 插入分号

> **注意:** JavaScript 不能正确的处理 return 表达式紧跟换行符的情况,
> **注意:** JavaScript 不能正确的处理 `return` 表达式紧跟换行符的情况,
> 虽然这不能算是自动分号插入的错误,但这确实是一种不希望的副作用。

解析器显著改变了上面代码的行为,在另外一些情况下也会做出**错误的处理**


### 前置括号(Leading parenthesis)
###前置括号

在前置括号的情况下,解析器**不会**自动插入分号。

Expand All @@ -100,8 +92,7 @@ JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来

`log` 函数的执行结果**极大**可能**不是**函数;这种情况下就会出现 `TypeError` 的错误,详细错误信息可能是 `undefined is not a function`


### 结论(In conclusion)
###结论

建议**绝对**不要省略分号,同时也提倡将花括号和相应的表达式放在一行,
对于只有一行代码的 `if` 或者 `else` 表达式,也不应该省略花括号。
Expand Down
17 changes: 7 additions & 10 deletions doc/zh/core/undefined.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
## `undefined``null`
##`undefined``null`

JavaScript 有两个表示 `` 的值,其中比较有用的是 `undefined`
JavaScript 有两个表示‘空’的值,其中比较有用的是 `undefined`


### `undefined`的值(The value `undefined`
###`undefined` 的值

`undefined` 是一个值为 `undefined` 的类型。

Expand All @@ -22,8 +21,7 @@ JavaScript 有两个表示 `空` 的值,其中比较有用的是 `undefined`
- 函数参数没有被显式的传递值。
- 任何被设置为 `undefined` 值的变量。


### 处理 `undefined` 值的改变(Handling changes to the value of `undefined`
###处理 `undefined` 值的改变

由于全局变量 `undefined` 只是保存了 `undefined` 类型实际**的副本,
因此对它赋新值**不会**改变类型 `undefined` 的值。
Expand All @@ -50,11 +48,10 @@ JavaScript 有两个表示 `空` 的值,其中比较有用的是 `undefined`

这里唯一的区别是,在压缩后并且函数内没有其它需要使用 `var` 声明变量的情况下,这个版本的代码会多出 4 个字节的代码。

[译者注][30]:这里有点绕口,其实很简单。
如果此函数内没有其它需要声明的变量,那么 `var ` 总共 4 个字符(包含一个空白字符)就是专门为 undefined 变量准备的,相比上个例子多出了 4 个字节。

> **[译者注][30]**这里有点绕口,其实很简单。如果此函数内没有其它需要声明的变量,那么 `var` 总共 4 个字符(包含一个空白字符)
就是专门为 `undefined` 变量准备的,相比上个例子多出了 4 个字节。

### 使用 `null`(Uses of `null`
###`null` 的用处

JavaScript 中的 `undefined` 的使用场景类似于其它语言中的 *null*,实际上 JavaScript 中的 `null` 是另外一种数据类型。

Expand Down
Loading

0 comments on commit e387a6a

Please sign in to comment.