严格模式
- 如何启动严格模式? 在作用域的开头添加’use strict’;
- 严格模式有哪些影响?
- 必须使用关键字声明变量
- 函数中的形参不允许重复
- 函数中的形参值的改变不再影响arguments中值
- 取消了arguments中的callee方法
- 取消了解析对象的with方法
- 取消了八进制
- 新增关键字eval arguments
修改上下文中的this指向
这两个修改this指向的方法都是 函数的方法,都是用于修改this指向。
- call(对象,参数1,参数2,……) : 返回对象
- apply(对象,数组||arguments) : 返回对象
- bind(对象,参数1,参数2,……) : 返回函数
JSON的方法
- JSON.parse() : 将JSON格式的字符串转为json对象
- JSON.stringify() : 将对象转为JSON格式的字符串。
let const
let : 用于声明变量的关键字
let 与 var的区别
- let不再做变量提升,只能先声明,后使用。
- let声明的全局变量不再是window对象的属性了。
- let在同一个作用域中,相同的变量只能声明一次。
- let声明会产生块级作用域,声明在块内的变量,只能在块内使用。(for循环有两个作用域,for本身是一个作用域,for循环体又是一个子级作用域)
//获取所有的li
let o_li = document.querySelectorAll('ul li');
/*
i = 5
len = 5;
o_li[0].onclick = function(){
alert(i);
}
o_li[1].onclick = function(){
alert(i);
}
o_li[2].onclick = function(){
alert(i);
}
o_li[3].onclick = function(){
alert(i);
}
o_li[4].onclick = function(){
alert(i);
}
*/
//遍历每一个li,输出当前li所下标
// for(var i = 0,len = o_li.length;i < len;i ++){
// o_li[i].onclick = function(){
// alert(i);
// }
// }
/*
j = 0
len = 5
o_li[0].onclick = function(){
alert(j);
}
*/
/*
j = 1
len = 5
o_li[1].onclick = function(){
alert(j);
}
*/
/*
j = 2
len = 5
o_li[2].onclick = function(){
alert(j);
}
*/
/*
j = 3
len = 5
o_li[3].onclick = function(){
alert(j);
}
*/
/*
j = 4
len = 5
o_li[1].onclick = function(){
alert(j);
}
*/
/*
j = 5
len = 5
*/
for(let j = 0,len = o_li.length;j < len;j ++){
o_li[j].onclick = function(){
alert(j);
}
}
const : 用于声明常量
- const常量只能声明一次,不能再进行赋值更改。
- 复合数据类型的数据,只要不改变引用地址,那么符合常量的要求。
变量的解构赋值
- 数组的解构赋值,可以快速读取数组中的元素。
//声明数组
let arr = [1,2,3,4];
//解构赋值,读取数组中的元素
let [a,b,c,d] = arr;
console.log(a,b,c,d);
//可以快速交换两个变量中的数据
[a,b] = [b,a];
console.log(a,b,c,d);
- 对象的解构赋值,可以快速读取对象中的属性。
// //声明对象
// let obj = {id : 1,name : '手机',price : 3999,num : 2};
// //快速读取对象中的属性或方法
// let {num,name,id,price} = obj;
// console.log(id,name,price,num);
//在ES6中,如果对象中的属性名和属性值的名称相同时,可以简写为一个名字
let id = 1;
let name = '手机';
let price = 3999;
let num = 2;
let obj = {
id : id,
name : name,
price : price,
num : num
}
console.log(obj);
let object = {
id,
name,
price,
num
}
console.log(object);
- 解构赋值的好处:
- 可以快速读取数组中的元素或对象中的属性
- 可以快速交换两个变量中的值
- 函数中的形参可以设置默认值了
- 函数中的形参可以不按照顺序传递参数了
- 函数中的return可以返回多个数据了
function fn({a = 1,b = 2,c = 3}){
if(a < b){
[a,b] = [b,a];
}
if(a < c){
[a,c] = [c,a];
}
if(b < c){
[b,c] = [c,b];
}
return [a,b,c];
}
let [x,y,z] = fn({b : 5,a : 4,c : 6});
console.log(x,y,z);
字符串新增方法
- includes(‘字符串’,start) : 检测父串中是否包含有子串,如果有,则返回true,否则,返回false, start: 从指定的下标向后查找,且包含start的位置。
- startsWith(‘字符串’,start) : 检测子串是否在父串的开头部分,返回布尔值, start: 从指定的下标向后查找,且包含start的位置。
- endsWith(‘字符串’,start) :检测子串是否在父串结尾部分,返回布尔值, start: 从指定的下标向前查找,且不包含start的位置。
//声明一个字符串
let str = 'how do you do';
console.log(str.includes('do')); //true
console.log(str.startsWith('do')); //false
console.log(str.endsWith('do')); //true
console.log(str.includes('do',4)); //true
console.log(str.startsWith('do',4)); //true
console.log(str.endsWith('do',5)); //false
console.log(str.endsWith('do',6)); //true
- repeat(n) : 重复字符串。
n : 如果n 是一个正整数,则正常重复字符串。
n : 如果n 是一个其它类型的数据,则将其它类型转为Number类型,继续重复。(如果不能转为数字,则转为NaN,按0次算)
n : 如果是小于等于-1 的数据,直接报错。
let str = 'do';
console.log(str.repeat(3)); //'dododo';
console.log(str.repeat(0)); //'';
console.log(str.repeat(1)); //'do';
console.log(str.repeat('3')); //'dododo';
console.log(str.repeat('3a')); //''; NaN按0次算
console.log(str.repeat(true)); //'do';
console.log(str.repeat(false)); //'';
console.log(str.repeat(-0.3)); //'';
console.log(str.repeat(-3)); //报错;
- … : 展开运算符
//声明一个字符串
// let str = 'hello';
// let arr = [... str];
// console.log(arr);
- 模板字符串:
${变量}
箭头函数
() => {}
- 不利于阅读
- 没有自己的this指向,箭头函数中的this指向了上下文中的对象。
- 箭头函数不能实现构造函数
- 不能new 箭头函数
- 推荐在回调函数里使用
回调函数:当一个函数作为另一个函数的参数时,这个函数称为回调函数。
Symbol
ES6新增的一种基本数据类型Symbol,这个数据类型可以确保变量中值的唯一性。
Set 集合 (特点:具有自动去除重复元素的功能)
- 如何创建set对象?
// let set = new Set(); //空的set对象
let set = new Set([1,2,1,2,3,2,1,2,4]);
- 属性是什么?
set.size : 获取set对象的长度
- 方法是什么?
set.add(元素,元素,……) : 添加元素,返回set对象
set.has(元素) : 检测元素是否存在,返回布尔值
set.delete(元素) : 删除指定的元素,返回布尔值
set.clear() : 清空set对象
set.forEach((value,key,set) => {}) : 遍历set对象
set.keys() : 获取所有的key
set.values() : 获取所有的value
set.entries() : 获取所有的key和value
循环:for of
for(变量 of set集合){
//语句组;
}
let set = new Set();
//添加元素
set.add(1).add(2).add(1).add(3).add(4).add(5).add(6);
//检测元素是否存在
console.log(set.has(2));
//删除元素
console.log(set.delete(3));
//清空set对象
// set.clear();
//获取所有的key
console.log(set.keys());
//通过for of 遍历所有的key
for(let key of set.keys()){
console.log(key);
}
//获取所有的value,并遍历出来
for(let value of set.values()){
console.log(value);
}
//获取所有的key和value
for(let [key,value] of set.entries()){
console.log(key,value);
}
//遍历set对象
set.forEach((value,key,set) => {
console.log(key + '=> ' + value);
})
console.log(set);
Map {key : value}
- 如何创建map对象?
//创建空的map对象
// let map = new Map();
//初始化map对象
let map = new Map([
[1,1],
['1',2],
[true,3],
[3,4]
])
- map对象的属性?
map.size : 获取map对象的长度
- map对象的方法?
map.set(key,value) : 添加元素,返回map对象
map.get(key) : 获取map对象中的属性
map.has(key) : 检测属性是否存在,返回布尔值
map.delete(key) : 删除指定的属性,返回布尔值
map.clear() : 清空map对象
map.forEach((value,key,map) => {}) : 遍历map对象
map.keys() : 获取所有的key
map.values() : 获取所有的value
map.entries() : 获取所有的key和value
//创建一个空的map对象
let map = new Map();
//添加元素
map.set(1,'one').set(2,'two').set(3,'three').set(4,'four').set(5,'five').set(6,'six');
//获取元素
console.log(map.get(2));
//删除元素
console.log(map.delete(2));
//检测元素是否存在
console.log(map.has(2));
//清空map对象
// map.clear();
//获取所有的key,并通过for of 遍历
for(let key of map.keys()){
console.log(key);
}
//获取所有的value,并通过for of 遍历
for(let value of map.values()){
console.log(value);
}
//获取所有的key和value,并通过for of 遍历
for(let [key,value] of map.entries()){
console.log(key,value);
}
map.forEach((value,key,map) => {
console.log(key + '=>' + value);
})
for in 和 for of的区别?
- for in中的循环变量表示 下标或key
- for of中的循环变量表示 元素或value
let arr = [1,2,3,4];
//for in
for(let i in arr){
console.log(i); //i 代表下标
}
//for of
for(let j of arr){
console.log(j); //j 代表元素
}
生成器函数Generator
- 是ES6提出的一种异步编程解决方案。
- 异步 : 同时进行的操作
- 同步 : 按步骤执行的操作
- 异步编程有哪些问题?
让异步程序按顺序执行.
依赖调用的问题。
//生成器函数
function * fn(){
yield 'how';
yield 'are';
yield 'you';
return '?';
}
// console.log(fn());
let fun = fn();
console.log(fun.next()); //{value: 'how', done: false}
// value : 表示产生的值
// done : 当前的状态 false : 表示后面还有语句等待执行。true : 表示后面没有语句了,结束了。
console.log(fun.next()); //{value: 'are', done: false}
console.log(fun.next()); //{value: 'you',done: false}
console.log(fun.next()); //{value: '?',done: true}
console.log(fun.next()); //{value: undefined,done: true}
console.log(fun.next()); //{value: undefined,done: true}
console.log(fun.next()); //{value: undefined,done: true}
console.log(fun.next()); //{value: undefined,done: true}
Class 类
//ES5
function 函数名([参数]){ //函数名 : 大驼峰
//属性
this.属性名 = 属性值;
this.属性名 = 属性值;
//方法
this.方法名 = function([参数]){
//功能实现
}
}
//ES6
class 类名{ //类名:大驼峰
//构造函数
constructor([参数,参数]){
//设置属性
this.属性名 = 属性值;
this.属性名 = 属性值;
}
//方法
方法([参数]){
//功能实现
}
}
extends : 继承
class 子类名 extends 父类名{
constructor([参数]){
super([参数]);
}
}