ES6基础知识

一、声明变量

var a = 1; // var 是variable的简写,可以理解成变量的意思。 -----> 全局声明,都可以拿到。
let b = 2; // let 在英文中是“让”的意思,也可以理解为一种声明的意思。 -----> 开启部分作用域,只在当前作用域有效
const c = 3; //const 在英文中也是常量的意思。 ----->常量可以简单理解为不变的量。声明之后不可改变

二、变量的解构赋值

1、定义

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。

2、数组的解构赋值

  let [a,b,c]=[1,2,3]
    // 等价于下面的单独赋值
    // let a = 1;
    // let b = 2;
    // let c = 3;
    console.log(a,b,c) // 1 2 3

3、 对象的解构赋值


let {foo,bar} = {foo:'小花',bar:'大花'};
console.log(foo+bar); //大花小花

let foo;
// {foo} = {foo:'小花'}; 当提前定义过变量时,解构会报错,需要使用()包裹
({foo} = {foo:'小花'});
console.log(foo); //小花

4、字符串的解构

const [a,b,c,d,e,f]="这是一个测试";
console.log(a);//这
console.log(b);//是
console.log(c);//一
console.log(d);//个
console.log(e);//测
console.log(f);//试

5、解构的默认值

   let [a,b="小花"]=['大花']
    // 此时 对a进行了赋值, b未赋值,则给默认值'小花'
    console.log(a + b); // 大花小花
    
    // 需要注意的是undefined和null的区别:

    let [a,b="小花"]=['大花',undefined];
    console.log(a + b); // 大花小花


    let [a,b="小花"]=['大花',null];
    console.log( a + b); //大花null

注意:
1、数组模式和赋值模式统一; 即 等号左边和等号右边的形式要统一,如果等号两边形式不一样,很可能获得undefined或者直接报错。
2、需要注意的是undefined和null的区别

三、扩展运算符和rest运算符

1、对象扩展运算符(…)

  //可以传入多个值,并且就算方法中引用多了也不会报错
    function xiaohua(...arg){
        console.log(arg[0]);
        console.log(arg[1]);
        console.log(arg[2]);
        console.log(arg[3]);
    
    }
    xiaohua(1,2,3); // 1 2 3 undefined

数组赋值,将arr1的值赋值给arr2,然后我们改变arr2的值,你会发现arr1的值也改变了,因为我们这是对内存堆栈的引用,而不是真正的赋值。

    let arr1 = ['www', 'baidu', 'com'];
    let arr2 = arr1;
    console.log(arr2);//["www", "baidu", "com"]
    arr2.push('xiaohua');
    console.log(arr1, 'arr1');//["www", "baidu", "com", "xiaohua"] "arr1"
    console.log(arr2, 'arr2');//["www", "baidu", "com", "xiaohua"] "arr2"

利用对象扩展运算符简单的解决这个问题,此时arr1的值没有改变

    let arr1 = ['www', 'baidu', 'com'];
    let arr2 = [...arr1];
    console.log(arr2); //["www", "baidu", "com"]
    arr2.push('xiaohua');
    console.log(arr1, 'arr1'); //["www", "baidu", "com"] "arr1"
    console.log(arr2, 'arr2'); //["www", "baidu", "com", "xiaohua"] "arr2"

2、rest运算符

    function ceshi(first,...arg){
        console.log(arg);
    }
    ceshi('no','i','l','o','v','e','y','o','u');//["i", "l", "o", "v", "e", "y", "o", "u"]
    // rest运算符 可以用 ... 表示,运算符把逗号隔开的值序列组合成一个数组

其中for循环可以用 for...of;for…of的循环可以避免我们开拓内存空间,增加代码运行效率。 结果如下图:

    function ceshi(first,...arg){
        for(let val of arg){
            console.log(val);
        }
    }
    ceshi('no','i','l','o','v','e','y','o','u');
image.png

四、字符串模板

1、字符串拼接

支持html标签;支持运算符;结果如下:

    let a = '大花';
    let c = '小花';
    let b = `${a}不喜欢${c}</br>${c}喜欢${a}</br>`;
    let d = 1;
    let e = 2;
    let num = `${d+e}`
    document.write(b);
    document.write(num);
image.png

2、新增的方法

1、indexOf('a') --------- 判断字符串是否存在'a',不存在返回 -1,存在返回索引
2、includes('前端') -------- 判断字符串是否存在'前端',存在返回 true,不是返回 false
3、startsWith(':') ---------- 判断字符串是否以':'开头, 是返回 true,不是返回 false
4、endsWith(':') ----------- 判断字符串是否以':'结尾, 是返回 true, 不是返回 false
5、repeat() ---------------- 重复字符

    let str = ':一个不爱吃饭的前端不是一个好厨子?'
    console.log(str.indexOf('a'));// -1
    console.log(str.includes('前端'));//true
    console.log(str.startsWith(':'));//true
    console.log(str.endsWith(':'));//false
    console.log('吃饭|'.repeat(3));//吃饭|吃饭|吃饭|

