es6 部分方法总结

部分列子引用的阮一峰ES6教程中的例子

这篇文章主要是自己经常用得一些方法总结, 想全篇学习es6, 可以看阮一峰ES6入门

1: let命令
  • let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
  • for循环用它声明计数器很好, 因为计数器i只在for循环体内有效,这样这次的i在块级作用域被调用时都是当时的i被保存, 下次生成的又是新的i , 效果类似闭包
  • 不存在变量提升, 所以一定要先声明在使用,
  • 不同作用域中声明同一函数名; 例如:
    • 函数中用let声明了变量, 如果全局有一个同名变量名, 函数中次变量始终指向函数内的变量, 且在let声明前调用报错,
  • **同作用域的同一个变量名: **
    • 不允许在同一作用域使用同一变量名多次声明, 不然会报错
  • let新增了块级作用域,效果类似闭包, 单好使多了

变量的空位

[, , ,]数组中,号分隔却没有值, 表示空位

ES5中, 对空位的处理是忽略空位

  • forEach(), filter(), every() 和 some()都会跳过空位。
  • map()会跳过空位,但会保留这个值
  • join()和toString()会将空位视为undefined,而undefined和null会被处理成空字符串。

ES6 中则是明确将空位转为undefined
接下来的方法中

Array.from方法会将数组的空位,转为undefined
  Array.from(['a',,'b'])
  // [ "a", undefined, "b" ]

扩展运算符(...)也会将空位转为undefined
  [...['a',,'b']]
  // [ "a", undefined, "b" ]

遍历:// entries()
 [...[,'a'].entries()] 
// [[0,undefined], [1,"a"]]
等等, 只要是空位都会被undefined填充 
2: 变量的解构

1: 我的理解就是变量名和值一一对应,

  var [a, b, c] = [1, 2, 3];  相当于 var a = 1;  var b = 2; var c = 3;

  let [foo, [[bar], baz]] = [1, [[2], 3]];foo : 1;   bar : 2;   baz :  3 

2: 我这里没有用很多,还有很多方法, 可以去看下最上面阮一峰的教程

3: 字符串
  • 1: 提供了遍历字符串的接口

      for (let codePoint of 'foo') { console.log(codePoint)}
        // "f"
        // "o"
        // "o"
    
  • 2:includes(), startsWith() endsWidth()
    返回的是布尔值, 可以做字符串的判断, 包括一些验证

  • includes():返回布尔值,表示是否找到了参数字符串。

  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。

  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。

  • 3: repeat()重复一个字符串多少次

      w.repeat(3); 
       =>  " www"
    
    • 如果重复次数是小数, 会转换成字符串,
    • 如果重复次数是负数, 0 ~ -1 会转换成 0 , 小于-1会报错
    • 如果重复次数是字符串会转换成数字
  • 4: 模板字符串
    模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量

    省去了以前前端在js中拼接html的烦扰, 还可以任意添加变量方法等

html的拼接

  $('#list').html(
      `<ul>
         <li>first</li>
         <li>second</li>
      </ul>`
    );

字符串中插入变量

```
  function fn() {
     return " World";
  }
  `Hello ${fn()} lalala` 
  "Hello World  lalala"
```

遇到的问题:
用url往后端传值时, 用字符串模板, 单独写 src=包裹会报错,
最后在变量外包裹了 src={ }才解决

 <iframe className="cdp-map-content-ifram" id="ss" src={`/map/hisTrack.jsp?themeCfgObj=${themeCfgObj}`}/>

4: 数组
  • 1: Array.from()主要方法是将两类类似数组的对象转换为真正的数组, 包括可遍历对象
  • 1: 所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此任何有length属性的对象,都可以通过Array.from方法转为数组
 这是个类似数组的对象: 
let arrayLike = {
        '0': 'a', 
        '1': 'b',
        '2': 'c', 
        length: 3
   };

     // ES5的写法var arr1 = [].slice.call(arrayLike);
     // ['a', 'b', 'c']
     // ES6的写法let arr2 = Array.from(arrayLike); 
     // ['a', 'b', 'c']
  • 常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的arguments对象Array.from都可以将它们转为真正的数组。
  • 字符串和Set结构 都可以使用Array.from都可以将它们转为真正的数组。
  • 兼容处理:
const toArray = (() =>
     Array.from ? Array.from : obj => [].slice.call(obj)
)();
  • Array.from还可以接受第二个参数,作用类似于数组的map
    方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
  Array.from([1, 2, 3], (x) =>
     x * x
)
// [1, 4, 9]

2: Array.of()方法用于将一组值,转换为数组
Array.of() // [] Array.of(undefined) // [undefined] Array.of(3, 11, 8) // [3,11,8] Array.of(3) // [3] Array.of(3).length // 1
3: find()findIndex()

  • 数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined
