{}内 一个代码块
let
声明变量(可解决闭包)
const
声明只读变量 (常量)
代码块内有效,不能提前生成,不能重复声明
按照对应的结构进行赋值
let [a,b]=[1,["a", "b"], 2, 3, 4, 5];// a=1 ,b=["a", "b"]
结构统一,按照位置取值
let [a,[b],[[c]]]=[1, [2], [[3]]];//a=1 ,b=2 ,c=3
设置默认值
let [a=10,b]=[,2];
a不设置默认=2
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
在解构赋值里面 放在最后一位
let [a,...b]=[1,["a", "b"], 2, 3, 4, 5];// a=1 ,b=[["a", "b"], 2, 3, 4, 5]
let [a,b,c,d]="save";// a="s",b="a"···
let {name,sex}={name: "张三", sex: "男"};
let {length : len}="save";//log(len)=4
let {abs,floor,random}=Math; abs(-1);
let {log}=console; log("abc")
具有iterable类型的集合可以通过新的for … of循环来遍历。
for … in遍历的实际上是对象的属性名称
for … of遍历的实际上是元素本身
模板字符串: ${} 字符串拼接变量
反转符(`):将字符串 修改为 单反引号 里面写模板字符串
let [a,b,obj]=["abcd", "efgh", {name: "毛豆"}];
let c = `我是第一个字符串:${a},我是第二个字符串:${b},我的名字叫:${obj.name}。`
// c = 我是第一个字符串:abcd,我是第二个字符串:efgh,我的名字叫:毛豆。
模板字符串里面放置 javascript表达式:<%…%>
let obj = [ {"name": "张三"},
{"name": "李四"},
{"name": "王伟"},
{"name": "马六"}];
//下面的这种格式在ejs 模板语法中在 node 中编译
let complete = `
<% for(let i=0;i<
${obj.length};i++){%>
<%= ${obj[i].name}%>
<%}%>
`;
function method(a="a", b=2) {}; method();
function method({a,b=2}) {}; method({}); method({a: 1, b: 3});
function method([a,...b]){}; method([1,2,3,4,5,6]);
//es5 的函数
var method=function (val){
return val;
}
//es6 箭头函数
let method=(val)=>val;
let b=a.map((val,index)=>({ index, name: val })
let b=a
修改一个,另一个也会改变let a=[1,2,3];let b= [...a];
修改其中一个,另一个不会发生变化let c=[...a,...b]
let a={ 0:"a", 1:"b", length:2 };Array.from(a)
Array.of(1,12,2,3)
a.findIndex((value,index,arr)=>{ return value%6==0; })
arr.find()
arr.findIndex(val,ind,arr)
满足条件的第一个成员let obj={
name:"",
sleep(){
console.log("我在睡觉");}
};
let _sex="Sex";
let a="age";
let b="Now";
let obj={
name:"毛豆",
[_sex]:"男",
[a+b]:20
};
Object.defineProperty(obj, "sex", {
configurable: true,
enumerable: false,
value: "张三",
writable: true
});
修改下面对象的配置
configurable: true 可配置
enumerable: true 可枚举
Object.keys //获取对象的所有的键
Object.values //获取的对象的所有键值
Object.entries //获取对象的键+键值 返回是一个数组
Object.assign(目标对象,原对象) 合并对象
Object.assign 可以复制对象;注意 对象属性上的引用
value: "张三" 数据值
writable: true 可读写性
//设置对象的原型对象
Object.setPrototypeOf(obj, ob);
//获取对象的原型对象的
console.log(Object.getPrototypeOf(obj));
Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
all方法
Promise.resolve() 转换成 Promise对象
var promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value); //返回数据
} else {
reject(error);//返回错误
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
作用
处理JavaScript里的异步
避免回调地狱。
状态
pending、fulfilled、rejected(未决定,履行,拒绝),同一时间只能存在一种状态,且状态一旦改变就不能再变
初始化,状态:pending
当调用resolve(成功),状态:pengding=>fulfilled
当调用reject(失败),状态:pending=>rejected
promise的then方法传参
let promiseDemo = new Promise((resolve, reject) => {
// code
resolve('success')
// code
reject('failed')
})
promiseDemo.then((result) => { //成功调用传参('success')
console.log(result)
}, (result) => {
console.log(result) //失败调用传参('failed')
});
//------------把reject函数拿出来做为catch
promiseDemo.then((result) => {
console.log(result) 成功调用传参('success')
}).catch((result) => {
console.log(result)
})
使用Promise.resolve()快速获取一个成功状态的promise对象
使用Promise.reject()快速获取一个拒绝状态的promise对象
可以通过Promise.resolve()将一个字符串、数字或者对象等转换成一个成功状态的Promise对象。
let b = Promise.resolve({name:'xiaoming', age:18})
b.then((result) => {
console.log(result) // {name:'xiaoming', age:18}
})
async
函数返回一个 Promise 对象,可以使用then
方法添加回调函数。当函数执行的时候,一旦遇到await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
//上面代码指定 50 毫秒以后,输出hello world。
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value);
}
asyncPrint('hello world', 50);
(1)遇到yield表达式,就暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回的对象的value属性值。
(2)下一次调用next方法时,再继续往下执行,直到遇到下一个yield表达式。
(3)如果没有再遇到新的yield表达式,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。
(4)如果该函数没有return语句,则返回的对象的value属性值为undefined。
遍历value。
.next()
next()执行顺序
.next(val)
meth.next().value.then()
类相当于实例的原型,所有在类中定义的方法,都会被实例继承(静态方法除外)
this关键字则代表实例对象
Object.assign方法可以很方便地一次向类添加多个方法。定义在原型.
prototype对象的constructor属性
类的内部所有定义的方法,都是不可枚举的(non-enumerable)。
取值函数(getter)和存值函数(setter)
属性表达式
Class 表达式
静态方法:如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
如果静态方法包含this关键字,这个this指的是类,而不是实例。
(this)上的属性。父类的静态方法,可以被子类继承。
静态属性:Class 本身的属性,即Class.propName,而不是定义在实例对象。两种写法 Foo.prop = 1;//class Foo { static prop = 1; }
私有方法和私有属性:只能在类的内部访问的方法和属性,外部不能访问。
ES6 不提供,只能通过变通方法模拟实现。
extend
super:子类必须在constructor方法中调用super方法,否则新建实例时会报错。
父类的静态方法,也会被子类继承
严格模式
模块导出 引入
export 对外导出,import 引入变量