@TOC
let关键字
- 不能同时声明同一变量,不可以重复声明
- 属于块级作用域(局部变量)
- 不存在变量提升
必须先声明该变量后面才能使用
#### 变量提升
在变量创建之前使用,var存在
- 不影响作用域链
作用域链:就是代码块内有代码块,上级代码块中 的局部变量下级可用
{ let p = "大哥";
function fn(){
console.log(p); // 这里是可以使用的
}
fn();
}
以后声明变量使用 let 就对了
const关键字
- 声明必须赋初始值
- 不允许重复声明
- 值不允许修改
- 块级作用域(局部变量)
应用
声明对象类型使用 const,非对象类型声明选择 let;
变量和对象的解构赋值
解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值
应用
频繁使用对象方法、数组元素,就可以使用解构赋值形式;
模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识,特点:
字符串中可以出现换行符;
可以使用 ${xxx} 形式引用变量;
// 声明字符串的方法:单引号('')、双引号("")、反引号(``)
// 声明 let string = `我也一个字符串哦!`;
console.log(string);
// 1、字符串中可以出现换行符
let str =
`<ul>
<li>一</li>
<li>二</li>
<li>三</li>
<li>四</li>
</ul>`;
console.log(str);
// 2、可以使用 ${xxx} 形式引用变量
let s = "大哥";
let out = `${s}是我最大的榜样!`;
箭头函数
箭头函数多用于匿名函数的定义
注意
- 如果形参只有一个,则小括号可以省略
- 函数体如果只有一条语句,则花括号可以省略,函数的返回值为该条语句的执行结果
- 箭头函数 this 指向声明时所在作用域下 this 的值
- 箭头函数不能作为构造函数实例化
- 不能使用 arguments
特性:
- 箭头函数的this是静态的,始终指向函数声明时所在作用域下的this的值
- 不能作为构造实例化对象
- 不能使用 arguments 变量
arguments
arguments的东西也是个对象,而且是一个特殊的对象,
它的属性名是按照传入参数的序列来的,
第1个参数的属性名是’0’,第2个参数的属性名是’1’,以此类推,
并且它还有length属性,
存储的是当前传入函数参数的个数,很多时候我们把这种对象叫做类数组对象。
利用arguments实现方法的重载利用 arguments.callee 实现递归
filter
用于把Array的某些元素过滤掉,然后返回剩下的元素。
和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
var newArray = arr.filter(arg_function[, this_arg])
函数参数的默认值
ES允许给函数的参数赋初始值;
rest参数
ES6 引入rest参数,用于获取函数的实参,用来代替arguments;
Rest参数和arguments对象的区别
- rest参数只包括那些没有给出名称的参数,arguments包含所有参数
- arguments 对象不是真正的数组,而rest 参数是数组实例,可以直接应用sort, map, forEach, pop等方法
- arguments 对象拥有一些自己额外的功能
迭代器
遍历器(Iterator)就是一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数 据结构只要部署 Iterator 接口,就可以完成遍历操作
ES6 创造了一种新的遍历命令 for...of 循环,
Iterator 接口主要供 for...of 消费;
原生具备 iterator 接口的数据(可用 for of 遍历):
Array;
Arguments;
Set;
Map;
String;
TypedArray;
NodeList;
原理:
- 创建一个指针对象,指向当前数据结构的起始位置;
- 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员;
- 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员;
- 每调用 next 方法返回一个包含 value 和 done 属性的对象;
注:需要自定义遍历数据的时候,要想到迭代器;
// 声明一个数组
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧'];
// 使用 for...of 遍历数组 for(let v of xiyou){
console.log(v);
}
let iterator = xiyou[Symbol.iterator]();
// 调用对象的next方法
console.log(iterator.next());
// 重新初始化对象,指针也会重新回到最前面
let iterator1 = xiyou[Symbol.iterator]();
console.log(iterator1.next());