ES6 基础小记(一)

一、 let和const

1.let声明的变量用块作用域 { }包围的,块作用域之外变量是不存在的,let声明的变量仅在自己的块作用域有效。

2.使用const声明的变量是不可以修改的,声明的时候必须赋值。

使用let/const声明的变量,从一开始就形成了封闭作用域,在声明变量之前是无法使用这个变量的,这个特点也是为了弥补var的缺陷(var声明的变量有变量提升)

二、解构赋值

解构,简单来说就是:左边一种结构,右边一种结构,对应一一赋值。
1.数组解构赋值

{
   let a,b,rest
   [a,b] = [1,2]
    console.log(a,b)
}
{
    let a,b,rest
    [a,b,...rest] = [1,2,3,4,5,6]
    console.log(a,b,rest)
}

2.对象解构赋值

{
    let a,b
    ({a,b} = {a:1,b:2})
    console.log(a,b)
}

简化变量交换

{
    let a = 1;
    let b = 2;
    [a,b]=[b,a];
    console.log(a,b)
}

三、正则拓展

1.构造函数发生变化

{
    // ES5两种构造方法
    let regex =  new RegExp('xyz', 'i')
    let regex2 =  new RegExp(/xyz/i)
     console.log(regex.test('xyz123'),regex2.test('xyz123'));
    //ES6
    let regex3 =  new RegExp(/xyz/ig, 'i')
}

2.正则方法的拓展

{
    //1。 y修饰符
    let s = 'bbbb_bbb_bb_b';
    var a1 = /b+/g;
    var a2 = /b+/y;

    console.log(a1.exec(s), a2.exec(s)); // ["bbbb"],["bbbb"]
    console.log(a1.exec(s), a2.exec(s)); // ["bbb"],null
    // g从匹配之后的任意位置匹配都算
    // y从匹配之后的下一个位置之后匹配
    console.log(a1.sticky, a2.sticky); //表示是否开启了粘连模式
}
{
   //2。 u修饰符
    console.log('u修饰符',/^\uD83D/.test('\uD83D\uDC2A')); // true
    console.log('u修饰符',/^\uD83D/u.test('\uD83D\uDC2A')); // false
    // 大括号表示Unicode字符,只有加上u才能识别
    // 使用u修饰符后,所有量词都会正确识别大于码点大于0xFFFF的Unicode字符。
    // 大于两个字节要加上u去识别,否则会报错
    console.log('量词',/a{2}/.test('aa')); // true
    console.log('量词',/a{2}/u.test('aa')); // true
    console.log('量词',/??{2}/.test('????')); // false
    console.log('量词',/??{2}/u.test('????')); // true
}

四、字符串拓展

1.Unicode表示法

可处理两个字节的字符

{
    console.log('a',`\u0061`);
    // 大于两个字节(0xFFFF)
    console.log('s',`\u20BB7`);
    // 使用大括号包起来
    console.log('s',`\u{20BB7}`);
}

2.字符串遍历器( for of)

{
    let str='\u{20bb7}abc';
    for(let i=0;i<str.length;i++){
        console.log('es5',str[i]);
    }
    for(let code of str){
        console.log('es6',code);
    }
}

3.模版字符串

{
   let name="list";
   let info="hello world";
   let m=`i am ${name},${info}`;
   console.log(m);
}

4.标签模版
应对场景:1.xmls攻击;2.多语言

{
    let user={
        name:'list',
        info:'hello world'
    };
    console.log(abc`i am ${user.name},${user.info}`);
    function abc(s,v1,v2){
        console.log(s,v1,v2);
        return s+v1+v2
    }
}
{
    console.log(String.raw`Hi\n${1+2}`);
    console.log(`Hi\n${1+2}`);
}

五、数值扩展

常用的几个新增方法,判断数据是否溢出;取整;新增的几个数学方法

{
    // 2^53~-2^53 数字的上限 边界
    console.log(Number.MAX_SAFE_INTEGER,Number.MIN_SAFE_INTEGER);
    // 判断数字是否在有效范围Number.isSafeInteger()
    // 保证参数传入是数字
    console.log('10',Number.isSafeInteger(10));
    console.log('a',Number.isSafeInteger('a'));
}
{
    // 返回一个小数的整数部分
    console.log(4.1,Math.trunc(4.1));
    console.log(4.9,Math.trunc(4.9));
}

六、数组扩展

1.Array.from

{
    // 伪数字 集合转换为数组
    let p =document.querySelectorAll('p')
    let pArr = Array.from(p)
    pArr.forEach(function(item){
        console.log(item.textContent)
    })
    // 类似map的映射关系
    console.log(Array.from([1,3,5],function(item){
        return item *2
    }))
}

