ES基础知识补充学习

175 阅读5分钟
  1. let关键字
  • let申请的变量具有块级作用域+——一个大括号产生的作用域。
  • ES6之前只有全局作用域和局部作用域。
  • 防止循环变量变成全局变量。
  • 不存在变量提升——变量可以先使用再声明。
  • let定义的变量必须先定义再使用。
  • let定义的变量具有暂时性死区的特性。一旦定义了let变量就跟所处的块级作用域绑定了。跟var定义的变量之间互不影响。
  • 面试题:for循环中的i是var定义的,还是let定义的。用var定义的,此时i是全局变量。函数执行时for循环已经循环完毕,而函数输出的是全局作用域中的i,也就是2;而用let定义的,此时每一个i都会产生一个块级作用域(防止i变成全局变量),函数调用时会输出自己上一级作用域中也就是块级作用域中的i,那么便是当时传入的i的值。
  •   var arr=[];
      for(var i=0;i<2;i++){
           arr[i]=function(){
               console.log(i);
             }
      }
      arr[0]();//2
      arr[1]();//2
      for(let i=0;i<2;i++){
           arr[i]=function(){
               console.log(i);
             }
      }
      arr[0]();//0
      arr[1]();//1
    

  2.const关键字

  • 申明常量,常量是值(内存地址)不能边的量。
  • 简单数据类型是不能改变值,复杂数据类型是可以改变元素的值但不能改变整个数组的指向。
  • 具有块级作用域。
  • 申明常量必须赋值。

 3.let、const、var区别

  • 全局作用域:var
  • 变量提升:var
  • 值可以改:var、let
  • 不会轻易改变的值:使用const。
  • 需要块级作用域进行变量绑定的:使用let。

 4.解构赋值

  • 从数组中提取值,按照对应的位置,对变量赋值,对象也可以实现解构。

  • 数组解构:

    let [a,b,c]=[1,2,3]
    
  • 对象解构:

    let person={name:'张三',age:20};
    let {name,age}=person;
    //第二种写法:取别名
    let{name:myname,age:myage}=person;
    

  5.箭头函数

  • 一般赋值给一个变量。

  • 简化函数定义。

  • 函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号。

  • 形参只有一个,形参小括号可以省略。

    const fn=v=>{
     alert(v);
    }
    
  • this关键字:箭头函数不绑定this,没有自己的this,它的this是函数定义位置的上下文this。

  • 对象不能产生作用域(如果方法是箭头函数),也就是没有this属性。

 6.剩余参数(...)

  • 让函数可以同时传入不固定数量的参数。

  • 与解构配合使用:

    let arry=['lal','lala','lallalal'];
    let [...args]=arry;//args会得到一个数组 元素为arry中的值  用剩余参数去接收解构出的值
    

  7.扩展运算符(...与剩余参数进行对比):

  • 将数组或者对象转为用逗号分隔的参数序列。
  • 应用:合并数组。有两种方法:一种是直接用扩展运算符扩展两个数组进行合并;一种是利用数组的push方法,push一个数组的扩展运算符结果也是数组的合并。
  • 应用:伪数组转换为真正的数组,就可以使用array下面的方法了。
  •   var objofme=document.getElementsByTagName('div')//会获得一个伪数组
      //转换为真正的数组
      var realarray=[...objofme];
    

8.正则表达式

  • 有规律的表达式。
  • 作为对象来存在。
  • 验证表单。
  • 敏感词汇检测。
  • 获得特定部分。
  • 特点:灵活性、逻辑性、功能性强。
  • 实际开发中直接使用写好的正则表达式,只是要求能在上面根据实际情况进行修改。
  • 通过RegExp对象来创建正则表达式,通过字面量创建。
  • 使用test方法进行正则表达式检测,检测字符串是否符合正则表达式要求的规范。
  • 特殊字符(元字符)
  1. 边界符:^(以什么开始),$以什么结束。如果都加上就是精确匹配,相等才返回true。
  2. 不需要加引号。 
  • 字符类:[]表示,只要出现其中的一个字符就是匹配成功。加上位置限定符,边界符,就是多选一,当且只包含其中一个返回true。[-]表示一个范围。中括号里面可以写多个条件,如果在前面加上一个^表示条件取反。
  • 量词符:某个模式重复的次数。
  1. *表示大于等于0次。
  2. +表示大于等于1次。
  3. ?表示出现1次或者0次。
  4. {n}表示出现n次。
  5. {n,}表示出现大于等于n次。
  6. {n,m}表示出现大于等于n次,小于等于m次。
  7. 量词符和边界符配合使用,使得条件验证有了次数限定。如果大括号前面没有中括号就是让最后一个条件重复几次。
  • 小括号:表示优先级
  • 预定义类:
  1. \d表示[0-9]的数字
  2. \D表示取反
  3. \w是数字、字母、下划线
  4. \W取反
  5. \s匹配空格、制表符、换行符
  6. \S取反,匹配非空格的字符
  7. 正则中的或用 | 表示。
  • 正则表达式中的替换
  1. 直接作为replace函数的参数传递进去使用,可以在最后面加上[switch]进行匹配模式的选择:g——全局匹配、i——忽略大小写、gi——全局忽略大小写。

9.js引擎在js代码执行之前会做一些预处理工作:

  • 找定义变量的关键字:let、const、var、function等。把某些(var function)放入全局对象里面,实现变量提升。
  • 执行上下文:js引擎执行js代码前,会创建执行环境。
  1. 创建新的空对象;
  2. 空对象收集变量、函数、参数等(变量提升行为);
  3. 创建作用域链;
  4. 确定this指向。
  • 代码定义的时候,相关作用域就已经产生。
  • 全局的定义中,this指向全局对象window。
  • 上述的空对象就称为执行上下文对象。
  • 所有对象创建完毕之后,js引擎就会创建一个栈来存储这些对象。一个一个入栈,随着执行顺序,一个一个出栈。
  • 注意,函数执行时,才会创建局部执行上下文对象,执行完毕时,释放。

10.数组的一些函数:

  • reduce方法: 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。提供初值可以循环数组的长度次数,不提供初值只能循环数组长度减1次数。用于要用数组里面的全部的值来初始化一个对象的时候。
  • contact方法返回新的拼接好的数组,push方法直接在原数组上面进行修改返回数组长度。
  • 转换位字符串:toString、toLocalString、join方法。
  • slice(-1)是获取数组的最后一个元素,是数组形式。
  • split('/')是取出/符号左右边的元素,也是数组形式。

11.两者之间最主要的区别就是Object.keys( )不会走原型链,而for in 会走原型链。