一、let、const、var
(1)let
1、不能重复声明
2、块级作用域 {} if else while for
3、不存在变量提升
4、不影响作用域链
{
let name = "陈琦"
function fn(){
console.log(name) //此处可以访问name,块级作用域不影响内部访问,此函数也在块级内部
}
fn()
}
(2)const
1、声明常量必须赋初始值
2、推荐使用全大写
3、常量的值不能更改
4、块级作用域
5、对数组和对象的修改不算对常量的修改 (因为指向的地址没有被改变)
(3)var
1、能重复声明
2、全局作用域
3、存在变量提升
二、解构赋值
1、概念
es6允许按照一定模式从数组和对象中提取值,对变量进行赋值
2、数组的解构
const F4 = ["cq","xiaoming","abc","fang"];
let [c,x,a,f] = F4;
3、对象的解构
const zhao = {
name:"赵本山",
age:"不详",
still:function(){
console.log("小品");
}
}
let { name,age,still } = zhao
console.log(name);
console.log(age);
still()
三、模版字符串
1、使用``进行声明
2、可以直接换行缩进
3、插值:${xxx}
//例子
const first = 123;
const second = 456;
const str = `<ul>
<li>${first}</li>
<li>${second}</li>
</ul>`;
str
四、对象的简化写法
let name = "cq";
let change = function(){
console.log("fn change")
};
let school = {
name, //对象简化写法,es5 是 name:name
change,
fn1(){ //函数简化写法
console.log("fn fn1")
}
};
五、箭头函数
let fn = (a,b) => {
return a + b;
}
1、this是静态的,始终指向函数声明时所在的作用域下的this的值
function getName(){
console.log(this.name);
}
let getName2 = () => {
console.log(this.name);
}
window.name = "chenqi";
const school = {
name : "SCHOOL"
}
//直接调用
getName(); // chenqi
getName2(); //chenqi
//call方法调用
getName.call(school); //SCHOOL
getName2.call(school); //chenqi
2、不能作为构造函数实例化对象
let person = (name,age) => {
this.name = name;
this.age = age;
}
let me = new person("cq",18); // person is not a constructor
3、不能使用arguments对象
let fn = () => {
console.log(arguments);
}
fn(1,2,3); arguments is not defined ,正常函数会输出arguments对象[1,2,3]
4、箭头函数的简写
1、参数有且只有一个时,可以省略小括号
2、省略花括号,此时需要同时省略return
let pow = n => n*n;
5、实战
const name = "cq";
const a = {
name:"obj cq",
getName1: ()=>{ //使用箭头函数时,指向外部
return this.name;
},
getName2(){
return this.name;
}
}
console.log(a.getName1()); //cq
console.log(a.getName2()); //obj cq
六、函数参数的默认值
1、允许给函数参数设置初始值
function add(a,b,c=10){
return a+b+c;
}
console.log(add(1,2)); //13 ,如果不给c赋值则等于 NaN
2、与解构赋值结合
function connect({host='127.0.0.1',username='root',password='root'}){
console.log(host)
console.log(username)
console.log(password)
}
connect({
host:'localhost',
username:'root',
password:'root'
})
七、rest参数(…args)
function date(...args){ //rest参数 rest参数必须放在最后 function date(a,b,...args)
console.log(args);
}
date(11,22,33) // [11,22,33]
function date(){ //es5的arguments
console.log(arguments)
}
date(11,22,33) //返回arguments对象
八、扩展运算符
1、介绍
const arr = [11,22,33];
function fn(){
console.log(arguments)
}
fn(...arr) //等同于 fn(11,22,33)
2、应用
//1、数组合并
const arr1 = [11,22];
const arr2 = [33,44];
const arr1arr2 = [...arr1,...arr2];
console.log(arr1arr2); //[11,22,33,44]
//2、数组克隆
const arr3 = [11,22];
const arr4 = [...arr3]; //浅拷贝
//3、将伪数组转化为真正的数组
九、Symbol
//1、创建Symbol
let s = Symbol();
console.log(typeof s) //symbol
let s2 = Symbol("chenqi");
console.log(s2) //Symbol(chenqi)
let s3 = Symbol("chenqi");
console.log(s2 == s3); //false
let s4 = Symbol.for("chenqi");
let s5 = Symbol.for("chenqi");
console.log(s4 == s5); //true
//不能于其他数据进行运算
//js数据类型 => USONB you are so nuibility
u undefined
s symbol
o object
n null number
b boolean
十、迭代器(iterator)
1、任何数据只要部署 iterator接口 就可以完成遍历
iterator接口就是对象里的一个属性,symbol.iterator
2、iterator主要供for of消费
3、原生具备iterator接口的数据:
Array
Arguments
Set
Map
String
TypedArray
NodeList
4、for in 和 for of的普通使用
const arr = [11,22,33];
for (const value of arr) { //for of 打印的是值
console.log(value); //11 22 33
}
for (const key in arr) { //for of 打印的是key
if(arr.hasOwnProperty(key)){//hasOwnPropery方法可以判断某属性是否是该对象的实例属性
console.log(key); //1 2 3
}
}
for (var [key, value] of phoneBookMap) { //遍历map使用解构
console.log(key + "'s phone number is: " + value);
}
5、迭代器的原理
- 创建一个指针对象,指向当前数据结构的起始位置
- 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
- 接下来不断调用next方法,指针一只往后移动,知道指向最后一个成员
- 每调用next方法,返回一个包含value和done属性的对象
const xiyou = ["唐僧","孙悟空","八戒","沙僧"];
const iterator = xiyou[Symbol.iterator]() //创建iterator对象
console.log(iterator.next()); //{value: "唐僧", done: false}
console.log(iterator.next()); //{value: "孙悟空", done: false}
console.log(iterator.next()); //{value: "八戒", done: false}
console.log(iterator.next()); //{value: "沙僧", done: false}
console.log(iterator.next()); //{value: "undefined", done: true}
十一、set和map
1、set
set中的值都是不重复的
创建set
let s = new Set();
添加
s.add(1);
删除
s.delete(1); //成功返回true
查询
s.has(1);
查看元素个数
s.size;
遍历
forEach //es5
for … of //es6
2、map
创建map
const person = new Map();
添加,如果map已经有此key,会删除旧的值更新为新的
person.set(“name”,”cq”);
查询
person.has(“name”); //true
获取
person.get(“name”); //cq
删除
person.delete(“name”); //true
遍历
forEach
for … of
十二、class
class是一个语法糖,其底层还是通过 构造函数 去创建的。所以它的绝大部分功能,ES5 都可以做到。class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
class的知识点:
- class 声明类;
- constructor 定义构造函数初始化;
- extends 继承父类;
- super 调用父级构造方法;
- static 定义静态方法和属性;
- 父类方法可以重写;
//父类
class Person{
constructor(name, age){
this.name = name
this.age = age
}
static from = "China" //Person.from可以访问,实例对象.from不能访问
show(){
console.log(`名字:${this.name},年龄${this.age}`);
}
}
//extends继承
class Student extends Person{
constructor(name, age, uid){
super(name, age)
this.uid = uid
}
show(){
console.log(`名字:${this.name},年龄${this.age},学号${this.uid}`)
}
}
const cq = new Student("chenqi",18,3323)
console.log(cq);
cq.show()
function Person(name, age){
this.name = name
this.age = age
}
Person.from = "China"
Person.prototype.show = function(){
console.log(`名字:${this.name},年龄${this.age}`);
}
function Student(name, age, uid) {
Person.call(this, name, age)
this.uid =uid
}
// 设置子级构造函数的原型
Student.prototype = new Person
Student.prototype.constructor = Student;
//重写
Student.prototype.show = function(){
console.log(`名字:${this.name},年龄${this.age},学号${this.uid}`);
}
const cq = new Student("chenqi",18,3323)
console.log(cq);
cq.show()
十三、模块化
模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来;
模块化的优势有以下几点:
- 防止命名冲突;
- 代码复用;
- 高维护性;
ES6 之前的模块化规范有:
- CommonJS => NodeJS、Browserify;
- AMD => requireJS;
- CMD => seaJS;
//m.js
export let name = "陈琦"
export function getName(age){
console.log(`我叫${name},年龄${age}`);
}
//index.html 方法1
<script type="module">
import * as m from "./js/m.js";
console.log(m);
console.log(m.name);
m.getName(18);
</script>
//index.html 方法2 结构赋值
<script type="module">
import { name, getName} from "./m.js"
console.log(name);
getName(18);
</script>
//m.js
let name = "陈琦"
function getName(age){
console.log(`我叫${name},年龄${age}`);
}
export { name, getName }
//m.js
export default{
name:"陈琦",
getName:function(age){
console.log(`我叫${this.name},年龄${age}`); //此处要加this
}
}
//index.html 第一种写法 必须加default才能访问
import * as m from "./m.js";
console.log(m.default);
console.log(m.default.name);
m.default.getName(18);
//index.html 第二种写法 解构赋值 必须给default别名
import { default as m } from "./m.js"
console.log(m);
console.log(m.name);
m.getName(18);
<br />