五、ES6数字操作

  • 1、可以使用Number.isFinite( )来进行数字验证,只要是数字,不论是浮点型还是整形都会返回true,其他时候会返回false
  • 2、NaN是特殊的非数字,可以使用Number.isNaN()来进行验证。下边的代码控制台返回了true。
  • 3、判断是否为整数Number.isInteger(xx)
  • 4、整数转换Number.parseInt(xxx)和浮点型转换Number.parseFloat(xxx)
  • 5、最大安全整数:Number.MAX_SAFE_INTEGER;最小安全整数 : Number.MIN_SAFE_INTEGER
  • 6、安全整数判断isSafeInteger( )

六、新增的数组知识

1、Array.from():将json字符串转化为数组

    let json = {
        '0': '我',
        '1': '好',
        '2': '累啊',
        length: 3
    }

    let arr = Array.from(json);
    console.log(arr) //["我", "好", "累啊"]

2、Array.of(): 它负责把一堆文本或者变量转换成数组。

    let arr = Array.of(3, 4, 5, 6);
    console.log(arr); //[3, 4, 5, 6]

3、find()方法是从数组中查找

    let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    let cy =  arr.find(function (value, index, arr) {
        // value:表示当前查找的值。
        // index:表示当前查找的数组索引。
        // arr:表示当前数组。
        return value > 5;
    })
    console.log(cy);//6;如果找不到会显示undefined

4、fill()方法的作用是把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是填充到的位置

    let arr = [0, 1, 2, 3, 4, 5, 6];
    arr.fill('小花', 2, 5);
    console.log(arr);// [0, 1, "小花", "小花", "小花", 5, 6]

5、数组遍历

    let arr = ['大花', '小花', '大小花']
    // 获取的是 key
    // for (let item of arr) {
    //     console.log(item);
    // }

    // 获取的是 index
    // for(let index of arr.keys()){
    //     console.log(index)
    // }
    // 获取的是 index 和 key
    // for (let [index, val] of arr.entries()) {
    //     console.log(index + ':' + val);
    // }

    //entries()实例方式生成的是Iterator形式的数组,那这种形式的好处就是可以让我们在需要时用next()手动跳转到下一个值。
    //不理解也不知道什么情况下需要使用。
    let list=arr.entries();
    console.log(list.next().value);//[0, "大花"]
    console.log(list.next().value);//[1, "小花"]
    console.log(list.next().value);//[2, "大小花"]

七、ES6中的箭头函数和扩展

1、函数默认值、抛出错误、严谨模式(严谨模式与默认值不能同时使用)

//函数参数传递默认值
function add1(a,b=1){
    return a+b;
}
console.log(add1(1));
//关于函数的{}
//如果函数体内只有一条语句,则可以省略{},否则不可省略
//(a,b=1)是指这里b参数有个默认值,若b不传实参,则b的值为1

//主动抛出错误
function add2(a,b=1){
   //'use strict'//开启严谨模式
    if(a == 0){
        throw new Error('This is error')
    }
     return a+b;
}

console.log(add2(0));
console.log(add2.length);//获取参数的个数
//经常使用严谨模式来进行编程,但是必须写在代码最上边,相当于全局使用。在ES6中我们可以写在函数体中,相当于针对函数来使用。
//如果你使用了默认值,再使用严谨模式的话,就会有冲突,所以我们要取消默认值的操作,这时候你在运行就正常了。
//箭头函数不能当构造函数进行使用

2、ES6中的函数和数组补漏

  • 1、对象的函数解构
// 对象的函数解构
 let json = {
    a: '测试'
  }

  function fun({a,b = '1'}) {
    console.log(a, b);//测试 1
  }
  fun(json);
//在调用接口的时候,有的时候可能是需要传递多个参数的,这时使用这个写法就不用一个一个传递参数了。个人而言,看这段代码实在不知道什么时候可以用,但是好像项目中又用到了。迷茫ing...
  • 2、in的用法

in是用来判断对象或者数组中是否存在某个值的。我们先来看一下用in如何判断对象里是否有某个值。
对象中是否存在某个属性名;数组下标位置是否为空。

 let obj={
    a:'啊',
    c: '照片详情',
    b:'哦'
  }
  console.log('d' in obj);  //false


let arr=['喜欢','毛不易'];
  console.log(0 in arr);  // true
//0是指数组下标位置为0是否为空。
  • 3、数组的遍历方法(forEach,filter,some,map)
 console.log('------forEach遍历数组------')
//forEach循环的特点是会自动省略为空的数组元素,相当于直接给我们筛空了。当是有时候也会给我们帮倒忙。
  let arr=['毛不易','是', '', '小可爱'];
  arr.forEach((val,index)=>console.log(index,val));
  console.log('-----filter遍历数组--------')
  arr.filter((val,index)=>console.log(index,val));
  console.log('-----some遍历数组--------')
  arr.some((val,index)=>console.log(index,val));
  console.log('-----map遍历数组--------')
  arr.map((val,index)=>console.log(index,val))
  console.log('-----map替换数组--------')
  console.log(arr.map(x=>'花花'));
