zoukankan      html  css  js  c++  java
  • JavaScript高级-----12.ES6新增语法

    1. ES6简介


    2. ES6中新增语法

    2.1 let

    <script type="text/javascript">
    	/* --------let关键字就是用来声明变量的-------- */
    	// let a = 10;
    	// console.log(a);//10
    
    	/* --------使用let关键字声明的变量具有块级作用域-------- */
    	// if (true) {
    	//     let b = 20;
    	//     console.log(b);//20
    	//     if (true) {
    	//         let c = 30;
    	//     }
    	//     console.log(c);//报错
    	// }
    	// console.log(b)
    
    	/* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
    
    	// if (true) {
    	//     let num = 100;
    	//     var abc = 200;
    	// }
    	// console.log(abc); //200
    	// console.log(num); //报错
    
    
    	/* -------防止循环变量变成全局变量--------- */
    	for (let i = 0; i < 2; i++) {}
    	console.log(i); //报错
    </script>
    

    /*-----使用let关键字声明的变量没有变量提升------*/
    console.log(a); //报错   必须先声明再使用
    let a = 100;
    


    在块级作用域内声明的变量,就和这个块级作用域整体进行了绑定,不会受到外部影响

    /* -------使用let关键字声明的变量具有暂时性死区特性------- */
    var num = 10
    if (true) {
    	console.log(num); //报错   因为{}内外的num毫无关系,这里在{}内先使用后定义就会报错;
    	//{}内的num不会向上一级作用域查找num
    	let num = 20;
    }
    

    精度面试题1


    上述代码两个的执行结果分别是2、2.
    注意:在执行循环的时候,循环体里面的函数并没有被调用,程序没有走到函数内部,也就是说执行循环体的时候,函数内部的i并没有被替换为具体的数值,在循环结束后,函数才开始调用

    经典面试2

    <script type="text/javascript">
        let arr = [];
    
        // for (let i = 0; i < 2; i++) {
        //     arr[i] = function() {
        //         console.log(i);
        //     }
        // }
    
        //等效于
        if (i == 0) {
            arr[i] = function() {
                console.log(i);
            }
        }
        if (i == 1) {
            arr[i] = function() {
                console.log(i);
            }
        }
        arr[0](); //0
        arr[1](); //1
    </script>
    

    2.2 const


    在用const赋值之后:

    • 对于基本数据类型,一旦赋值,值不可更改,指的就是值对应的内存地址不可更改
    • 不可以重新赋值,但是可以更改数据结构内部的值
    <script type="text/javascript">
    	// 1. 使用const关键字声明的常量具有块级作用域
    	// if (true) {
    	// 	const a = 10;
    	// 	if (true) {
    	// 		const a = 20;
    	// 		console.log(a);//20
    	// 	}
    	// 	console.log(a);//10
    	// }
    	// console.log(a);//报错
    
    	// 2. 使用const关键字声明的常量必须赋初始值
    	// const PI;//报错
    
    	// 3. 常量声明后值不可更改 
    	const PI = 3.14;
    	// PI = 100;//报错
    	const ary = [100, 200];
    	ary[0] = 123; //不报错  ary在内存中的地址没变
    	ary = [1, 2] //报错  因为改变了ary在内存中的存储地址
    	console.log(ary);
    
    </script>
    

    var let const的区别

    2.3 解构赋值

    分解数据结构,为变量赋值

    1. 数组解构

    <script type="text/javascript">
    	// 数组解构允许我们按照一一对应的关系从数组中提取值 然后将值赋值给变量
    	let ary = [1, 2, 3];
    	//曾经获取数组内部的值 要声明3次变量
    	// var a = ary[0]
    	// var b = ary[1]
    	// var c = ary[2]
    	let [a, b, c, d, e] = ary; //abcde都是变量
    	console.log(a) //1
    	console.log(b) //2
    	console.log(c) //3
    	console.log(d) //undefined
    	console.log(e) //undefined
    </script>
    

    2. 对象解构

    实质是属性匹配,变量的名字匹配对象中属性的名字

    <script type="text/javascript">
    	// 对象解构允许我们使用变量的名字匹配对象的属性 匹配成功 将对象属性的值赋值给变量
    	let person = {
    		name: 'lisi',
    		age: 30,
    		sex: '男'
    	};
    	let {name, age, sex} = person;//name, age, sex都是变量,和属性名必须相同
    	console.log(name)//lisi
    	console.log(age)//30
    	console.log(sex)//男
    </script>
    

    对象解构的另一种写法

    <script type="text/javascript">
    	// 对象解构允许我们使用变量的名字匹配对象的属性 匹配成功 将对象属性的值赋值给变量
    	let person = {
    		name: 'lisi',
    		age: 30,
    		sex: '男'
    	};
    	let {name: myName} = person;//myName才是真正的变量,name仅仅用于属性匹配
    	console.log(name)//空
    	console.log(myName)//lisi
    </script>
    

    2.4 箭头函数

    • (形参) {函数体}
    • 通过fn调用函数
    // 箭头函数是用来简化函数定义语法的
    const fn = () => {
    	console.log(123)
    }
    fn();//123
    


    上图是过去和现在两种定义函数方法的比较

    // 在箭头函数中 如果函数体中只有一句代码 并且代码的执行结果就是函数的返回值 函数体大括号可以省略
    // const sum = (n1, n2) => {
    //     return n1 + n2;
    // };
    //等效于
    const sum = (n1, n2) => n1 + n2;
    //调用函数	 
    const result = sum(10, 20);
    console.log(result) //30
    

    
    // 在箭头函数中 如果形参只有一个 形参外侧的小括号也是可以省略的
    const fn = v => {
    	alert(v);
    }
    fn(20)
    

    // 箭头函数不绑定this 箭头函数没有自己的this关键字 如果在箭头函数中使用this this关键字将指向箭头函数定义位置中的this
    
    function fn() {
    	console.log(this); //{name: 'zhangsan'}
    	return () => {
    		console.log(this) //{name: 'zhangsan'}
    	}
    }
    
    const obj = {
    	name: 'zhangsan'
    };
    
    const resFn = fn.call(obj); //fn.call(obj)将fn函数内部的this指向obj对象
    resFn(); //{name: 'zhangsan'}
    

    经典面试题

    var obj = {
    	age: 20,
    	say: () => { //obj是一个对象被,不能产生作用域,所以这个函数实际上是被定义在全局作用域中
    		alert(this.age) //this指向window ,window中没有age属性
    	}
    }
    obj.say();//弹出undefined
    
    var age = 100;
    var obj = {
    	age: 20,
    	say: () => { //obj是一个对象被,不能产生作用域,所以这个函数实际上是被定义在全局作用域中
    		alert(this.age) //this指向window ,window中没有age属性
    	}
    }
    obj.say(); //100
    

    剩余参数

    当函数实参个数大于形参个数时,可以将剩余的实参放到一个数组中

    <script>
        // ES6之前通常使用argument,但是在箭头函数中使用不了argument
    
        //一下是报错写法:argument.forEach is not a function
        // function sum(argument) {
        //     let total = 0;
        //     argument.forEach(function(item) {
        //         total = total + item;
        //     });
        //     return total;
        // }
    
        //正确写法1 
        // function sum(first, ...args) {
        //     let total = 0;
        //     args.forEach(function(item) {
        //         total = total + item;
        //     });
        //     return total;
        // }
    
        //正确写法2
        // const sum = (first, ...args) => {
        //     let total = 0;
        //     args.forEach(function(item) {
        //         total = total + item;
        //     });
        //     return total;
        // }
    
        //正确写法3
        // const sum = (first, ...args) => {
        //     let total = 0;
        //     args.forEach((item) => {
        //         total = total + item;
        //     });
        //     return total;
        // };
    
    
        //正确写法4
        const sum = (first, ...args) => {
            let total = 0;
            args.forEach((item) => total += item);
            return total;
        }
        console.log(sum(10, 20)); //20
        console.log(sum(10, 20, 30)); //50
    </script>
    

    注:参数名...args可以任意更替为...a...b...c等其他变量名

    //剩余参数和结构配合使用
    let ary1 = ['张三', '李四', '王五'];
    let [s1, ...s2] = ary1;
    console.log(s1);//张三
    console.log(s2);//(2) ["李四", "王五"]
    
  • 相关阅读:
    RestTemplateConfig写法,用于配置Template引擎模板
    RedisUtil写法,好用
    ftpUtil写法,记录一下
    生成唯一id写法,雪花算法
    base64编码转图片,图片转base64编码
    MultipartFile上传图片的写法,记录一下。
    httpClientUtil的put请求
    httpClientUtil的post请求
    python time和datetime
    ubuntu16.04TLS软件源update
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12409448.html
Copyright © 2011-2022 走看看