From 8f9a16a502737bfa7c4802ff8bd394c2a9050063 Mon Sep 17 00:00:00 2001 From: allen Date: Wed, 20 Jun 2018 15:36:07 +0800 Subject: [PATCH 01/10] Update task.md --- .../08-keys-values-entries/01-sum-salaries/task.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md index 211357d03a..6787c747e8 100644 --- a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md +++ b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md @@ -2,15 +2,15 @@ importance: 5 --- -# Sum the properties +# 属性求和 Sum the properties -There is a `salaries` object with arbitrary number of salaries. +有一个 `salaries` 对象,包含了薪水的值。 -Write the function `sumSalaries(salaries)` that returns the sum of all salaries using `Object.values` and the `for..of` loop. +写一个 `sumSalaries(salaries)` 函数,使用 `Object.values` 和 `for..of` 循环语句返回所有薪水的和。 -If `salaries` is empty, then the result must be `0`. +如果 `salaries` 是空对象,那么结果必须是 `0`。 -For instance: +举个例子: ```js let salaries = { From 488b0d95c8b276507152744642d9220b1eaa599d Mon Sep 17 00:00:00 2001 From: allen Date: Wed, 20 Jun 2018 15:36:42 +0800 Subject: [PATCH 02/10] Update article.md --- .../08-keys-values-entries/article.md | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/article.md b/1-js/05-data-types/08-keys-values-entries/article.md index 50ba91cef5..ed22486835 100644 --- a/1-js/05-data-types/08-keys-values-entries/article.md +++ b/1-js/05-data-types/08-keys-values-entries/article.md @@ -1,42 +1,42 @@ -# Object.keys, values, entries +# 对象的键、值、项 -Let's step away from the individual data structures and talk about the iterations over them. +单个数据结构告一段落,下面我们让讨论如何迭代它们。 -In the previous chapter we saw methods `map.keys()`, `map.values()`, `map.entries()`. +在前面的章节中,我们认识了 `map.keys()`,`map.value()`,`map.entries()`。 -These methods are generic, there is a common agreement to use them for data structures. If we ever create a data structure of our own, we should implement them too. +这些方法是广义的,对于数据结构,我们约定俗成使用它们。如果我们曾经自己创建过数据结构,我们也应该实现过它们。 -They are supported for: +它们支持: - `Map` - `Set` -- `Array` (except `arr.values()`) +- `Array` (除了 `arr.values()`) -Plain objects also support similar methods, but the syntax is a bit different. +纯对象也支持这些方法,但是语法上有一些不同 -## Object.keys, values, entries +## Object.keys、values、entries 三个方法 -For plain objects, the following methods are available: +对于纯对象,下列方法是可用的: -- [Object.keys(obj)](mdn:js/Object/keys) -- returns an array of keys. -- [Object.values(obj)](mdn:js/Object/values) -- returns an array of values. -- [Object.entries(obj)](mdn:js/Object/entries) -- returns an array of `[key, value]` pairs. +- [Object.keys(obj)](mdn:js/Object/keys) —— 返回包含所有键的数组。 +- [Object.values(obj)](mdn:js/Object/values) —— 返回包含所有值的数组。 +- [Object.entries(obj)](mdn:js/Object/entries) —— 返回包含所有 `[key, value]` 键值对的数组。 -...But please note the distinctions (compared to map for example): +... 但是请注意区别(比如说跟 map 的区别): | | Map | Object | |-------------|------------------|--------------| -| Call syntax | `map.keys()` | `Object.keys(obj)`, but not `obj.keys()` | -| Returns | iterable | "real" Array | +| 调用语法 | `map.keys()` | `Object.keys(obj)`,而不是 `obj.keys()` | +| 返回值 | 可迭代项 |「真正的」数组 -The first difference is that we have to call `Object.keys(obj)`, and not `obj.keys()`. +第一个区别是在对象中我们的调用语法是 `Object.key(obj)`,而不是 `obj.key()`。 -Why so? The main reason is flexibility. Remember, objects are a base of all complex structures in JavaScript. So we may have an object of our own like `order` that implements its own `order.values()` method. And we still can call `Object.values(order)` on it. +为什么会这样?主要原因是弹性化。请记住,在 JavaScript 中对象是所有复杂数据结构的基础。因此我们可能自己创建一个对象,比如 `order`,然后实现它自己的方法 `order.values()`。那么,我们依然可以对它调用 `Object.values(order)` 方法。 -The second difference is that `Object.*` methods return "real" array objects, not just an iterable. That's mainly for historical reasons. +第二个区别是 `Object.*` 方法返回的是「真正的」数组对象,而不是可迭代项。这主要是历史原因。 -For instance: +举个例子: ```js let user = { @@ -49,7 +49,7 @@ let user = { - `Object.values(user) = ["John", 30]` - `Object.entries(user) = [ ["name","John"], ["age",30] ]` -Here's an example of using `Object.values` to loop over property values: +下面这个例子中,使用了 `Object.values` 在属性值上做循环操作: ```js run let user = { @@ -57,14 +57,14 @@ let user = { age: 30 }; -// loop over values +// 循环所有的值 for (let value of Object.values(user)) { alert(value); // John, then 30 } ``` -## Object.keys/values/entries ignore symbolic properties +## Object.keys/values/entries 忽略 Symbol 类型的属性 -Just like a `for..in` loop, these methods ignore properties that use `Symbol(...)` as keys. +就像 `for..in` 循环,这些方法会忽略使用 `Symbol(...)` 作为键的属性。 -Usually that's convenient. But if we want symbolic keys too, then there's a separate method [Object.getOwnPropertySymbols](mdn:js/Object/getOwnPropertySymbols) that returns an array of only symbolic keys. Also, the method [Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) returns *all* keys. +通常这很方便。但是如果我们也想要获得 Symbol 类型的键,那么有另外不同的方法 [Object.getOwnPropertySymbols](mdn:js/Object/getOwnPropertySymbols) 它会返回一个只包含 Symbol 类型的键的数组。同样,[Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 返回「所有」键。 From 0ce243a8b7d7b6e9e5108ba42c120ee0eaf654fc Mon Sep 17 00:00:00 2001 From: allen Date: Wed, 20 Jun 2018 15:40:01 +0800 Subject: [PATCH 03/10] Update task.md --- .../08-keys-values-entries/02-count-properties/task.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md b/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md index d7aebb1faa..68a5c6ef27 100644 --- a/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md +++ b/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md @@ -2,9 +2,9 @@ importance: 5 --- -# Count properties +# 计算属性数量 -Write a function `count(obj)` that returns the number of properties in the object: +写一个 `count(obj)` 函数返回一个对象的属性数量: ```js let user = { @@ -15,7 +15,7 @@ let user = { alert( count(user) ); // 2 ``` -Try to make the code as short as possible. +试着让代码尽可能简短。 -P.S. Ignore symbolic properties, count only "regular" ones. +提示:忽略 Symbol 属性,只计算「常规」属性。 From 0466aef283fa51b0eafd653036beeb9830d6170a Mon Sep 17 00:00:00 2001 From: allen Date: Thu, 28 Jun 2018 07:57:07 +0800 Subject: [PATCH 04/10] Update article.md --- .../08-keys-values-entries/article.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/article.md b/1-js/05-data-types/08-keys-values-entries/article.md index ed22486835..85f3fa2085 100644 --- a/1-js/05-data-types/08-keys-values-entries/article.md +++ b/1-js/05-data-types/08-keys-values-entries/article.md @@ -5,7 +5,7 @@ 在前面的章节中,我们认识了 `map.keys()`,`map.value()`,`map.entries()`。 -这些方法是广义的,对于数据结构,我们约定俗成使用它们。如果我们曾经自己创建过数据结构,我们也应该实现过它们。 +这些方法是通用的,有一个共同的约定来将它们用于各种数据结构。如果我们创建一个我们自己的数据结构,我们也应该实现这些方法。 它们支持: @@ -19,9 +19,9 @@ 对于纯对象,下列方法是可用的: -- [Object.keys(obj)](mdn:js/Object/keys) —— 返回包含所有键的数组。 -- [Object.values(obj)](mdn:js/Object/values) —— 返回包含所有值的数组。 -- [Object.entries(obj)](mdn:js/Object/entries) —— 返回包含所有 `[key, value]` 键值对的数组。 +- [Object.keys(obj)](mdn:js/Object/keys) —— 返回一个包含该对象全部的键的数组。 +- [Object.values(obj)](mdn:js/Object/values) —— 返回一个包含该对象全部的值的数组。 +- [Object.entries(obj)](mdn:js/Object/entries) ——返回一个包含该对象全部 [key, value] 键值对的数组。 ... 但是请注意区别(比如说跟 map 的区别): @@ -32,7 +32,7 @@ 第一个区别是在对象中我们的调用语法是 `Object.key(obj)`,而不是 `obj.key()`。 -为什么会这样?主要原因是弹性化。请记住,在 JavaScript 中对象是所有复杂数据结构的基础。因此我们可能自己创建一个对象,比如 `order`,然后实现它自己的方法 `order.values()`。那么,我们依然可以对它调用 `Object.values(order)` 方法。 +为什么会这样?主要原因是保持灵活。请记住,在 JavaScript 中对象是所有复杂数据结构的基础。所以我们可能有一个我们自己创建的对象,比如 `order`,它实现了自己的方法 `order.values()`。同时,我们依然可以对它调用 `Object.values(order)` 方法。 第二个区别是 `Object.*` 方法返回的是「真正的」数组对象,而不是可迭代项。这主要是历史原因。 @@ -49,7 +49,7 @@ let user = { - `Object.values(user) = ["John", 30]` - `Object.entries(user) = [ ["name","John"], ["age",30] ]` -下面这个例子中,使用了 `Object.values` 在属性值上做循环操作: +这里有一个使用 `Object.valuesa` 来遍历属性值的例子: ```js run let user = { @@ -57,14 +57,15 @@ let user = { age: 30 }; -// 循环所有的值 +// 遍历所有的值 for (let value of Object.values(user)) { alert(value); // John, then 30 } ``` + ## Object.keys/values/entries 忽略 Symbol 类型的属性 就像 `for..in` 循环,这些方法会忽略使用 `Symbol(...)` 作为键的属性。 -通常这很方便。但是如果我们也想要获得 Symbol 类型的键,那么有另外不同的方法 [Object.getOwnPropertySymbols](mdn:js/Object/getOwnPropertySymbols) 它会返回一个只包含 Symbol 类型的键的数组。同样,[Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 返回「所有」键。 +通常这很方便。但是如果我们也想要获得 Symbol 类型的键,那么有另外不同的方法 [Object.getOwnPropertySymbols](mdn:js/Object/getOwnPropertySymbols), 它会返回一个只包含 Symbol 类型的键的数组。同样,[Reflect.ownKeys(obj)](mdn:js/Reflect/ownKeys) 方法会返回「所有」键。 From 40528d6f9e5b5e1ea5ce54296bab12da9c7436db Mon Sep 17 00:00:00 2001 From: allen Date: Thu, 28 Jun 2018 07:58:22 +0800 Subject: [PATCH 05/10] Update task.md --- .../08-keys-values-entries/01-sum-salaries/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md index 6787c747e8..0c92ef9d72 100644 --- a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md +++ b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md @@ -4,9 +4,9 @@ importance: 5 # 属性求和 Sum the properties -有一个 `salaries` 对象,包含了薪水的值。 +有一个 salaries 对象,包含了任意数量的薪水。 -写一个 `sumSalaries(salaries)` 函数,使用 `Object.values` 和 `for..of` 循环语句返回所有薪水的和。 +使用 Object.values 和 for..of 循环语句写一个可以返回所有薪水的和的函数sumSalaries(salaries)。 如果 `salaries` 是空对象,那么结果必须是 `0`。 From 8b894f4870790285d569a30c764872230d027e35 Mon Sep 17 00:00:00 2001 From: allen Date: Thu, 28 Jun 2018 07:59:40 +0800 Subject: [PATCH 06/10] Update task.md --- .../08-keys-values-entries/02-count-properties/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md b/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md index 68a5c6ef27..9d0bc9b3f2 100644 --- a/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md +++ b/1-js/05-data-types/08-keys-values-entries/02-count-properties/task.md @@ -4,7 +4,7 @@ importance: 5 # 计算属性数量 -写一个 `count(obj)` 函数返回一个对象的属性数量: +写一个可以返回对象的属性数量的函数 count(obj) : ```js let user = { From 481db1305180734af3f668787b25b13dc3c24efe Mon Sep 17 00:00:00 2001 From: allen Date: Thu, 28 Jun 2018 08:01:08 +0800 Subject: [PATCH 07/10] Update article.md --- 1-js/05-data-types/08-keys-values-entries/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/08-keys-values-entries/article.md b/1-js/05-data-types/08-keys-values-entries/article.md index 85f3fa2085..d5b131aa5d 100644 --- a/1-js/05-data-types/08-keys-values-entries/article.md +++ b/1-js/05-data-types/08-keys-values-entries/article.md @@ -13,7 +13,7 @@ - `Set` - `Array` (除了 `arr.values()`) -纯对象也支持这些方法,但是语法上有一些不同 +纯对象也支持类似的方法,但是语法上有一些不同 ## Object.keys、values、entries 三个方法 From bf9244749635d4153b76a1fa66c9baea5ba78399 Mon Sep 17 00:00:00 2001 From: allen Date: Wed, 4 Jul 2018 16:09:25 +0800 Subject: [PATCH 08/10] Update article.md --- 1-js/05-data-types/08-keys-values-entries/article.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/08-keys-values-entries/article.md b/1-js/05-data-types/08-keys-values-entries/article.md index d5b131aa5d..b0a1b8ab48 100644 --- a/1-js/05-data-types/08-keys-values-entries/article.md +++ b/1-js/05-data-types/08-keys-values-entries/article.md @@ -30,7 +30,7 @@ | 调用语法 | `map.keys()` | `Object.keys(obj)`,而不是 `obj.keys()` | | 返回值 | 可迭代项 |「真正的」数组 -第一个区别是在对象中我们的调用语法是 `Object.key(obj)`,而不是 `obj.key()`。 +第一个区别是在对象中我们的调用语法是 `Object.keys(obj)`,而不是 `obj.keys()`。 为什么会这样?主要原因是保持灵活。请记住,在 JavaScript 中对象是所有复杂数据结构的基础。所以我们可能有一个我们自己创建的对象,比如 `order`,它实现了自己的方法 `order.values()`。同时,我们依然可以对它调用 `Object.values(order)` 方法。 From 8579ca6872163493230b16a50b917fa4a7c1f105 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 13 Jul 2018 14:36:33 +0800 Subject: [PATCH 09/10] Update task.md --- .../08-keys-values-entries/01-sum-salaries/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md index 0c92ef9d72..0989b7276d 100644 --- a/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md +++ b/1-js/05-data-types/08-keys-values-entries/01-sum-salaries/task.md @@ -6,7 +6,7 @@ importance: 5 有一个 salaries 对象,包含了任意数量的薪水。 -使用 Object.values 和 for..of 循环语句写一个可以返回所有薪水的和的函数sumSalaries(salaries)。 +使用 Object.values 和 for..of 循环语句写一个可以返回所有薪水的和的函数 sumSalaries(salaries)。 如果 `salaries` 是空对象,那么结果必须是 `0`。 From 58f1bcf0aa7efb0fe034191353be523c5a51cf0d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Fri, 13 Jul 2018 14:37:37 +0800 Subject: [PATCH 10/10] Update article.md --- 1-js/05-data-types/08-keys-values-entries/article.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1-js/05-data-types/08-keys-values-entries/article.md b/1-js/05-data-types/08-keys-values-entries/article.md index b0a1b8ab48..ab050ebb35 100644 --- a/1-js/05-data-types/08-keys-values-entries/article.md +++ b/1-js/05-data-types/08-keys-values-entries/article.md @@ -11,7 +11,7 @@ - `Map` - `Set` -- `Array` (除了 `arr.values()`) +- `Array`(除了 `arr.values()`) 纯对象也支持类似的方法,但是语法上有一些不同 @@ -21,7 +21,7 @@ - [Object.keys(obj)](mdn:js/Object/keys) —— 返回一个包含该对象全部的键的数组。 - [Object.values(obj)](mdn:js/Object/values) —— 返回一个包含该对象全部的值的数组。 -- [Object.entries(obj)](mdn:js/Object/entries) ——返回一个包含该对象全部 [key, value] 键值对的数组。 +- [Object.entries(obj)](mdn:js/Object/entries) —— 返回一个包含该对象全部 [key, value] 键值对的数组。 ... 但是请注意区别(比如说跟 map 的区别):