学习自赖雪峰大佬 https://es6.ruanyifeng.com/#README
var answer = confirm("准备好了吗")
点击确定answer为true 取消则为false
setTimeout(fun,4000)
let 是在代码块内有效作用域是块作用域在 { } 里面,var 是在函数内有效 const 是定义的常量是块作用域在 { } 里面
数组
let [foo, [[bar], baz]] = [, [[2], 3]];
foo // undefined
bar // 2
baz // 3
对象
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"
let { first: f, last: l } = { first: 'hello', last: 'world' };
f // 'hello'
l // 'world'
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line,column }} } = node;
line // 1
column // 5
loc // Object {start: Object}
start // Object {line: 1, column: 5}
赋默认值
// 默认值生效的条件是,对象的属性值严格等于undefined
var {x = 3} = {};
x // 3
var {x, y = 5} = {x: 1};
x // 1
y // 5
var {x: y = 3} = {};
y // 3
var {x: y = 3} = {x: 5};
y // 5
// 属性x等于null,因为null与undefined不严格相等,所以是个有效的赋值,导致默认值3不会生效
var {x = 3} = {x: undefined};
x // 3
var {x = 3} = {x: null};
x // null
[1, undefined, 3].map((x = 'yes') => x*2);
// [ 1, 'yes', 3 ]
// x='yes'是赋予初始值如果为undifined的时候
// map是将前面的数组进行循环并执行括号里的方法
let name = "Bob", time = "today";
console.log(`Hello ${name}, how are you ${time}?`)
// 输出 Hello Bob, how are you today?
.startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
.endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
.includes():返回布尔值,表示是否找到了参数字符串。
'123'.repeat('3') // 123123123
'na'.repeat(2.9) // "nana"
'na'.repeat(0) // ""
'na'.repeat(NaN) // ""
str.trim() // 清除内容内所有的空格
str.trimStart() // 清除内容头部所有的空格
str.trimEnd() // 清除内容尾部所有的空格
var youList = [2,55,33,11]
for(var item of youList ){
console.log(item)
// 输出 2 55 33 11
}
for(var item in youList ){
console.log(item)
// 输出 0 1 2 3
console.log(youList[item])
// 输出 2 55 33 11
}
for(var [index,elem] of youList.entries()){
console.log(index, elem);
// 0 2
// 1 55
// 2 33
// 3 11
}
[1,2,3,4,5].includes(1) // true
// 返回的是布尔值 还可以判断NaN
如果原数组有空位,flat()方法会跳过空位。
方法内填写2的时候值拉平2层
var a = [1,[2,3],[3,4,5,[5,6,7,[66]]]]
console.log(a.flat(Infinity))
// [1, 2, 3, 3, 4, 5, 5, 6, 7, 66]
由于是2020新出的,会有部分浏览器不适用,不建议使用
let message = {
body:{
user:{
firstName :'pan'
}
}
}
const firstName = message?.body?.user?.firstName || undefined
// firstName pan
// 如果message 或者 下一层如果不存在 firstName = undefined
修改 firstName.body 会修改 message.body
let message = {
body:{
user:'pan'
}
}
let firstName = Object.assign({},message,{a:2})
{
a:2,
body:{
user:"pan"
}
}
let message = new Map(Object.entries(message));
message = Object.fromEntries(message);
从obj中取出values,keys,entries
let message = {a:1,b:2,c:3}
for(let key of keys(message )){
console.log(key)
// a b c
}
for(let value of values(message )){
console.log(value)
// 1 2 3
}
for(let entrie of entries(message )){
console.log(entrie)
// ["a",1] ["b",2] ["c",3]
}
有三种状态 pending(进行中)、fulfilled(已成功)和rejected(已失败)
该对象是不可逆结果固定的对象
const p1 = new Promise(function (resolve,reject){
if(a == 2){
setTimeout(() => {resolve(a+3);},2000)
}else{
setTimeout(() => {reject(a+40);},2000)
}
})
resolve 方法是返回 fulfilled 可以用 .then获取
reject 方法是返回 rejected 可以用 .catch获取
var a = 2
p1
.then(result => {console.log(result)}) // 如果没有下面的修改 在2秒后输出 5
.catch(err => console.log(err)) // 在2秒后输出 50
a = 10
p1
.then(result => {console.log(result)})
.catch(err => console.log(err)) // 在2秒后输出 50
用于执行方法调用前面方法的返回值
let pro = new Promise(function(resolve,reject){
if(true){
//调用操作成功方法
resolve('操作成功');
}else{
//调用操作异常方法
reject('操作异常');
}
});
//用then处理操作成功,catch处理操作异常
pro.then(requestA)
.then(requestB)
.then(requestC)
.catch(requestError);
function requestA(){
console.log('请求A成功');
return '请求B,下一个就是你了';
}
function requestB(res){
console.log('上一步的结果:'+res);
console.log('请求B成功');
return '请求C,下一个就是你了';
}
function requestC(res){
console.log('上一步的结果:'+res);
console.log('请求C成功');
}
function requestError(){
console.log('请求失败');
}
//打印结果:
//请求A成功
//上一步的结果:请求B,下一个就是你了
//请求B成功
//上一步的结果:请求C,下一个就是你了
//请求C成功
Promise的 all()方法
会将返回值放进数组
会等待所有的异步结束才会返回
var flag = false
let pro1 = new Promise(function(resolve){
setTimeout(function () {
resolve('实例1操作成功');
},1000);
});
let pro2 = new Promise(function(resolve,reject){
if(flag){
setTimeout(function () {
reject('实例2操作失败');
},5000);
}else{
setTimeout(function () {
resolve('实例2操作成功');
},1000);
}
});
Promise.all([pro1,pro2])
.then(result => {
console.log(result);
})
.catch(err => {
console.log(err);
})
// 如果flag为 true 会在5秒后输出 "实例2操作失败"
// 如果flag为 false 会在1秒后输出 ["实例1操作成功", "实例2操作成功"]
Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态(yield在英语里的意思就是“产出”)。
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
let hg = helloWorldGenerator()
要让hg执行下去使用.next 会以{ value: ‘hello’, done: false }形式返回 当执行的 return 的时候 done 会变成 true
hw.next()
// { value: 'hello', done: false }
hw.next()
// { value: 'world', done: false }
hw.next()
// { value: 'ending', done: true }
hw.next()
// { value: undefined, done: true }
每执行一遍 g.next() 就会执行一遍yield 会记录执行
let g = function* generator() {
while (true) {
console.log('Tick!');
yield;
console.log('Tock!');
yield;
}
}
await是等待这一步完成后, 获得结果, 才能执行下一步
async用于修饰函数, 如果函数内部出现了await关键词,函数前面必须添加async, 这是语法
await 后面必须跟 Promise 对象
class a{
doit(){
console.log('111')
}
static doit(){
console.log('222')
}
get prop() {
console.log('getter: '+this.pro)
return this.pro;
}
set prop(value) {
this.pro = value
console.log('setter: '+value);
}
}
类的 get 属性可以在调用的时候触发
类的 set 属性可以再赋值的时候触发
类的 static 属性是当对本类调用才取得到
不用 static 的方法要用实例对象调用
var aa = new a()
aa.doit() // 111
aa.prop = 123 // setting: 123
a.doit() // 222
aa.prop // getter: 123