```
    [1, 5, 10, 15].find(function(value, index, arr) { 
            return value > 9;
      }, this) 
      // 10
```
  • 上列中可见find方法的回调函数可以接受三个参数,依次为当前的值当前的位置原数组

  • find(回调函数, this) 第二个参数是this

  • findIndex(回调函数, this); 用法同find() 只不过返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1

  • 4: 数组的遍历
    数组都可以使用 for...of循环来遍历数组, for ( ... of ...) {}
    keys() , values(), entries();

    • key() 遍历结果为数组的键名
    • value()遍历的结果为数组的键值
    • entries()遍历的结果为数组的键值对
      for (let index of ['a', 'b'].keys()) {
      console.log(index)
      ;}
      // 0 // 1
      for (let elem of ['a', 'b'].values()) {
      console.log(elem)
      ;}
      // 'a' // 'b'
      for (let [index, elem] of ['a', 'b'].entries()) {
      console.log(index, elem)
      ;}
      // 0 "a" // 1 "b"
  • 5: es7的includes()
    array.includes(x) 数组中是否有值x;
    方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似

      [1, 2, 3].includes(2);  // true
      [1, 2, 3].includes(4);  // false
      [1, 2, NaN].includes(NaN); // true
    

    其还有第二个参数:
    表示搜索的起始位置,默认为0。
    如果第二个参数为负数,则表示倒数的位置,
    如果这时它大于数组长度(比如第二个参数为-4,但数组长度为3),则会重置为从0开始。

      [1, 2, 3].includes(3, 3);  // false
      [1, 2, 3].includes(3, -1); // true
    
5: 函数
  • 1: ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
  function log(x, y = 'World') {
     console.log(x, y);
  }

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
  • 2: ES6引入rest参数(形式为“...变量名”),用于获取函数的多余参数

      function add(...values) { 
        let sum = 0;
        for (var val of values) { 
          sum += val; 
        } 
        return sum;
    }
    
    add(2, 5, 3) // 10
    
    • 注意,rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错

        // 报错
        function f(a, ...b, c) {  // ...}
      
    • 函数的length属性,不包括rest参数。

        (function(a) {}).length  // 1
        (function(...a) {}).length  // 0
        (function(a, ...b) {}).length  // 1
      
  • 3: 扩展运算符
    扩展运算符(spread)是三个点(...)将一个数组转为用逗号分隔的参数序列

      (...[1, 2, 3])
      // 1 ,2 ,3
    
    • 可以替代数组的apply , 将数组转为函数的参数

        es5: 
          var args = [0, 1, 2];
          f.apply(null, args);
      
       es6: 
          var args = [0, 1, 2];
          f(...args);
      
          ES5的写法
              Math.max.apply(null, [14, 3, 77])
      
          ES6的写法
              Math.max(...[14, 3, 77])
      
    • 扩展运算符的运用:

      • 1: 合并数组
          var arr1 = ['a', 'b'];
          var arr2 = ['c'];
          var arr3 = ['d', 'e'];
        
        // ES5的合并数组
        arr1.concat(arr2, arr3);
        // [ 'a', 'b', 'c', 'd', 'e' ]
        
        // ES6的合并数组
        [...arr1, ...arr2, ...arr3]
        // [ 'a', 'b', 'c', 'd', 'e' ]
        
      • 2: 与解构赋值结合
          const [first, ...rest] = [1, 2, 3, 4, 5];
          first // 1
          rest  // [2, 3, 4, 5]
        
        • 注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错
      • 3: 字符串
        扩展运算符还可以将字符串转为真正的数组。
          [...'hello']
        // [ "h", "e", "l", "l", "o" ]
        
      • 其他方法: 详细见页头阮一峰es6入门教程
  • 5: 箭头函数
    ES6允许使用“箭头”(=>)定义函数。

        var f = v => v;
    
      等同于: 
      var f = function (v) {
           return v 
      }
    
      第一个等号后面的为function的参数(v);
      第二个箭头等号指的是返回值, return v
    

    参数位写法: 第一个等号后 ( = ),

    • 如果参数为空, 第一个等号后面是 () 例如: var f = () => 5;
    • 如果参数只有1个, 第一个等号后面是这个参数, 例如: var f = v => v;
    • 如果参数有多个, 第一个等号后面是(x,y,z,....) , 例如: var sum = (num1, num2) => { return num1 + num2; }

    箭头等号( => )后代码块写法:

    • 如果返回的代码块只有一条语句直接写: var f = () => 5;
    • 如果返回的代码块多于一句,加上{ }: var sum = (num1, num2) => { return num1 + num2; }
    • 如果返回是个对象怎么办(对象有已一个{}), 再加一个{}, var getTempItem = id => ({ id: id, name: "Temp" }); 因为{ } 被解析成代码块

    箭头函数使用起来简化了es5函数

      // 正常函数写法
        [1,2,3].map(function (x) {
           return x * x;
        });
    
      // 箭头函数写法
      [1,2,3].map(x => x * x);
    

    箭头函数使用注意事项 :

    • 1: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象, 即作用域始终绑定定义时所在的作用域,而不是指向运行时所在的作用域。
    • 2: 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    • 3: 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
    • 4: 不可以使用yield命令,因此箭头函数不能用作Generator函数。

    关于箭头函数的this, 始终固化为终绑定定义时所在的对象
    指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。

这次先到这, 还有一些没有总结, 下次继续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,505评论 0 8
  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,043评论 8 25
  • 《ECMAScript6 入门》阮一峰 读书笔记 let和constlet声明的变量仅在块级作用域内有效,var声...
    亲爱的孟良阅读 709评论 1 2
  • 一包烟为什么20只装,终于有了标准的答案,一支爱你,一支等待,一支守候,一支期待,一支渴望,一支幻想,一支难过,一...
    排位赛阅读 631评论 0 0
  • 歪理的人说话理直气壮,我有理却说话却惟惟诺诺。 内心深处欠缺透明的勇气,更是懦弱。 做事拖泥带水,从不干干脆脆……...
    淋湿的爱情阅读 350评论 0 2