阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS 数组推导语法【非标准】

      非标准。不要使用! 数组推导是非标准的。以后应该用 Array.prototype.map,Array.prototype.filter,箭头函数和展开语法。

      功能

      数组推导式是一种 JavaScript 表达式语法,使用它,你可以在一个原有数组的基础上快速的构造出一个新的数组。但是它已经从标准和火狐中移除。不要用它!

      语法

      [for (x of iterable) x]
      [for (x of iterable) if (condition) x]
      [for (x of iterable) for (y of iterable) x + y]
      
      

      描述

      在数组推导式内部,可以使用下面两种子语句:

      • for…of
      • if

      每个 for-of 语句都放在与其配对的 if 语句(可以有多个,也可以完全省略)的左边,每个数组推导式中可以包含多组这样的配对,但最终选取的表达式值只能有一个,且这个值(也可以是个数组推导式,也就是说可以嵌套)只能放在推导式的最右边,紧靠着右中括号。

      示例

      基本的数组推导式写法

      [for (i of [ 1, 2, 3 ]) i*i ];
      // [ 1, 4, 9 ]
      
      var abc = [ "A", "B", "C" ];
      [for (letters of abc) letters.toLowerCase()];
      // [ "a", "b", "c" ]
      

      带有 if 语句的数组推导式

      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]
      

      用数组推导式比用数组的 map、filter 方法更简洁

      对比数组的 map 和 filter 方法:

      var numbers = [ 1, 2, 3 ];
      
      numbers.map(function (i) { return i * i });
      [for (i of numbers) i*i ];
      // 返回值都是 [ 1, 4, 9 ]
      
      numbers.filter(function (i) { return i < 3 });
      [for (i of numbers) if (i < 3) i];
      // 返回值都是 [ 1, 2 ]
      

      带有两个数组的数组推导式

      用两个 for-of 语句迭代两个不同的数组:

      var numbers = [ 1, 2, 3 ];
      var letters = [ "a", "b", "c" ];
      
      var cross = [for (i of numbers) for (j of letters) i+j];
      // [ "1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c" ]
      
      var grid = [for (i of numbers) [for (j of letters) i+j]];
      // [
      //  ["1a", "1b", "1c"],
      //  ["2a", "2b", "2c"],
      //  ["3a", "3b", "3c"]
      // ]
      
      [for (i of numbers) if (i > 1) for (j of letters) if(j > "a") i+j]
      // ["2b", "2c", "3b", "3c"],和下面的写法等效:
      
      [for (i of numbers) for (j of letters) if (i > 1) if(j > "a") i+j]
      // ["2b", "2c", "3b", "3c"]
      
      [for (i of numbers) if (i > 1) [for (j of letters) if(j > "a") i+j]]
      // [["2b", "2c"], ["3b", "3c"]],和下面的写法不等效:
      
      [for (i of numbers) [for (j of letters) if (i > 1) if(j > "a") i+j]]
      // [[], ["2b", "2c"], ["3b", "3c"]]
      

      规范

      最初起草在 ECMAScript 6 草案中,但在第 27 版(2014 年 8 月)中被移除。

      请参阅 ES 6 的旧修订版的规范语义。

      目录
      目录