2.Array.of

{
    // 一组一样的数据类型,转换为数组
    let arr = Array.of(3,4,7,9)
    console.log(arr)
}

3.copyWithin

{
    // 起始替换位置,读取数据位置,截止位置
    console.log([1, 2, 3, 4, 5, 6, 7, 8, 9].copyWithin(0,2,5));
    //       [3, 4, 5, 4, 5, 6, 7, 8, 9]
}

4.find/findIndex

{
    // 只找到第一个满足条件的
    console.log([1,2,3,4,5,6].find(function(item){return item>3}));
    console.log([1,2,3,4,5,6].findIndex(function(item){return item>3}));
}

5.fill

{
    // 填充数组
    console.log('fill-7',[1,'a',undefined].fill(7));
    // 1,3表示起始和截止位置
    console.log('fill,pos',['a','b','c','d'].fill(7,1,3));
}

6.entries/keys/values

{
    // 返回下标集合
    for(let index of ['1','c','ks'].keys()){
        console.log('keys',index);
    }
    // 不使用兼容 浏览器会报错(现在兼容了)
    for(let value of ['1','c','ks'].values()){
        console.log('values',value);
    }
    for(let [index,value] of ['1','c','ks'].entries()){
        console.log('values',index,value);
    }
}

7.inludes

// 寻找满足条件的元素
{
    console.log('number',[1,2,NaN].includes(1));
    console.log('number',[1,2,NaN].includes(NaN));
}

七、函数扩展

1.参数默认值

{
    function test(x, y = 'hello', z='word'){
        console.log('默认值',x,y,z);
    }
    test('hello');
    test('hello','hi');
    // 默认值后面不能有没有默认值的变量
}

2.rest参数

类似ES5的arguments

{
    // 不确定有多少个参数,把参数转换为数组
    // rest参数之后不能带有其他参数了
    function test3(...arg){
        for(let v of arg){
            console.log('rest',v);
        }
    }
    test3(1,2,3,4,'a');
}

3.扩展运算符

{
    console.log(...[1,2,4]);
    console.log('a',...[1,2,4]);
}

4.箭头函数
箭头函数替代了以前需要显式的声明一个变量保存this的操作,使得代码更加的简洁

箭头函数没有自己this,它的this是词法的,引用的是上下文的this,即在你写这行代码的时候就箭头函数的this就已经和外层执行上下文的this绑定了

{
    // 箭头函数
    let arrow = v => v*2;
    let arrow2 = () => 5;
    console.log('arrow',arrow(3));
    console.log(arrow2());

}

5.尾调用

提升性能,做递归、嵌套别的函数,用尾调用的形式

{
    // 尾调用 函数的最后一句话是不是函数?
    function tail(x){
        console.log('tail',x);
    }
    function fx(x){
        return tail(x)
    }
    fx(123)
}

6.this绑定
箭头函数中this的指向,同ES5有区别。ES5指函数被调用时的对象所在,箭头函数为定义时所在

八、对象拓展

1.简介表示法

ES6允许当对象的属性和值相同时,省略属性名;ES6允许当一个对象的属性的值是一个函数(即是一个方法),可以使用简写的形式

{
    // 简洁表示法
    let o=1;
    let k=2;
    let es5={
        o:o,
        k:k
    };
    let es6={
        o,
        k
    };
    console.log(es5,es6);

    let es5_method={
        hello:function(){
            console.log('hello');
        }
    };
    let es6_method={
        hello(){
            console.log('hello');
        }
    };
    console.log(es5_method.hello(),es6_method.hello());
}

2.属性表达式

{
    // 属性表达式
    let a='b';
    let es5_obj={
        a:'c',
        b:'c'
    };

    let es6_obj={
        [a]:'c'
    }

    console.log(es5_obj,es6_obj);

}

3.扩展运算符

{
    // 扩展运算符
    let a={a:'test',b:'kill'};
    a ={
        ...a,
        c:'ddd',d:'ccc'
    }
    console.log(a)
}

4.Object新增方法
Object.is:判断是否相等,等价于 ===

{
    console.log('字符串',Object.is('abc','abc'),'abc'==='abc');
}

Object.assign:浅拷贝

{
    console.log('拷贝',Object.assign({a:'a'},{b:'b'}));
}

Object.entries:遍历对象

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

推荐阅读更多精彩内容

  • 一、ES6简介 ? 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,067评论 8 25
  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,005评论 0 7
  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,777评论 0 1
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,372评论 0 1
  • 小简经?;嵯肫鸶盖?,永远都忘不了父亲离世的那一天。那一天,父亲选择了“死亡”。 小简当时还是个小孩,不明白父亲为什...
    巫二小姐_2987阅读 369评论 0 1