- 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方法进行正则表达式检测,检测字符串是否符合正则表达式要求的规范。
- 特殊字符(元字符)
- 边界符:^(以什么开始),$以什么结束。如果都加上就是精确匹配,相等才返回true。
- 不需要加引号。
- 字符类:[]表示,只要出现其中的一个字符就是匹配成功。加上位置限定符,边界符,就是多选一,当且只包含其中一个返回true。[-]表示一个范围。中括号里面可以写多个条件,如果在前面加上一个^表示条件取反。
- 量词符:某个模式重复的次数。
- *表示大于等于0次。
- +表示大于等于1次。
- ?表示出现1次或者0次。
- {n}表示出现n次。
- {n,}表示出现大于等于n次。
- {n,m}表示出现大于等于n次,小于等于m次。
- 量词符和边界符配合使用,使得条件验证有了次数限定。如果大括号前面没有中括号就是让最后一个条件重复几次。
- 小括号:表示优先级
- 预定义类:
- \d表示[0-9]的数字
- \D表示取反
- \w是数字、字母、下划线
- \W取反
- \s匹配空格、制表符、换行符
- \S取反,匹配非空格的字符
- 正则中的或用 | 表示。
- 正则表达式中的替换
- 直接作为replace函数的参数传递进去使用,可以在最后面加上[switch]进行匹配模式的选择:g——全局匹配、i——忽略大小写、gi——全局忽略大小写。
9.js引擎在js代码执行之前会做一些预处理工作:
- 找定义变量的关键字:let、const、var、function等。把某些(var function)放入全局对象里面,实现变量提升。
- 执行上下文:js引擎执行js代码前,会创建执行环境。
- 创建新的空对象;
- 空对象收集变量、函数、参数等(变量提升行为);
- 创建作用域链;
- 确定this指向。
- 代码定义的时候,相关作用域就已经产生。
- 全局的定义中,this指向全局对象window。
- 上述的空对象就称为执行上下文对象。
- 所有对象创建完毕之后,js引擎就会创建一个栈来存储这些对象。一个一个入栈,随着执行顺序,一个一个出栈。
- 注意,函数执行时,才会创建局部执行上下文对象,执行完毕时,释放。
10.数组的一些函数:
- reduce方法: 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。提供初值可以循环数组的长度次数,不提供初值只能循环数组长度减1次数。用于要用数组里面的全部的值来初始化一个对象的时候。
- contact方法返回新的拼接好的数组,push方法直接在原数组上面进行修改返回数组长度。
- 转换位字符串:toString、toLocalString、join方法。
- slice(-1)是获取数组的最后一个元素,是数组形式。
- split('/')是取出/符号左右边的元素,也是数组形式。
11.两者之间最主要的区别就是Object.keys( )不会走原型链,而for in 会走原型链。