ES6(待补充)

ES6(待补充)

变量的声明let与const

let

  1. let不会存在预解析

    // 报错,flag不存在或未定义
    console.log(flag);
    let flag = 123;
    // 正确
    cosole.log(flag);
    var flag = 123;
    
  2. let声明的变量不允许重复(在同一作用域内)

    // 报错,不允许
    let flag = 123;
    let flag = 456;
    // 正确
    var flag = 123;
    var flag = 456;
    
  3. 块级作用域

    // 报错,块内部let定义的变量,在外部是不可以访问的
    if (true) {
    	let flag = 123;    
    }
    console.log(flag);
    // 正确
    if (true) {
        var flag = 123;
    }
    console.log(flag); // 123
    
    {
        // 这里是块级作用域
        let flag = 111;
        console.log(flag);
    }
    // 外部不可以访问
    console.log(flag); // 报错
    
    for (let i = 0; i < 3; i++) {
        // for循环括号中声明的变量只能在循环体重使用
        console.log(i);
    }
    
    // 在块级作用域内部,变量只能先声明在使用(暂时性死区)
    // 在声明变量之前的区域内是不允许访问这个声明的变量
    var flag = 456;
    if (true) {
        // 变量声明之前开始的区域
    	console.log(flag); // 报错,不会当前外部的全局变量来处理的
        // 变量声明之前结束的区域
        let flag = 123;
         
    }
    

const

用来声明常量,同样适用于let的规则

  • const声明的常量不允许重新赋值
  • 在声明的时候必须初始化

变量的解构赋值

ES6之前的解构赋值

var a = 1;
var b = 2;
var c = 3;
// 等价于下面
var a=1, b=2, c=3;

ES6的数组解构赋值

// 全部赋值
let [a, b, c] = [1, 2, 3];
console.log(a, b, c); // 输出结果 1 2 3
// 只对中间的变量赋值,两边的省略
let [a, b, c] = [, 123, ];
console.log(a, b, c); // 输出结果 undefined 123 undefined
// 设置默认值
let [a = 111, b, c] = [, 123, ];
console.log(a, b, c) // 输出结果 111 123 undefined

ES6的对象解构赋值

// 全部赋值,无顺序要求
let {foo, bar} = {foo : 'hello', bar : 'hi'};
console.log(foo, bar); // hello hi
// 对象属性别名(如果有了别名,那么原来的名字就无效了)
let {foo:abc, bar} = {bar: 'hi', foo : 'nihao'};
console.log(abc, bar); // nihao hi
console.log(foo, bar); // 报错 foo未定义
// 内置对象赋值, 直接把右边的已有属性和左边的名称对应赋值
let {cos, sin, random} = Math;
conlose.log(typeof cos); // function
conlose.log(typeof sin); // function
conlose.log(typeof random); // function
// 指定默认值
let {foo:a = 'hello', bar} = {bar : 'hi'};
console.log(a, bar); // hello hi

ES6的字符串解构赋值

// 全部赋值
let [a, b, c, d, e] = "hello";
console.log(a, b, c, d, e); // h e l l 0;
// 前面的变量与后的字符长度不对应
// 没有任何影响
let [a, b, c, d] = "hello";
console.log(a, b, c, d); // h e l l
// 用下面的办法无法利用对象解构赋值得到字符串的长度
let [a, b, c, d, length] = "hello";
console.log(a, b, c, d); // h e l l 0
// 得到字符串的长度
let [length] = 'hi';
console.log(length); // 2

