ES6新增常用API
1.1. 数字
1.1.1. 预览
名称 |
宿主 |
类型 |
作用 |
isInteger |
Number |
method |
是不是整数,小数点后为0的也算,比如2.0 |
isNaN |
Number |
method |
是不是NaN |
isFinite |
Number |
method |
是不是非无穷的数字 |
parseInt |
Number |
method |
字符串转整数,原本全局的方法的转移 |
parseFloat |
Number |
method |
字符串转浮点数,原本全局的方法的转移 |
1.1.1.1. 演示
-
Number.isInteger
Number.isInteger(100); // true
Number.isInteger(100.0); // true
Number.isInteger(100.1); // false
-
Number.isNaN
Number.isNaN(123); // false
Number.isNaN(NaN); // true
Number.isNaN("abc"); // false
Number.isNaN([ 'a', 'b', 'c' ]); // false
-
Number.isFinite
Number.isFinite(100); // true
Number.isFinite(Infinity); // false
Number.isFinite("100"); // false
-
Number.parseInt
Number.parseInt("100.123", 10); // 100
Number.parseInt("100.123", 2); // 4
Number.parseInt("100.123", 8); // 64
Number.parseInt("100.123", 16); // 256
-
Number.parseFloat与parseInt用法一致。
1.2. 字符串
1.2.1. 预览
名称 |
宿主 |
类型 |
作用 |
fromCodePoint |
String |
method |
通过Unicode码点求字符,支持大于0xFFFF编码字符 |
codePointAt |
String.prototype |
method |
获取指定下标字符的Unicode码点,支持大于0xFFFF编码字符 |
at |
String.prototype |
method |
获取指定下标的字符,可正确获取大于0xFFFF编码的字符 |
includes |
String.prototype |
method |
是否包含指定字符串 |
startsWith |
String.prototype |
method |
起始位置是否包含指定字符串 |
endsWith |
String.prototype |
method |
结束位置是否包含指定字符串 |
repeat |
String.prototype |
method |
重复字符串多次 |
1.2.1.1. 演示
String.fromCodePoint(97); // "a"
String.fromCodePoint(0x61); // "a"
String.fromCodePoint(19968); // "一"
String.fromCodePoint(0x4e00); // "一"
- String.prototype.codePointAt
let str = 'ABCD一二三四';
str.codePointAt(0); // 65
str.codePointAt(4); // 19968
- String.prototype.at 浏览器还不支持,忽略
let str = 'ABCD一二三四';
str.at(0); // "A"
str.at(4); // "一"
- String.prototype.includes
- 要检测的字符串 { string }
- 起始位置 { number }
let str = 'abcde';
str.includes('abc'); // true
str.includes('bcd'); // true
str.includes('bcd', 2); // false
- String.prototype.startsWith
- 要检测的字符串 { string }
- 起始位置 { number }
let str = 'abcde';
str.startsWith('abc'); // true
str.startsWith('bcd'); // false
str.startsWith('bcd', 1); // true
- String.prototype.endsWith
- 要检测的字符串 { string }
- 结束位置,包头不包尾 { number }使用与上面的starsWith一致
"abc".repeat(3); // "abcabc"
"123".repeat(4); // "123123123123"
1.3. 数组
1.3.1. 预览
名称 |
宿主 |
类型 |
作用 |
from |
Array |
method |
类数组转真数组 |
find |
Array.prototype |
method |
寻找第一个符合条件的值,类似的filter方法找全部 |
findIndex |
Array.prototype |
method |
寻找第一个符合条件的值的下标 |
fill |
Array.prototype |
method |
重置数组中的值 |
1.3.1.1. 演示
- Array.from
- 类数组
- 与map功能一样的回调
let likeArray = { 0: 'aa', 1: 'bb', 2: 'cc', length: 3 }
Array.from(likeArray); // [ 'aa', 'bb', 'cc' ]
let lis = document.querySelectorAll('li');
Array.from(lis); // [ li, li, li, ... ]
let str = 'abc';
Array.from(str); // [ 'a', 'b', 'c' ]
let nums = '123';
Array.from(nums, v => v * v); // [ 1, 4, 9 ]
[11, 22, 33, 44].find(v => v % 2 === 0); // 22
[11, 22, 33, 44].find(v => v > 50); // undefined
- Array.prototype.findIndex
[11, 22, 33, 44].find(v => v % 2 === 0); // 22
[11, 22, 33, 44].find(v => v > 50); // undefined
- Array.prototype.fill
- 重置默认值 { any }
- 起始位置 { number }
- 结束位置,包头不包尾 { number }
let arr = new Array(5);
arr.fill(1); // [ 1, 1, 1, 1, 1 ]
arr.fill(10, 2, 4); // [ 1, 1, 10, 10, 1 ]
1.4. 对象
1.4.1. 预览
名称 |
宿主 |
类型 |
作用 |
is |
Object |
method |
全等运算符的方法实现,但NaN与NaN相等,-0与+0不等 |
assign |
Object |
method |
对象浅拷贝 |
keys |
Object |
method |
获取自身所有可枚举的key |
values |
Object |
method |
获取自身所有可枚举的value |
entries |
Object |
method |
获取自身所有可枚举的key与value |
getPrototypeOf |
Object |
method |
获取对象继承的原型 |
setPrototypeOf |
Object |
method |
设置对象继承的原型 |
1.4.1.1. 演示
Object.is(123, "123"); // false
Object.is(-0, 0); // false
Object.is(NaN, NaN); // true
let o1 = { a: 1, b: 2 };
let o2 = { c: 3, d: 4 };
Object.assign(o1, o2); // o1 => { a:1, b: 2, c:3, d: 4 }
let obj = { a: 11, b: 22, c: 33 };
Object.keys(obj); // [ 'a', 'b', 'c' ]
let obj = { a: 11, b: 22, c: 33 };
Object.values(obj); // [ 11, 22, 33 ]
let obj = { a: 11, b: 22, c: 33 };
Object.entries(obj); // [ [ 'a', 11 ], [ 'b', 22 ], ['c', 33] ]
let arr = [];
Object.getPrototypeOf(arr); // Array.prototype
let arr = [];
Object.setPrototypeOf(arr, { a: 11, b: 22 });
arr.a // 11
arr.slice // undefined
1.5. Set
- 新增的构造函数, 可创建新的
数据结构
, 结构类似与数组, 特点是值唯一
1.5.1. 预览
名称 |
宿主 |
类型 |
作用 |
size |
Set |
property |
集合成员数量 |
add |
Set.prototype |
method |
添加某个值 |
delete |
Set.prototype |
method |
删除某个值 |
has |
Set.prototype |
method |
是否存在某个值 |
clear |
Set.prototype |
method |
清空所有值 |
forEach |
Set.prototype |
method |
遍历值 |
1.5.1.1. 演示
let numSet = new Set([2, 4, 6, 2, 4, 6]); // { 2, 4, 5 }
numSet.size // 3
let numSet = new Set([2, 4, 6]);
numSet.add(4); // { 2, 4, 6 }
numSet.add(8) // { 2, 4, 6, 8 }
let numSet = new Set([10, 20, 30]);
numSet.delete(10); // { 20, 30 }
let numSet = new Set([10, 20, 30]);
numSet.has(20); // true
numSet.has(50); // false
let numSet = new Set([10, 20, 30]);
numSet.clear(); // {}
- forEach
- 用来接收值的回调 { function }
- 回调中的this指向 { any }
let numSet = new Set([10, 20, 30]);
numSet.forEach(v => console.log(v));
let numSet = new Set([10, 20, 30]);
for(let v of numSet) {
console.log(v); // 10, 20, 30
}
let arr1 = [ 1, 3, 5 ];
let arr2 = [ 5, 7, 9 ];
new Set([ ...arr1, ...arr2 ]); // { 1, 3, 5, 7, 9 }
1.6. Map
- 新增的构造函数, 可创建新的
数据结构
, 结构类似与对象, 特点是key值
可以为对象
1.6.1. 预览
名称 |
宿主 |
类型 |
作用 |
size |
Map |
property |
集合成员数量 |
set |
Set.prototype |
method |
通过key,value形式添加新值 |
get |
Set.prototype |
method |
通过key取值 |
delete |
Set.prototype |
method |
通过key删除值 |
has |
Set.prototype |
method |
是否存在某个key |
clear |
Set.prototype |
method |
清空所有值 |
forEach |
Set.prototype |
method |
遍历值 |
1.6.1.1. 演示
let numMap = new Map([
[new Date(), 100],
[{}, 200]
]);
numMap.size // 2
let obj = { name: '张三', age: 21 };
let map = new Map();
map.set(obj, '我不认识李四');
map.get(obj) // '我不认识李四'
let fibs = [1, 1, 2, 3, 5, 8];
let map = new Map();
map.set(fibs, '这是');
map.delete([1, 1, 2, 3, 5, 8]); // false
map.delete(fibs); // true
let date = new Date();
let map = new Map();
numSet.has(date); // false
numSet.set(date, '明月几时有,把酒问青天');
numSet.has(date); // true
let numMap = new Map([
[new Date(), 100],
[{}, 200]
]);
numMap.clear() // {}
- forEach
- 用来接收值的回调 { function }
- 回调中的this指向 { any }
let numMap = new Map([
[new Date(), 100],
[{}, 200]
]);
numMap.forEach((v, k) => console.log(v, k));
let numMap = new Map([
[new Date(), 100],
[{}, 200]
]);
for(let v of numMap) {
console.log(v); // 100, 200
}
1.7. Promise
- Promise:承诺、约定的意思,主要用于异步执行流程的管理
- 它可以解决传统异步解决方案中,回调嵌套过深不利于维护的问题
1.7.1. 演示
- 假定我们有这样一个需求:某人和青梅竹马的芳芳约定,如果十年后她还没嫁,就嫁给我
- 这个需求中就含有异步逻辑的处理,芳芳要不要嫁给我需要等待10年后才会知晓
- 这里我们通过Promise来尝试实现这个需求:
- 使用promise管理一个10年约定
- 添加10年后的处理逻辑
1.7.1.1.1. 第一步
- Promise自身是一个
构造函数
,我们可以new它创建实例
- 然后传入一个
函数
,里面编写异步操作的代码
let engagement = new Promise(function(yes, no) {
// 定义10年期限,期限到后芳芳没嫁,就调yes,否则调no
// 这里的yes与no方法是Promise实例提供给我们的
setTimeout(function() {
yes();
}, 1000 * 10);
});
1.7.1.1.1.1. 第二步
- 上面的代码在10年期限到来时,并没有写处理逻辑,而是通过调用Promise实例提供的方法告知最终结果
- 因为Promise实例知道最终的结果,所以它专门提供了一个then方法让我们来添加处理逻辑
// then接收两个回调,第一个是成功回调,第二个是失败回调(可选)
engagement.then(
() => console.log('太开心了,芳芳终于嫁给了我'),
() => console.log('我最终还是错过了芳芳')
);
1.7.1.1.1.2. 后续处理
- 使用Promise后你会发现我们异步操作与后续的处理逻辑是分开编写的
- 而且我们可以通过then方法多次添加后续的处理逻辑
- 即时异步操作结束了,我们还是可以调用then
// 只传入成功回调
engagement.then(
() => console.log('芳芳终于嫁给我了,我要带她环游世界!')
);
// 如果只想指定失败回调,可以通过catch方法来添加
engagement.catch(
() => console.log('我的世界开始变得暗淡无光')
);
1.7.1.2. 小结
- 使用Promise管理异步操作,
异步逻辑
与结果处理
是分开编写的,这有利于我们程序的解耦
,让程序更好维护
- then方法后续仍可以调用,是因为每个Promise实例都有一个
状态
记录异步操作执行的进度
,即时异步操作结束
了,这个记录仍然存在
pending
状态,代表正在执行异步操作,实例刚创建
时的状态
resolved
状态,代表异步代码执行完毕,调用yes
方法后的状态
rejected
状态,代表异步代码执行完毕,调用no
方法后的状态
1.8. 控制异步操作流程
1.8.1. 普通做法
setTimeout(function() {
console.log('第一个计时器回调执行,开启第二个');
setTimeout(function() {
console.log('第二个计时器回调执行,开启第三个');
setTimeout(function() {
console.log('第三个计时器回调执行');
}, 2000);
}, 2000);
}, 2000);
1.8.1.1. Promise做法
// 创建一个promise实例,用于控制第二个计时器的执行
new Promise(function(yes, no) {
setTimeout(function() {
console.log('第一个计时器回调执行,开启第二个');
yes();
}, 2000);
})
// 第二个执行,并创建返回一个新的promise实例,用于控制第三个计时器的执行
.then(function() {
return new Promise(function(yes, no) {
setTimeout(function() {
console.log('第二个计时器回调执行,开启第三个');
yes();
}, 2000);
});
})
// 第三个执行,如没第四个,就不用再返回新的promise实例控制后续执行了
.then(function() {
setTimeout(function() {
console.log('第三个计时器回调执行');
}, 2000);
});
1.9. Promise封装与传参
1.9.1. 封装promise版本的定时器
- 如果同一件异步操作将来可能多次使用,可以考虑封装一个方法,便于复用
function pmsTimeout(time, data) {
return new Promise(function(yes, no) {
setTimeout(function() {
yes(data);
}, time);
});
}
pmsTimeout(2000)
.then(function() {
console.log('通过then方法来添加定时器的回调逻辑,实现解耦');
});
pmsTimeout(4000)
.then(function() {
console.log('封装后使用方便不少');
});
1.9.1.1. 数据传递
- 另外yes与no方法还可以传递一些参数给then中的回调
function pmsTimeout(time) {
return new Promise(function(yes, no) {
setTimeout(function() {
yes('给小伙来个士力架');
}, time);
});
}
pmsTimeout(2000)
.then(function(data) {
console.log(data); // '给小伙来个士力架'
});
1.9.1.2. 进阶
- 我们把普通异步操作封装成promise版本时,可以让使用者指定数据
function pmsTimeout(time, data) {
return new Promise(function(yes, no) {
setTimeout(function() {
yes(data); // 用户传什么我就给then回调什么
}, time);
});
}
pmsTimeout(2000, '老大')
.then(function(data) {
console.log(`${ data }没钱吃饭`);
return pmsTimeout(3000, '老二');
})
.then(function(data) {
console.log(`${ data }没钱穿衣`);
return pmsTimeout(4000, '老三');
})
.then(function(data) {
console.log(`${ data }个长不大`);
});
1.10. asyncES7
- 使异步操作变得更加简洁清晰
- 使用它控制Promise执行流程,简直没谁了
1.10.1. 顺序执行定时器
function pmsTimeout(time, data) {
return new Promise(function(yes, no) {
setTimeout(function() {
yes(`Hello ${ data }`); // 数据小做处理
}, time);
});
}
async function asyncTimeout() {
let data = null;
data = await pmsTimeout(1000, '大娃');
console.log(data);
data = await pmsTimeout(2000, '二娃');
console.log(data);
data = await pmsTimeout(3000, '三娃');
console.log(data);
data =await pmsTimeout(4000, '四娃');
console.log(data);
}
// 开启幸福生活
asyncTimeout();
1.10.1.1. 顺序进行数据请求
async function asyncFetch() {
let response = null, data = null;
response = await fetch('abc.json');
data = response.ok && await response.json();
console.log(data);
response = await fetch('react.js');
data = response.ok && await response.text();
console.log(data);
}
// 开启幸福生活
asyncFetch();