image.png
  • 4、数组转化为字符串
  let arr=['毛不易','是', '', '小可爱'];
  console.log("-----数组转换为字符串------");
  console.log(arr.join('|'), '//自定义字符');//自定义字符
  console.log(arr.toString(),'//字符为,');//字符为,'
image.png

八、ES6中的对象

1、对象赋值

// 对象赋值
  let nickname = "花花";
  let name = '华晨宇';
  var obj = {nickname,name};
  console.log(obj);  // {nickname: "花花", name: "华晨宇"}

2、获取[key]值

let key = 'nickname';
  var obj = {
    [key]: '花花',
    name: '华晨宇'
  }
  console.log(obj.nickname); //花花
  console.log(obj.name); //华晨宇

3、自定义对象方法

  let person = {
    name: '老师',
    introduce: function (name, address) {
      return `我叫${name}, 来自${address}`
    }
  }
  console.log(person.introduce('小花', '安徽'));//我叫小花, 来自安徽
  console.log(person.introduce('da花', '南京'));//我叫da花, 来自南京

4、对象比较 Object.is()

console.log(Object.is(obj.name,person.name)); //false

5、=== 与 Object.is() 的区别

=== 同值相等 Object.is()严格相等

console.log(+0 === -0);  //true
console.log(NaN === NaN ); //false
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true

6、Object.assign( )合并对象

console.log(Object.assign(obj, person));// 此时 后面对象的name值是会覆盖前面对象的name值
image.png

7、Symbol

Symbol对象元素的保护作用
在对象中有很多值,但是循环输出时,并不希望全部输出,那我们就可以使用Symbol进行保护。

  let person = {
    name: '老师',
    sex: '女',
    introduce: function (name, address) {
      return `我叫${name}, 来自${address}`
    }
  }
  let age = Symbol();
  person[age] = 12;
  for(let item in person) {
    console.log(person[item]);
  }
//此时不会输出age,对age进行了保护。
//若想输出,此时直接打印 person[age]即可
image.png

九、 set 和 weakSet 数据结构

1、set

    // set声明(去重的数组)
    let setArr = new Set(['小花','是一个','可爱的','小朋友','小朋友']);
    console.log(setArr);//Set {"小花", "是一个", "可爱的", "小朋友"}
    // 增加
    setArr.add('好可爱');  
    console.log(setArr); //Set {"小花", "是一个", "可爱的", "小朋友", "好可爱"}
    // 删除
    setArr.delete('好可爱');
    console.log(setArr); //Set {"小花", "是一个", "可爱的", "小朋友"}
    // 查找
    console.log(setArr.has('可爱的'));//true
    // for ... of 循环
    for (let item of setArr){
      console.log(item);
    }
    // forEach
    setArr.forEach((value)=>console.log(value));
    // 长度
    console.log(setArr.size)
    // 删除全部
    setArr.clear();
    console.log(setArray);// setArray is not defined

十、函数式编程

函数式编程(缩写为 FP)是一种通过组合纯函数来构建软件的过程,避免状态共享、可变数据及副作用的产生。

1、函数式编程定义

image.png

2、函数式编程的特点

    1. 函数是"第一等公民"
      把它想象成一个数据类型,可以声明、赋值给其他变量、当参数传给函数等等
    1. 只用"表达式",不用"语句"
      "表达式"(expression):是一个单纯的运算过程,总是有返回值;
      "语句"(statement):是执行某种操作,没有返回值。
      函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。
    1. 没有"副作用"
      所谓"副作用",指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
      函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
    1. 不修改状态
      函数式编程只是返回新的值,不修改系统变量。因此,不修改变量,也是它的一个重要特点。
    1. 引用透明
      引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。
      方法传入的参数类型与返回值类型是一样的(类比map,same方法,传入一个数组同时返回的也是一个数组)
  add(x, y) {
    return x + y
  }
  multiply(x, y) {
    return x * y
  }
  subtract(x, y) {
    return x - y
  }
console.log(subtract(multiply(add(1,2), 3), 4))//5
image.png
add(x, y) {
    return {
      multiply: (z) => {
        return {
          subtract: (a) => {
            return (x + y) * z - a
          }
        }
      }
    }
  }
console.log(add(1, 2).multiply(3).subtract(4))//5

来自:http://www.ruanyifeng.com/blog/2012/04/functional_programming.html

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

推荐阅读更多精彩内容

  • 1、新的声明方式 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种...
    令武阅读 1,000评论 0 7
  • 目录 1-利用babel将es6语法转换为es5 2-新的声明方式 3-变量的解构赋值 4-扩展运算符和rest运...
    strugglexiang阅读 471评论 1 1
  • 1. 块作用域 作用域指的是变量的作用范围,js本身具有了全局作用域和函数作用域,es6中新增了块作用域。块作用域...
    Cuckoos定投笔记阅读 233评论 0 1
  • [TOC] 参考阮一峰的ECMAScript 6 入门参考深入浅出ES6 let和const let和const都...
    郭子web阅读 1,773评论 0 1
  • 三,字符串扩展 3.1 Unicode表示法 ES6 做出了改进,只要将码点放入大括号,就能正确解读该字符。有了这...
    eastbaby阅读 1,519评论 0 8