ES6的字符串相关扩展

  1. includes(‘子串’, 索引)

    判断字符串中有没有相应的子串,有返回true否则返回false

    // 第一个参数 匹配的子串
    let flag = 'hello world'.includes('world');
    console.log(flag); // true
    
    // 第二个参数(索引), 从第几个字符开始匹配
    let flag = 'hello world'.includes('world', 7);
    console.log(flag); // false
    
  2. startsWith()

    判断字符串是否以特定的字符串开始

    let url = 'admin/index.php';
    
    console.log(url.startsWith('admin')); // true;
    
  3. endsWith()

    判断字符串是否以特定的字符串结束

    let url = 'admin/index.php';
    
    console.log(url.startsWith('php')); // true;
    
  4. 模板字符串

    // 反引号表示模板,模板中的内容可以有格式,通过${}方式填充数据
    // 支持简单的表达式运算
    let fn = function (info) {
        return info;
    }
    let obj = {
        username : '李四',
        age :12,
        sex : '男'
    }
    
    // ES6之前的拼接
    let tag = '<div><span>'+obj.username+'</span><span>'+obj.age+'</span><span>'+obj.sex+'</span></div>'
    console.log(tag); // 无格式,输出在一行上
    
    // ES6拼接
    let tp1 = `
    	<div>
    		<span>${obj.username}</span>
    		<span>${obj.age}</span>
    		<span>${obj.sex}</span>	
    		<span>${1+1}</span>
    		<span>${fn('nihao')}</span>
    	</div>
    `;
    
    console.log(tp1); // 带格式的输出
    
    

函数扩展

参数默认值

  • ES6之前设置默认值

    function foo (param) {
        let p = param || 'hello';
    	console.log(p);
    }
    
    foo(); // hello
    foo('hi'); // hi
    
    
  • ES6设置默认值

    function foo (param = 'hello') {
        console.log(param);
    }
    
    foo(); // hello
    foo('hi'); // hi
    

参数解构赋值

// 利用参数解构赋值必须传参,或者设置默认值
function foo ({uname, age} = {}) {
    console.log(uname, age);
}
foo(); // undefined undefined

// 设置默认值
function foo ({uname = '张三', age = 19} = {}) {
    console.log(uname, age);
}
foo(); // 张三 19
foo({uname : '李四', age : 20});  // 李四 20

rest参数(剩余参数)

// 第一个参数由a接受, 其他的参数用param接收
function foo (a, ...param) {
    console.log(a, param);
}

foo(1, 2, 3); // 1, [2, 3]

…扩展运算符

function foo (a, b, c, d, e, f) {
    console.log(a+b+c+d+e+f);
}
let arr = [1,2,3,4,5,6];
foo(...arr); // ==> foo.apply(null, arr);

应用:合并数组

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = [...arr1, ...arr2];

console.log(arr3); // [1, 2, 3, 4, 5, 6]

箭头函数

  • ES6之前的做法

    function foo() {
        console.log('hello');
    }
    
    foo(); // hello
    
  • ES6的做法

    // 等效于上方的做法
    let foo = () => console.log('hello');
    foo(); // hello
    
  • 传一个参数

    function foo (v) {
        return v;
    }
    
    // 相当于
    let foo = v ==> v;
    let res = foo(111);
    console.log(res); // 111
    
  • 传二个及两个以上

    let foo = (a, b) => console.log(a + b);
    foo(1, 2); // 3
    
  • 方法体代码二行及二行以上

    let foo (a, b) => {let c = 1; console.log(a + b + c);}
    foo(1, 2); // 4
    
  • 作为匿名函数使用

    let arr = [123, 456,789];
    arr.forEach(function (element, index) {
        console.log(element, index);
    });
    
    // 等价于
    arr.forEach((element, index) => {
        console.log(element, index);
    });
    

箭头函数的注意事项

  1. 箭头函数中this取决于函数的定义,而不是调用

    function foo () {
        console.log(this); 
    }
    foo(); // 在nodejs环境中打印的是nodejs帮我们生成的
    foo.call({num:1}); // {nul:1}
    
    function foo () {
         // 使用call调用foo时,这里的this其实就是call的第一个参数
        setTimeout(()=>{
            console.log(this.num); 
        }, 100);
    }
    foo.call({num:1}); // 1
    
  2. 箭头函数不可以new

    let foo = () => {this.num = 123;}
    new foo(); // 报错  foo not constructor
    
  3. 箭头函数不可以使用arguments获取参数列表,可以使用rest参数代替

    let foo = (...param) => {
        console.log(param);
    }
    foo(1, 2, 3); // 1, 2, 3
    

类与继承

function Animal(name){
    this.name = name;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值