https://es6.ruanyifeng.com/
let命令:用于声明块级作用域内的变量,它的作用域是该代码块内。
const命令:用于声明常量,该常量的值在声明之后不能更改。
let arr = [1, 2, 3];
//设置一个数组//把数组的第一个值赋值给一个变量a,第二个值赋值给变量b,那么我们可以这样写:
let [a, b] = arr;
console.log(a); // 1
console.log(b); // 2
//这就是变量的解构赋值,把变量分开来赋值,跟正常的赋值不太一样...//解构赋值也适用于对象:
let obj = {name: 'John', age: 20};
let {name, age} = obj;
console.log(name); // John
console.log(age); // 20
//startsWith方法:用于判断一个字符串是否以特定的字符开头
let str = "Hello World";
console.log(str.startsWith("Hello")); // true
console.log(str.startsWith("Hi")); // false//endsWith方法:判断一个字符串是否以特定的字符结尾
let str = "Hello World";
console.log(str.endsWith("World")); // true
console.log(str.endsWith("Universe")); // false//includes方法:用于判断一个字符串是否包含特定的字符
let str = "Hello World";
console.log(str.includes("Hello")); // true
console.log(str.includes("Hi")); // false//repeat方法:用于把一个字符串重复N次
let str = "Hello ";
console.log(str.repeat(3)); // Hello Hello Hello
console.log(Number.isFinite(15)); // true
console.log(Number.isFinite(NaN)); // false
console.log(Number.isSafeInteger(9007199254740990)); // true
console.log(Number.isSafeInteger(9007199254740992)); // false
console.log(Number.parseInt('12.34')); // 12整型
console.log(Number.parseFloat('12.34#')); // 12.34浮点型
// 默认参数
function add(a, b = 10) {return a + b;
}
console.log(add(5)); // 15// 箭头函数
const square = (x) => x * x;
console.log(square(5)); // 25// rest 参数
function sum(...numbers) {return numbers.reduce((a, b) => a + b, 0);
}
console.log(sum(1, 2, 3, 4, 5)); // 15
// Array.from
let arrayLike = {'0': 'a','1': 'b','2': 'c',length: 3
};
let arr = Array.from(arrayLike);
console.log(arr); // ['a', 'b', 'c'],把对象转化为数组// Array.of
console.log(Array.of(1, 2, 3)); // [1, 2, 3]// Array.prototype.fill
console.log(Array(5).fill(1)); // [1, 1, 1, 1, 1],fill(1),就是都变成1// Array.prototype.copyWithin
console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4)); // [4, 2, 3, 4, 5],target,start,end
//对象的属性简写:ES6允许在对象字面量中使用 简写形式 定义对象的属性
let name = 'John';
let age = 25;
let user = {name,age
};
console.log(user); // { name: 'John', age: 25 }//对象的计算属性名:ES6允许通过表达式 动态计算属性名
let prop = 'name';
let user = {[prop]: 'John'
};
console.log(user); // { name: 'John' }//对象的方法简写:ES6允许在对象字面量中使用简写形式定义 对象的 方法
let user = {sayHi() {console.log('Hi');}
};
user.sayHi(); // Hi
const set = new Set();//允许存储任意类型的唯一值,没有重复的值
set.add(1);
set.add(2);
set.add(3);
console.log(set.size); // 3const map = new Map();//存储任意类型的键值对,键可以是任意类型。
map.set("name", "John");
map.set("age", 30);
console.log(map.get("name")); // John
常用handler 对象的 get 拦截器,以实现对代理对象的读取操作的拦截。
当代码试图读取代理对象的属性时,get 拦截器就会被调用,就会按照get里写的内容进行输出,就实现了对输出的控制。
const target = { name: 'John Doe' };
const handler = {get: function(target, property) {console.log(`Getting property: ${property}`);return target[property];}
};
const proxy = new Proxy(target, handler);
console.log(proxy.name);
// Output: Getting property: name
// John Doe//这里'Getting property:'仅仅是字符串,${property}中的property是一个变量
const object = {};
console.log(Reflect.defineProperty(object, "property", { value: 42 }));
console.log(object.property); // 42
const promise = new Promise((resolve, reject) => {// 异步操作代码if (/* 异步操作成功 */) {resolve(value);} else {reject(error);}
});
promise.then(value => {// 当异步操作成功时被调用
}).catch(error => {// 当异步操作失败时被调用
});const promise = new Promise((resolve, reject) => {setTimeout(() => {resolve("Success");}, 1000);
});
promise.then(result => {console.log(result); // Success
});
for of与lterator配合使用,遍历数组,记住这个就行
let arr = [1, 2, 3];
let iterator = arr[Symbol.iterator]();
for (let value of iterator) {console.log(value);
}
// Output: 1 2 3
//简而言之,lterator是一种数据结构的遍历机制,与for of连用,用来遍历所有元素
每当 yield 关键字被调用时,Generator 函数的执行就会暂停。当调用 next() 方法时,执行将恢复,并返回一个包含当前生成值和执行状态的对象。
Generator 函数的主要优点在于可以生成迭代器,并对外部环境的影响最小。它们可以用于实现懒加载(lazy loading)、数据流处理、任务调度等多种功能。
function* generator() {yield 1;yield 2;yield 3;
}
const iterator = generator();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
async function getData() {let result = await fetch("https://some-api.com/data");return result.json();
}
//这样在写getdata类的函数时候,就不怕异步问题了
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
}
const animal = new Animal('Dog');
animal.speak(); // Dog makes a noise.
//也就是js也可以写类了,更加面向对象编程了
class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
}
class Dog extends Animal {constructor(name) {super(name);}speak() {console.log(`${this.name} barks.`);}
}
const dog = new Dog('Lucy');
dog.speak(); // Lucy barks.
// 文件:math.js
export function add(a, b) {return a + b;
}
然后就可以在别的文件里导入模块
// 文件:app.js
import { add } from './math.js';console.log(add(1, 2)); // 输出:3
模块简而言之就是export,import