当前位置:   article > 正文

ES6笔记————let,箭头函数,剩余参数_剩余函数

剩余函数

目录

一.let,var,const区别

let

const

区别

二,解构 

1 数组解构

2对象解构

三,箭头函数 

1 基础语法

2 省略写法

3 对象方法里的this

4 apply/call调用时的this

5 箭头函数中this

8 箭头函数应用

四,剩余函数


 

一.let,var,const区别

let

关键字用来声明块级变量。

-- 特点就是在{}声明具有块级作用域,var变量无此特点。

-- 防止循环变量编程全局变量。

-- let 关键词无变量提升。

-- let 关键词有暂时性死区的特点。{先声明后使用}

const

声明常量,常量就是值(内存地址)不能变化的量。

对象的本身是可变的,所以可以添加属性,但是地址不可改变

区别

 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象

- 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升

- 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值

- 使用letconst的声明的变量不属性顶层对象,返回undefined

二,解构 

1 数组解构

let [x, y, ...z] = ['a'];

x // "a"

y // undefined

z // []

let[a,...c] = [1,2,3];//合并运算符可以展开数组也可合并数组

console.log(c);//[2, 3]

console.log(...c);//2 3

let [x,y='2'] = ['a',undefined];

console.log(y);//如果没有定义,可以用默认值

说明:ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。

2对象解构

根据key解构

let person = {name:"小帅",age:18};

let {name,age,height} = person;

console.log(name);//小帅

console.log(age);//18

console.log(height);//undefined

说明:对象的解构与数组有一个重要的不同。数组的元素是按顺序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值,否则解构失败就是undefined。

let { realname: myname,height=173 } = { realname: '张三', age: 18};

console.log(Myname);//张三

console.log(Myage)//18

console.log(realname)//realname is not defined

console.log(height)//当属性没有的时候支持默认值

说明:对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

.3 字符串解构

let [a,b,c] = "hello";

console.log(a);//h

console.log(b);//e

console.log(c);//l

三,箭头函数 

1 基础语法

//原js写法

function myFun(k,v){   

        return k + v;

}

//es6 写法

const myFun1 = (k,v) => {

        return k+v;

}

2 省略写法

如果形参或者代码块只有一句可以简写:

Const myFun = (k) => {return k+1;} 简写:

Const myFun = k =>  k +1;

对象方法里的this

如果函数作为对象的方法调用,this指向的是这个上级对象,即调用方法的对象。

const person = {

                           name:"张三",

                           age:18,

                           say:function(){

                                  console.log(this.name);// 张三 这时候的this是person的对象

                           }

 }

person.say();

4 apply/call调用时的this

myfun1();//对象是Windows

myfun1.call(person1);//对象改变为person1

说明:两者的区别,myfun.call(person,18,29); myfun.apply(person,[18,29]);

箭头函数中this

箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this。

箭头函数中的this指向是它所定义(声明)的位置,可以简单理解成,定义箭头函数中的作用域的this指向谁,它就指向谁。

const obj = { name: '张三'}

                 function fn () {

                         console.log(this);//this 指向 是obj对象

                         return () => {

                                 console.log(this);//this 指向 的是箭头函数定义的位置,那么这个箭头函数定义在fn里面,而这个fn指向是的obj对象,所以这个this也指向是obj对象

                         }

                 }

               

const resFn = fn.call(obj); //{ name: '张三'}

resFn();//{ name: '张三'}

  1. 一:全局作用域下this指向
  2. 1:普通函数
  3. function global(){
  4. console.log(this);//window
  5. }
  6. global();
  7. 2:箭头函数
  8. const global = ()=>{
  9. console.log(this);//window
  10. }
  11. global();
  12. 二:对象里面的this指向
  13. 1:普通函数
  14. const Person = {realname:"张三",age:19,
  15. say:function(){
  16. console.log(this.realname);//当前的对象 "张三"
  17. }
  18. }
  19. Person.say();
  20. 2:箭头函数
  21. const Person = {realname:"张三",age:19,
  22. say:()=>{
  23. console.log(this);//window
  24. }
  25. }
  26. Person.say();
  27. 三:构造函数的this指向
  28. 1:普通函数
  29. function Person(realname,age){
  30. this.realname = realname;
  31. this.age = age;
  32. this.say = function(){
  33. console.log(this);
  34. }
  35. }
  36. const P1 = new Person("张三",19);
  37. P1.say();
  38. const P2 = new Person("李四",19);
  39. P2.say.call(P1);//原来李四,现在是张三 call和apply改变this指向,区别传输参数的区别
  40. 2:箭头函数
  41. function Person(realname,age){
  42. this.realname = realname;
  43. this.age = age;
  44. this.say = ()=>{
  45. console.log(this);
  46. }
  47. }
  48. const P1 = new Person("张三",19);
  49. P1.say();
  50. const P2 = new Person("李四",19);
  51. P2.say.call(P1);//不能改变箭头函数的this指向
  52. 总结:普通函数与箭头函数this的区别
  53. 1:普通的函数this与调用者有关,调用者是谁就是谁;
  54. 2:箭头函数的this与当时定义的上下文的this有关,this是静态的一旦定义了就无法改变

8 箭头函数应用

练习1单击按钮2s后改变按钮文字:按钮被点击,在单击按钮改变文字:点击被取消。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <!-- 点击按钮 2s后显示:文字被点击,在点击出现文字:点击被取消。 -->
  10. <!-- (附加:点击10次后提示“今日点击次数已上限,按钮变成灰色”) -->
  11. <body>
  12. <button>点击</button>
  13. <script>
  14. let bth = document.querySelector("button")
  15. let flag = false
  16. let num=0
  17. bth.addEventListener("click", function () {
  18. flag = !flag
  19. num++
  20. if(num>10){
  21. this.innerHTML="今日点击次数已上限"
  22. this.disabled=true
  23. this.style.backgroundColor="grey"
  24. return false
  25. }
  26. time1=setTimeout(() => {
  27. if (flag) {
  28. // console.log(this);
  29. this.innerHTML="文字被点击"
  30. }
  31. else{
  32. this.innerHTML="点击被取消"
  33. }
  34. }, 100);
  35. })
  36. </script>
  37. </body>
  38. </html>

四,剩余函数

剩余参数语法允许我们将一个不定数量的参数表示为一个数组,不定参数定义方式,这种方式很方便的去声明不知道参数情况下的一个函数。

  1. 1:rest参数
  2. function demo(...nums){
  3. console.log(nums);//数组
  4. console.log(...nums);//解构数组
  5. }
  6. demo(1,2,3);
  7. 2:rest参数 对象
  8. function connect({username,...info}){
  9. console.log(username);
  10. console.log(info);
  11. }
  12. connect(
  13. {username:"root",password:"123456",port:"3306"}
  14. )
  15. 3:输出数组
  16. const arr = [1,2,3];
  17. console.log(...arr);
  18. 4:合并两个数组
  19. const arr1 = [1,2,3];
  20. const arr2 = [4,5,6];
  21. console.log([...arr1,...arr2]);
  22. 5:将类数组转为数组
  23. const liNode = document.querySelectorAll("li");
  24. console.log(typeof [...liNode]);
  25. const arr1 = [1,2,3];
  26. const arr2 = [...arr1];//复制数组
  27. arr1[0] = 10;
  28. console.log(arr2);
  29. 6:剩余参数必须放入最后(rest参数) 不然报错
  30. function demo(a,b,...nums){
  31. console.log(nums);//数组
  32. }
  33. demo(1,2,3,4,5);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/190702
推荐阅读
相关标签
  

闽ICP备14008679号