题目1 手写jsonp
- 取出url、data、callback参数
- 拼接url的data和callback组合成最后请求的url
- 动态创建script
- 将url赋值给script.src
- 定义全局函数,全局函数中执行回调,并将params传递进去
function jsonp(options) {
let {data, url, callback} = options;
console.log('options', options)
const params = [];
for (let key in data) {
params.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
params.push(`callback=` + callback);
url += url.includes('?') > 0 ? (url + '?') : (url + '?');
url += params.join('&');
window[callback] = function(data) {
console.log(data)
}
const scriptNode = document.createElement('script')
scriptNode.src = url;
scriptNode.type = 'text/javascript';
document.body.append(scriptNode);
}
jsonp({
url: 'https://photo.sina.cn/aj/index?a=1',
data: {
page:1,
cate:'recommend',
},
callback: 'callback'
});
题目2: 数字的二进制的1的个数
可以用三种写法来实现。
- 最基础的不断除以2取余数,计算1的个数。
toString(2)可以转换为2进制,再计算1的个数。- 位运算:每次和1异或,除以2也使用右移1实现。
function countOnesInBinary(number) {
let count = 0;
while (number > 0) {
if (number % 2 === 1) {
count++;
}
number = Math.floor(number / 2)
}
return count;
}
function countOnesInBinary(number) {
const binaryString = number.toString(2);
let count = 0;
for (let i = 0; i < binaryString.length; i++) {
if (binaryString[i] === '1') {
count++;
}
}
return count;
}
// 与1进行按位与操作,只剩最后一位,如果是偶数,则结果是0,如果是奇数,是1,
// 所以通过计算这个结果计算出来1的位数。每次操作后右移1
function countOneInBinary(number) {
let count = 0;
while (number > 0) {
count += number & 1;
number = number >> 1;
}
return count;
}
题目三 手写promiseall
注意点:
- reject一个错误就错误了,reject可以直接传入第2个函数
- result收集的索引因为for是let是有作用域的,所以可以正确保存,如果是var就不行了,要用闭包函数解决。
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const len = promises.length;
const result = [];
let count = 0;
for (let i = 0; i < len; i++) {
Promise.resolve(promises[i]).then(res => {
result[i] = res;
count++;
if (count === len) {
resolve(result);
}
}, reject);
}
});
}
function promiseAll(promises) {
return new Promise((resolve, reject) => {
const len = promises.length;
const result = [];
let count = 0;
promises.forEach((item, index) => {
item.then(res => {
result[index] = item;
count++;
if (count === len) {
resolve(result);
}
}, err => reject(err));
});
});
}
今日学习知识点:vue状态库
参考文档: