【面试】手写jsonp、数字的二进制1 的个数、promiseall

58 阅读2分钟

题目1 手写jsonp

  1. 取出url、data、callback参数
  2. 拼接url的data和callback组合成最后请求的url
  3. 动态创建script
  4. 将url赋值给script.src
  5. 定义全局函数,全局函数中执行回调,并将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的个数

可以用三种写法来实现。

  1. 最基础的不断除以2取余数,计算1的个数。
  2. toString(2)可以转换为2进制,再计算1的个数。
  3. 位运算:每次和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

注意点:

  1. reject一个错误就错误了,reject可以直接传入第2个函数
  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状态库

状态管理库.png

参考文档: