From f81250cd6232c5a2143fb2f2e1d63b1f04f28b27 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 30 Dec 2019 11:16:08 +0800 Subject: [PATCH 1/5] Update article.md --- 1-js/04-object-basics/03-symbol/article.md | 65 ++++++++++++++-------- 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/1-js/04-object-basics/03-symbol/article.md b/1-js/04-object-basics/03-symbol/article.md index 59a2de6116..161e9a3ba3 100644 --- a/1-js/04-object-basics/03-symbol/article.md +++ b/1-js/04-object-basics/03-symbol/article.md @@ -16,14 +16,14 @@ let id = Symbol(); ``` -我们可以给 Symbol 一个描述(也称为 Symbol 名),这对于调试非常有用: +创建时,我们可以给 Symbol 一个描述(也称为 Symbol 名),这在代码调试时非常有用: ```js // id 是描述为 "id" 的 Symbol let id = Symbol("id"); ``` -Symbol 保证是唯一的。即使我们创建了许多具有相同描述的 Symbol,它们的值也是不同。描述只是一个不影响任何东西的标签。 +Symbol 保证是唯一的。即使我们创建了许多具有相同描述的 Symbol,它们的值也是不同。描述只是一个标签,不影响任何东西。 例如,这里有两个描述相同的 Symbol —— 它们不相等: @@ -36,12 +36,12 @@ alert(id1 == id2); // false */!* ``` -如果您熟悉 Ruby 或者其他有 "Symbol" 的语言 —— 别被误导。JavaScript 的 Symbol 与众不同。 +如果你熟悉 Ruby 或者其他有 "Symbol" 的语言 —— 别被误导。JavaScript 的 Symbol 是不同的。 -````warn header="Symbols don't auto-convert to a string" -JavaScript 中的大多数值都支持 string 的隐式转换。例如,我们可以 `alert` 任何值,这会起作用。Symbol 是特别的,它无法自动转换。 +````warn header="Symbol 不会被自动转换为字符串" +JavaScript 中的大多数值都支持 string 的隐式转换。例如,我们可以 `alert` 任何值,都可以生效。Symbol 比较特殊,它不会被自动转换。 -例如,这个 `alert` 将会显示错误: +例如,这个 `alert` 将会提示出错: ```js run let id = Symbol("id"); @@ -50,38 +50,57 @@ alert(id); // 类型错误:无法将 Symbol 值转换为 String。 */!* ``` +这是一种防止混乱的“语言保护”,因为 String 和 Symbol 有本质上的不同,不应该意外地将它们转换成另一个。 + 如果我们真的想显示一个 Symbol,我们需要在它上面调用 `.toString()`,如下所示: ```js run let id = Symbol("id"); *!* -alert(id.toString()); // Symbol(id),现在它起作用了 +alert(id.toString()); // Symbol(id),现在它有效了 +*/!* +``` + +或者获取 `symbol.description` 属性,只显示描述(description): +```js run +let id = Symbol("id"); +*!* +alert(id.description); // id */!* ``` -这是一种防止混乱的“语言保护”,因为 String 和 Symbol 有本质上的不同,而且不应该偶尔将它们相互转化。 ```` ## “隐藏”属性 -Symbol 允许我们创建对象的“隐藏”属性,代码的任何其他部分都不能偶尔访问或重写这些属性。 +Symbol 允许我们创建对象的“隐藏”属性,代码的任何其他部分都不能意外访问或重写这些属性。 -例如,如果我们想存储 object `user` 的“标识符”,我们可以使用 Symbol 作为它的键: +例如,如果我们使用的是属于第三方代码的 `user` 对象,我们想要给它们添加一些标识符。 + +我们可以给它们使用 Symbol 键: ```js run -let user = { name: "John" }; +let user = { // 属于另一个代码 + name: "John" +}; + let id = Symbol("id"); -user[id] = "ID Value"; -alert( user[id] ); // 我们可以使用 Symbol 作为键来访问数据。 +user[id] = 1; + +alert( user[id] ); // 我们可以使用 Symbol 作为键来访问数据 ``` 在 string `"id"` 上使用 `Symbol("id")` 有什么好处? +因为 `user` 属于另一个代码,另一个代码也使用它执行一些操作,所以我们不应该在它上面加任何字段,这样很不安全。但是 Symbol 不会被意外访问到,所以第三方代码看不到它,所以也许可以使用它进行一些操作。 + +另外,假设另一个脚本希望在 `user` 中有自己的标识符,以实现自己的目的。这可能是另一个 JavaScript 库,因此脚本之间完全不了解彼此。 + 我们用更深入一点的示例来说明这一点。 假设另一个脚本希望 `user` 中有它自己的 "id" 属性可以操作。这可能是另一个 JavaScript 库,所以这些脚本完全不知道对方是谁。 -然后该脚本可以创建自己的 `Symbol("id")`,如下所示: +然后该脚本可以创建自己的 `Symbol("id")`,像这样: ```js // ... @@ -90,25 +109,25 @@ let id = Symbol("id"); user[id] = "Their id value"; ``` -不会冲突,因为 Symbol 总是不同的,即使它们有相同的名称。 +我们的标识符和他们的标识符之间不会有冲突,因为 Symbol 总是不同的,即使它们有相同的名称。 -现在请注意,如果我们使用 String `"id"` 而不是用 symbol,那么**就会**出现冲突: +……但如果我们处于同样的目的,使用字符串 `"id"` 而不是用 symbol,那么 **就会** 出现冲突: ```js run let user = { name: "John" }; -//我们的脚本使用 "id" 属性。 -user.id = "ID Value"; +// 我们的脚本使用了 "id" 属性。 +user.id = "Our id value"; -// ...如果之后另一个脚本为其目的使用 "id"... +// ……另一个脚本也想将 "id" 用于它的目的…… user.id = "Their id value" -// 砰!无意中重写了 id!他不是故意伤害同事的,而是这样做了! +// 砰!无意中被另一个脚本重写了 id!他不是故意伤害同事的,而是这样做了! ``` ### 字面量中的 Symbol -如果我们要在 object 字面量中使用 Symbol,则需要方括号。 +如果我们要在对象字面量 `{...}` 中使用 Symbol,则需要使用方括号把它括起来。 就像这样: @@ -118,13 +137,13 @@ let id = Symbol("id"); let user = { name: "John", *!* - [id]: 123 // 不仅仅是 "id:123" + [id]: 123 // 而不是 "id:123" */!* }; ``` 这是因为我们需要变量 `id` 的值作为键,而不是 String "id"。 -### Symbol 在 for..in 中被跳过 +### Symbol 在 for..in 中会被跳过 Symbolic 属性不参与 `for..in` 循环。 From 4a2e8fbfacba0bd110fba348ce3143d58c5400cf Mon Sep 17 00:00:00 2001 From: LeviDing Date: Mon, 30 Dec 2019 16:51:11 +0800 Subject: [PATCH 2/5] Update article.md --- 1-js/04-object-basics/03-symbol/article.md | 98 +++++++++++----------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/1-js/04-object-basics/03-symbol/article.md b/1-js/04-object-basics/03-symbol/article.md index 161e9a3ba3..bbf8c5e617 100644 --- a/1-js/04-object-basics/03-symbol/article.md +++ b/1-js/04-object-basics/03-symbol/article.md @@ -1,9 +1,9 @@ # Symbol 类型 -根据规范,对象的属性键只能是 String 类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有 String 或 Symbol 这两种类型。 +根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有字符串或 Symbol 这两种类型。 -到目前为止,我们只见过 String。现在我们来看看 Symbol 能给我们带来什么好处。 +到目前为止,我们只见过字符串。现在我们来看看 Symbol 能给我们带来什么好处。 ## Symbol @@ -39,18 +39,18 @@ alert(id1 == id2); // false 如果你熟悉 Ruby 或者其他有 "Symbol" 的语言 —— 别被误导。JavaScript 的 Symbol 是不同的。 ````warn header="Symbol 不会被自动转换为字符串" -JavaScript 中的大多数值都支持 string 的隐式转换。例如,我们可以 `alert` 任何值,都可以生效。Symbol 比较特殊,它不会被自动转换。 +JavaScript 中的大多数值都支持字符串的隐式转换。例如,我们可以 `alert` 任何值,都可以生效。Symbol 比较特殊,它不会被自动转换。 例如,这个 `alert` 将会提示出错: ```js run let id = Symbol("id"); *!* -alert(id); // 类型错误:无法将 Symbol 值转换为 String。 +alert(id); // 类型错误:无法将 Symbol 值转换为字符串。 */!* ``` -这是一种防止混乱的“语言保护”,因为 String 和 Symbol 有本质上的不同,不应该意外地将它们转换成另一个。 +这是一种防止混乱的“语言保护”,因为字符串和 Symbol 有本质上的不同,不应该意外地将它们转换成另一个。 如果我们真的想显示一个 Symbol,我们需要在它上面调用 `.toString()`,如下所示: ```js run @@ -90,16 +90,12 @@ user[id] = 1; alert( user[id] ); // 我们可以使用 Symbol 作为键来访问数据 ``` -在 string `"id"` 上使用 `Symbol("id")` 有什么好处? +在字符串 `"id"` 上使用 `Symbol("id")` 有什么好处? 因为 `user` 属于另一个代码,另一个代码也使用它执行一些操作,所以我们不应该在它上面加任何字段,这样很不安全。但是 Symbol 不会被意外访问到,所以第三方代码看不到它,所以也许可以使用它进行一些操作。 另外,假设另一个脚本希望在 `user` 中有自己的标识符,以实现自己的目的。这可能是另一个 JavaScript 库,因此脚本之间完全不了解彼此。 -我们用更深入一点的示例来说明这一点。 - -假设另一个脚本希望 `user` 中有它自己的 "id" 属性可以操作。这可能是另一个 JavaScript 库,所以这些脚本完全不知道对方是谁。 - 然后该脚本可以创建自己的 `Symbol("id")`,像这样: ```js @@ -109,7 +105,7 @@ let id = Symbol("id"); user[id] = "Their id value"; ``` -我们的标识符和他们的标识符之间不会有冲突,因为 Symbol 总是不同的,即使它们有相同的名称。 +我们的标识符和他们的标识符之间不会有冲突,因为 Symbol 总是不同的,即使它们有相同的名字。 ……但如果我们处于同样的目的,使用字符串 `"id"` 而不是用 symbol,那么 **就会** 出现冲突: @@ -141,7 +137,7 @@ let user = { */!* }; ``` -这是因为我们需要变量 `id` 的值作为键,而不是 String "id"。 +这是因为我们需要变量 `id` 的值作为键,而不是字符串 "id"。 ### Symbol 在 for..in 中会被跳过 @@ -161,13 +157,13 @@ let user = { for (let key in user) alert(key); // name, age (no symbols) */!* -// 被 Symbol 任务直接访问 +// 使用 Symbol 任务直接访问 alert( "Direct: " + user[id] ); ``` -这是一般“隐藏”概念的一部分。如果另一个脚本或库在我们的对象上循环,它不会访问一个 Symbol 类型的属性。 +`Object.keys(user)` 也会忽略它们。这是一般“隐藏符号属性”原则的一部分。如果另一个脚本或库遍历我们的对象,它不会意外地访问到符号属性。 -相反,[Object.assign](mdn:js/Object/assign) 同时复制字符串和符号属性: +相反,[Object.assign](mdn:js/Object/assign) 会同时复制字符串和 symbol 属性: ```js run let id = Symbol("id"); @@ -180,33 +176,31 @@ let clone = Object.assign({}, user); alert( clone[id] ); // 123 ``` -这里并不矛盾,就是这样设计的。我们的想法是当我们克隆一个 object 或合并 object 时,通常希望**所有**属性被复制(包括像 `id` 这样的 Symbol)。 +这里并不矛盾,就是这样设计的。这里的想法是当我们克隆或者合并一个 object 时,通常希望 **所有** 属性被复制(包括像 `id` 这样的 Symbol)。 -````smart header="Property keys of other types are coerced to strings" -我们只能在对象中使用 string 或 symbol 作为键,其它类型转换为 String。 +````smart header="其他类型的属性键被强制为字符串" +我们只能在对象中使用字符串或 symbol 作为键,其它类型会被转换为字符串。 -例如,在作为属性键使用时,数字 `0`变成了字符串 `"0"`: +例如,在作为属性键使用时,数字 `0` 变成了字符串 `"0"`: ```js run let obj = { - 0: "test" // same as "0": "test" + 0: "test" // 和 "0": "test" 一样 }; -//两个 alert 都访问相同的属性(Number 0 被转换为 String "0") +// 两个 alert 都访问相同的属性(Number 0 被转换为字符串 "0") alert( obj["0"] ); // test -alert( obj[0] ); // test (相同属性) +alert( obj[0] ); // test(同一个属性) ``` ```` ## 全局 symbol -正如我们所看到的,通常所有的 Symbol 都是不同的,即使它们有相同的名字。但有时我们想要同一个名字的 Symbol 是相同的实体。 - -比如,我们希望在应用程序的不同部分访问相同的 Symbol `"id"` 属性。 +正如我们所看到的,通常所有的 Symbol 都是不同的,即使它们有相同的名字。但有时我们想要名字相同的 Symbol 具有相同的实体。例如,应用程序的不同部分想要访问的 Symbol `"id"` 指的是完全相同的属性。 -为此,存在一个**全局 symbol 注册表**。我们可以在其中创建 Symbol 并在稍后访问它们,它可以确保每次访问相同名称都会返回相同的 Symbol。 +为了实现这一点,这里有一个 **全局 Symbol 注册表**。我们可以在其中创建 Symbol 并在稍后访问它们,它可以确保每次访问相同名字的 Symbol 时,返回的都是相同的 Symbol。 -为了在注册表中创建或读取 Symbol,请使用 `Symbol.for(key)`。 +要从注册表中读取(不存在则创建)Symbol,请使用 `Symbol.for(key)`。 该调用会检查全局注册表,如果有一个描述为 `key` 的 Symbol,则返回该 Symbol,否则将创建一个新 Symbol(`Symbol(key)`),并通过给定的 `key` 将其存储在注册表中。 @@ -216,76 +210,84 @@ alert( obj[0] ); // test (相同属性) // 从全局注册表中读取 let id = Symbol.for("id"); // 如果该 Symbol 不存在,则创建它 -// 再次读取 +// 再次读取(可能是在代码中的另一个位置) let idAgain = Symbol.for("id"); // 相同的 Symbol alert( id === idAgain ); // true ``` -注册表内的 Symbol 称为**全局 Symbol**。如果我们想要一个应用程序范围内的 Symbol,可以在代码中随处访问 —— 这就是它们的用途。 +注册表内的 Symbol 被称为 **全局 Symbol**。如果我们想要一个应用程序范围内的 Symbol,可以在代码中随处访问 —— 这就是它们的用途。 -```smart header="That sounds like Ruby" -在一些编程语言中,例如 Ruby,每个名称都有一个 symbol。 +```smart header="这听起来像 Ruby" +在一些编程语言中,例如 Ruby,每个名字都有一个 Symbol。 -在 JavaScript 中,我们应该用全局 symbol。 +正如我们所看到的,在 JavaScript 中,全局 Symbol 也是这样的。 ``` ### Symbol.keyFor -对于全局 symbol,`Symbol.for(key)` 不仅按名称返回一个 symbol,而且还有一个反向调用:`Symbol.keyFor(sym)`,反过来:通过全局 symbol 返回一个名称。 +对于全局 Symbol,不仅有 `Symbol.for(key)` 按名字返回一个 Symbol,还有一个反向调用:`Symbol.keyFor(sym)`,它的作用完全反过来:通过全局 Symbol 返回一个名字。 例如: ```js run +// 通过 name 获取 Symbol let sym = Symbol.for("name"); let sym2 = Symbol.for("id"); -// 从 symbol 中获取 name +// 通过 Symbol 获取 name alert( Symbol.keyFor(sym) ); // name alert( Symbol.keyFor(sym2) ); // id ``` -`Symbol.keyFor` 在内部使用全局 symbol 注册表来查找 symbol 的键。所以它不适用于非全局 symbol。如果 symbol 不是全局的,它将无法找到它并返回 `undefined`。 +`Symbol.keyFor` 内部使用全局 Symbol 注册表来查找 Symbol 的键。所以它不适用于非全局 Symbol。如果 Symbol 不是全局的,它将无法找到它并返回 `undefined`。 + +也就是说,任何 Symbol 都具有 `description` 属性。 例如: ```js run -alert( Symbol.keyFor(Symbol.for("name")) ); // name, 全局 Symbol +let globalSymbol = Symbol.for("name"); +let localSymbol = Symbol("name"); + +alert( Symbol.keyFor(globalSymbol) ); // name,全局 Symbol +alert( Symbol.keyFor(localSymbol) ); // undefined,非全局 -alert( Symbol.keyFor(Symbol("name2")) ); // undefined, 参数不是一个全局 Symbol +alert( localSymbol.description ); // name ``` ## 系统 Symbol -JavaScript 内部存在很多“系统” Symbol,我们可以使用它们来微调对象的各个方面。 +JavaScript 内部有很多“系统” Symbol,我们可以使用它们来微调对象的各个方面。 -它们列在[熟悉的 Symbol](https://tc39.github.io/ecma262/#sec-well-known-symbols) 表的规范中: +它们都被列在了 [众所周知的 Symbol](https://tc39.github.io/ecma262/#sec-well-known-symbols) 表的规范中: - `Symbol.hasInstance` - `Symbol.isConcatSpreadable` - `Symbol.iterator` - `Symbol.toPrimitive` -- ...等等。 +- ……等等。 -例如,`Symbol.toPrimitive` 允许我们将对象描述为原始值转换,我们很快就会看到它的使用。 +例如,`Symbol.toPrimitive` 允许我们将对象描述为原始值转换。我们很快就会看到它的使用。 -当我们研究相应的语言特征时,其他 Symbol 也会变得熟悉起来。 +当我们研究相应的语言特征时,我们对其他的 Symbol 也会慢慢熟悉起来。 ## 总结 `Symbol` 是唯一标识符的基本类型 -Symbol 使用 `Symbol()` 创建的,调用带有一个可选的描述。 +Symbol 是使用带有可选描述(name)的 `Symbol()` 调用创建的。 -Symbol 总是不同的值,即使它们有相同的名称。如果我们希望同名 Symbol 相等,那么我们应该使用全局注册表:`Symbol.for(key)` 返回(如果需要的话创建)一个以 `key` 作为名称的全局 Symbol。`Symbol.for` 的多次调用完全返回相同的 Symbol。 +Symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 Symbol 相等,那么我们应该使用全局注册表:`Symbol.for(key)` 返回(如果需要的话则创建)一个以 `key` 作为名字的全局 Symbol。使用 `Symbol.for` 多次调用 `key` 相同的 Symbol 时,返回的就是同一个 Symbol。 Symbol 有两个主要的使用场景: -1. “隐藏” 对象属性。如果需要将属性添加到 “属于” 另一个脚本或库的对象中,则可以创建 Symbol 并将其用作属性键。Symbol 属性不出现在 `for..in`中,因此不会无心列出。另外,它不会被直接访问,因为另一个脚本没有我们的符号,所以它不会不小心干预它的操作。 +1. “隐藏” 对象属性。 + 如果我们想要向“属于”另一个脚本或者库的对象添加一个属性,我们可以创建一个 Symbol 并使用它作为属性的键。Symbol 属性不会出现在 `for..in` 中,因此它不会意外地被与其他属性一起处理。并且,它不会被直接访问,因为另一个脚本没有我们的 symbol。因此,该属性将受到保护,防止被意外使用或重写。 - 因此我们可以使用 Symbol 属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他人不会以对象属性的形式看到它。 + 因此我们可以使用 Symbol 属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他程序看不到它。 -2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 `Symbol.*` 访问。我们可以使用它们来改变一些内置行为。例如,在本教程的后面部分,我们将使用 `Symbol.iterator` 来[迭代](info:iterable),`Symbol.toPrimitive` 来设置[对象原始值的转换](info:object-toprimitive)等等。 +2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 `Symbol.*` 访问。我们可以使用它们来改变一些内置行为。例如,在本教程的后面部分,我们将使用 `Symbol.iterator` 来进行 [迭代](info:iterable) 操作,使用 `Symbol.toPrimitive` 来设置 [对象原始值的转换](info:object-toprimitive) 等等。 -从技术上说,Symbol 不是 100% 隐藏的。有一个内置方法 [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) 允许我们获取所有的 Symbol。还有一个名为 [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 返回**所有**键,包括 Symbol。所以它们不是真正的隐藏。但是大多数库、内置方法和语法结构都遵循一个共同的协议。而明确调用上述方法的人可能很清楚他在做什么。 +从技术上说,Symbol 不是 100% 隐藏的。有一个内置方法 [Object.getOwnPropertySymbols(obj)](mdn:js/Object/getOwnPropertySymbols) 允许我们获取所有的 Symbol。还有一个名为 [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 的方法可以返回一个对象的 **所有** 键,包括 Symbol。所以它们并不是真正的隐藏。但是大多数库、内置方法和语法结构都没有使用这些方法。 From 2aa31a15b91f3df3b3fd62df82507531b293ff87 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 3 Jan 2020 09:27:29 +0800 Subject: [PATCH 3/5] Update 1-js/04-object-basics/03-symbol/article.md Co-Authored-By: Martin --- 1-js/04-object-basics/03-symbol/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-symbol/article.md b/1-js/04-object-basics/03-symbol/article.md index bbf8c5e617..f324cb3809 100644 --- a/1-js/04-object-basics/03-symbol/article.md +++ b/1-js/04-object-basics/03-symbol/article.md @@ -286,7 +286,7 @@ Symbol 有两个主要的使用场景: 1. “隐藏” 对象属性。 如果我们想要向“属于”另一个脚本或者库的对象添加一个属性,我们可以创建一个 Symbol 并使用它作为属性的键。Symbol 属性不会出现在 `for..in` 中,因此它不会意外地被与其他属性一起处理。并且,它不会被直接访问,因为另一个脚本没有我们的 symbol。因此,该属性将受到保护,防止被意外使用或重写。 - 因此我们可以使用 Symbol 属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他程序看不到它。 + 因此我们可以使用 Symbol 属性“秘密地”将一些东西隐藏到我们需要的对象中,但其他地方看不到它。 2. JavaScript 使用了许多系统 Symbol,这些 Symbol 可以作为 `Symbol.*` 访问。我们可以使用它们来改变一些内置行为。例如,在本教程的后面部分,我们将使用 `Symbol.iterator` 来进行 [迭代](info:iterable) 操作,使用 `Symbol.toPrimitive` 来设置 [对象原始值的转换](info:object-toprimitive) 等等。 From c60836148acea893507b730a08a6de901c9ec72e Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 3 Jan 2020 09:27:39 +0800 Subject: [PATCH 4/5] Update 1-js/04-object-basics/03-symbol/article.md Co-Authored-By: Martin --- 1-js/04-object-basics/03-symbol/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-symbol/article.md b/1-js/04-object-basics/03-symbol/article.md index f324cb3809..d47802b717 100644 --- a/1-js/04-object-basics/03-symbol/article.md +++ b/1-js/04-object-basics/03-symbol/article.md @@ -118,7 +118,7 @@ user.id = "Our id value"; // ……另一个脚本也想将 "id" 用于它的目的…… user.id = "Their id value" -// 砰!无意中被另一个脚本重写了 id!他不是故意伤害同事的,而是这样做了! +// 砰!无意中被另一个脚本重写了 id! ``` ### 字面量中的 Symbol From c48cbc49510ce4eb9fe3176df703e41797898b1b Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 3 Jan 2020 09:28:28 +0800 Subject: [PATCH 5/5] Update article.md --- 1-js/04-object-basics/03-symbol/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/04-object-basics/03-symbol/article.md b/1-js/04-object-basics/03-symbol/article.md index d47802b717..370ef6c16d 100644 --- a/1-js/04-object-basics/03-symbol/article.md +++ b/1-js/04-object-basics/03-symbol/article.md @@ -92,7 +92,7 @@ alert( user[id] ); // 我们可以使用 Symbol 作为键来访问数据 在字符串 `"id"` 上使用 `Symbol("id")` 有什么好处? -因为 `user` 属于另一个代码,另一个代码也使用它执行一些操作,所以我们不应该在它上面加任何字段,这样很不安全。但是 Symbol 不会被意外访问到,所以第三方代码看不到它,所以也许可以使用它进行一些操作。 +因为 `user` 属于另一个代码,另一个代码也使用它执行一些操作,所以我们不应该在它上面加任何字段,这样很不安全。但是 Symbol 不会被意外访问到,所以第三方代码看不到它,所以使用 Symbol 也许不会有什么问题。 另外,假设另一个脚本希望在 `user` 中有自己的标识符,以实现自己的目的。这可能是另一个 JavaScript 库,因此脚本之间完全不了解彼此。