From 180792d54b4dbc5729ba783e44892efafd80a648 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 12 Jun 2014 14:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9array/comprehesion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/array.md | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/docs/array.md b/docs/array.md index c398761..9c68fb8 100644 --- a/docs/array.md +++ b/docs/array.md @@ -145,7 +145,7 @@ ES6提供简洁写法,允许直接通过现有数组生成新数组,这被 ```javascript var a1 = [1, 2, 3, 4]; -var a2 = [i * 2 for (i of a1)]; +var a2 = [for (i of a1) i * 2]; a2 // [2, 4, 6, 8] @@ -153,6 +153,26 @@ a2 // [2, 4, 6, 8] 上面代码表示,通过for...of结构,数组a2直接在a1的基础上生成。 +注意,数组推导中,for...of结构总是写在最前面,返回的表达式写在最后面。 + +for...of后面还可以附加if语句,用来设定循环的限制条件。 + +```javascript + +var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ]; + +[for (year of years) if (year > 2000) year]; +// [ 2006, 2010, 2014 ] + +[for (year of years) if (year > 2000) if(year < 2010) year]; +// [ 2006] + +[for (year of years) if (year > 2000 && year < 2010) year]; +// [ 2006] + +``` +上面代码表明,if语句写在for...of与返回的表达式之间,可以使用多个if语句。 + 数组推导可以替代map和filter方法。 ```javascript @@ -161,7 +181,7 @@ a2 // [2, 4, 6, 8] // 等价于 [1, 2, 3].map(function (i) { return i * i }); -[i for (i of [1,4,2,3,-8]) if (i < 3)]; +[for (i of [1,4,2,3,-8]) if (i < 3) i]; // 等价于 [1,4,2,3,-8].filter(function(i) { return i < 3 }); @@ -169,7 +189,7 @@ a2 // [2, 4, 6, 8] 上面代码说明,模拟map功能只要单纯的for...of循环就行了,模拟filter功能除了for...of循环,还必须加上if语句。 -新引入的for...of结构,可以直接跟在表达式的前面或后面,甚至可以在一个数组推导中,使用多个for...of结构。 +在一个数组推导中,还可以使用多个for...of结构,构成多重循环。 ```javascript @@ -177,7 +197,7 @@ var a1 = ["x1", "y1"]; var a2 = ["x2", "y2"]; var a3 = ["x3", "y3"]; -[(console.log(s + w + r)) for (s of a1) for (w of a2) for (r of a3)]; +[for (s of a1) for (w of a2) for (r of a3) console.log(s + w + r)]; // x1x2x3 // x1x2y3 // x1y2x3 @@ -197,9 +217,9 @@ var a3 = ["x3", "y3"]; ```javascript -[c for (c of 'abcde') if (/[aeiou]/.test(c))].join('') // 'ae' +[for (c of 'abcde') if (/[aeiou]/.test(c)) c].join('') // 'ae' -[c+'0' for (c of 'abcde')].join('') // 'a0b0c0d0e0' +[for (c of 'abcde') c+'0'].join('') // 'a0b0c0d0e0' ``` @@ -211,4 +231,4 @@ var a3 = ["x3", "y3"]; 这两个方法用于监听(取消监听)数组的变化,指定回调函数。 -它们的用法与Object.observe和Object.unobserve方法完全一致,请参阅《对象的扩展》一章。唯一的区别是,对象可监听的变化一共有六种,而数组只有四种:add、update、delete、splice(数组的length属性发生变化)。 +它们的用法与Object.observe和Object.unobserve方法完全一致,也属于ES7的一部分,请参阅《对象的扩展》一章。唯一的区别是,对象可监听的变化一共有六种,而数组只有四种:add、update、delete、splice(数组的length属性发生变化)。