跳至主要內容

手写代码-50道

Weipeng Qiao大约 4 分钟面试题

1、手写 10 中以上数组排序方式(原生 JS)

//快速排序
function quickSort(elements) {
  if (elements.length <= 1) {
    return elements;
  }
  var pivotIndex = Math.floor(elements.length / 2);
  var pivot = elements.splice(pivotIndex, 1)[0];
  var left = [];
  var right = [];
  for (var i = 0; i < elements.length; i++) {
    if (elements[i] < pivot) {
      left.push(elements[i]);
    } else {
      right.push(elements[i]);
    }
  }
  return quickSort(left).concat([pivot], quickSort(right));
  //concat()方法用于连接两个或者多个数组;该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
}
var elements = [3, 5, 6, 8, 2, 4, 7, 9, 1, 10];
document.write(quickSort(elements));
//插入排序
function sort(elements) {
  // 假设第0个元素是一个有序数列,第1个以后的是无序数列,
  // 所以从第1个元素开始将无序数列的元素插入到有序数列中去
  for (var i = 1; i <= elements.length; i++) {
    // 升序
    if (elements[i] < elements[i - 1]) {
      // 取出无序数列中的第i个作为被插入元素
      var guard = elements[i]; //记住有序数列的最后一个位置,并且将有序数列的位置扩大一个
      var j = i - 1;
      elements[i] = elements[j]; // 比大小;找到被插入元素所在位置
      while (j >= 0 && guard < elements[j]) {
        elements[j + 1] = elements[j];
        j--;
      }
      elements[j + 1] = guard; //插入
    }
  }
}
var elements = [3, 5, 6, 8, 2, 4, 7, 9, 1, 10];
document.write("没调用之前:" + elements);
document.write("<br>");
sort(elements);
document.write("被调用之后:" + elements);
// 冒泡排序
function Bubbling(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] < arr[j + 1]) {
        let empty = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = empty;
      }
    }
  }
  return arr;
}
console.log(Bubbling([1, 2, 3, 55, 66, 77]));

2、手写 new 关键字源码

//手写new关键字源码
function MyNew() {
  let obj = {};
  let fn = [].shift.call(arguments);
  obj.__proto__ = fn.prototype;
  fn.apply(obj, arguments);
  return obj;
}

3、手写 instanceof 源码

function _instance(child, parent) {
  let left = child._proto_;
  let right = parent.prototype;
  while (true) {
    if (left === null) {
      return false;
    }
    if (left === right) {
      return true;
    }
    left = left._proto_;
  }
}

4、手写防抖和节流

防抖

function dobounce(fn, time) {
  let timer = null;
  return function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
      fn();
    }, time);
  };
}

节流

function throttle(fn, time) {
  let flag = 1;
  return function () {
    if (flag == 0) {
      return;
    }
    flag = 0;
    setTimeout(function () {
      fn();
      flag = 1;
    }, time);
  };
}

5、数组去重 (原生 JS 实现)

//利用filter
function unique(arr) {
  return arr.filter(function (item, index, arr) {
    //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
    return arr.indexOf(item, 0) === index;
  });
}
var arr = [
  1,
  1,
  "true",
  "true",
  true,
  true,
  15,
  15,
  false,
  false,
  undefined,
  undefined,
  null,
  null,
  NaN,
  NaN,
  "NaN",
  0,
  0,
  "a",
  "a",
  {},
  {},
];
console.log(unique(arr));
//利用ES6 Set去重(ES6中最常用)
function unique(arr) {
  return Array.from(new Set(arr));
}
var arr = [
  1,
  1,
  "true",
  "true",
  true,
  true,
  15,
  15,
  false,
  false,
  undefined,
  undefined,
  null,
  null,
  NaN,
  NaN,
  "NaN",
  0,
  0,
  "a",
  "a",
  {},
  {},
];
console.log(unique(arr));
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

//set
const arr = [1, 1, 1, 4, 5, 6, 2, 2, 3, 4, 8, 9];
console.log([...new Set(arr)]);
// includes方法
fn = (array) => {
  const one = [];
  for (let i = 0; i < array.length; i++) {
    if (!one.includes(array[i])) {
      one.push(array[i]);
    }
  }
  return one;
};
console.log(fn(arr));
// 原生
//利用for嵌套for,然后splice去重(ES5中最常用)
function unique(arr) {
  for (var i = 0; i < arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] == arr[j]) {
        //第一个等同于第二个,splice方法删除
        第二个;
        arr.splice(j, 1);
        j--;
      }
    }
  }
  return arr;
}
var arr = [
  1,
  1,
  "true",
  "true",
  true,
  true,
  15,
  15,
  false,
  false,
  undefined,
  undefined,
  null,
  null,
  NaN,
  NaN,
  "NaN",
  0,
  0,
  "a",
  "a",
  {},
  {},
];
console.log(unique(arr)); //[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]
//NaN和{}没有去重,两个null直接消失了

6、手写原生 ajax 的实现

const result = new XMLHttpRequest();
result.open("get", "xxxxxx", true);
result.send(null);
// result.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
result.onreadystatechange = function () {
  if (result.readyState == 4 && result.status == 200) {
    const data = result.responseText;
  }
};

7、使用解构赋值,实现两个变量的值的交换

如: let a=1 let b=2 交换后 a=2 b=1

let a = 1;
let b = 2;
[a, b] = [2, 1];
console.log(a, b);

8、数组和 set 之间如何相互转化 数组和 map 之间如何相互转化

// 数组转set
let array = [1, 12, 13, 11];
let set = new Set(array);
console.log(set);

// set转换为array
let index = new Set([1, 12, 13, 11]);
let demo = Array.from(index);
console.log(demo);

// 扩展运算符实现map转数组
let map = new Map([
  [1, "one"],
  [2, "two"],
  [3, "three"],
]);
let arr1 = [...map.keys()];
let arr1 = [...map.values()];
console.log(arr1, arr2);

// 数组传入Map构造函数转为Map
let arr = [
  [1, "one"],
  [2, "two"],
  [3, "three"],
];
let map1 = new Map(arr);
console.log(map1);

9、请写出至少两种常见的数组排序的方法(原生 js)

上次编辑于:
贡献者: qiaoweipeng