问题
定义一个变量a,使得下面的表达式结果为true ?
a == 1 && a == 2 && a == 3
1
const a = {
i: 1,
toString () {
return this.i++
}
}
a == 1 && a == 2 && a == 3 // true
1
2
3
4
5
6
7
2
3
4
5
6
7
参考 1
多个await 和 Promise.all 的区别
function sleep(seconds) {
return new Promise(resolve => {
setTimeout(() => {
resolve('request done!' + Math.random());
}, seconds);
})
}
1
2
3
4
5
6
7
2
3
4
5
6
7
多个await
//请求时一个结束之后发起另一个,所以执行时间至少3s
async function bugDemo () {
await sleep(1000);
await sleep(1000);
await sleep(1000);
console.log('done');
}
bugDemo();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Promise.all
//请求时并行处理,时间远小于3s
async function correctDemo () {
let p1 = sleep(1000);
let p2 = sleep(1000);
let p3 = sleep(1000);
await Promise.all([p1, p2, p3]);
console.log('done');
}
correctDemo();
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
参考 1
Promise.all 实现
// 简单来说就是把所有要执行的函数都放进一个数组里面,然后数组依次以同步的形式一个一个执行,执行结束后能够接着执行then里面的东西。
Promise.all = arr => {
let aResult = []; //用于存放每次执行后返回结果
return new Promise(function (resolve, reject) {
let i = 0;
next(); //开始逐次执行数组中的函数
function next() {
arr[i].then(function (res) {
aResult.push(res); //执行后返回的结果放入数组中
i++;
if (i == arr.length) { //如果函数数组中的函数都执行完,便把结果数组传给then
resolve(aResult);
} else {
next();
}
})
}
})
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
['1', '2', '3'].map(parseInt)
相当于
['1', '2', '3'].map((item, index) => {
return parseInt(item, index);
});
1
2
3
2
3
参考 1
结果是?
var obj = {
'2': 3,
'3': 4,
'length': 2,
'splice': Array.prototype.splice,
'push': Array.prototype.push
}
obj.push(1)
obj.push(2)
console.log(obj)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
[empty × 2, 1, 2, splice: ƒ, push: ƒ] 类数组
解释:
- js判断类数组的方法:
/**
* @param {?Object} obj
* @return {boolean}
*/
function isArrayLike(obj) {
if (!obj || typeof obj !== 'object')
return false;
try {
if (typeof obj.splice === 'function') {
const len = obj.length;
return typeof len === 'number' && (len >>> 0 === len && (len > 0 || 1 / len > 0));
}
} catch (e) {}
return false;
}
// 判断的过程:
// 1 存在且是对象
// 2 对象上的splice 属性是函数类型
// 3 对象上有 length 属性且为正整数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- push 方法根据 length 属性来决定从哪里开始插入给定的值。如果 length 不能被转成一个数值或不存在,则插入的元素索引为 0。