前端面试题目

135 阅读2分钟

数值打印

console.log({}+{})
console.log([]+{})
console.log({}+[])
let obj = { a: 0 };
function test(obj) {
  obj.a = 1;
  console.log(obj)
  obj = { a: 2 };
    console.log("11",obj)
  obj.a = 3;
    console.log("233", obj)
}
test(obj);
console.log(obj);
let name = "the window";
function test() {
  console.log(this.name);
}
let obj = {
  name: "the object",
  getName: function(fn) {
    fn && fn();
    console.log(this.name)
    return function() {
      return this.name;
    };
  }
};
console.log(obj.getName(test)())
var name = "the window";
function test() {
  console.log(this.name);
}
let obj = {
  name: "the object",
  getName: function(fn) {
    fn && fn();
    console.log(this.name)
    return function() {
      return this.name;
    };
  }
};
console.log(obj.getName(test)())
console.log(1);
async function test() {
  console.log(2);
  await console.log(3);
  console.log(4);
}
setTimeout(() => {
  console.log(5);
}, 0);
test();
new Promise(resolve => {
  console.log(6);
  resolve();
}).then(() => {
  console.log(7);
});
console.log(8);

window.isNan number.isnan区别

post put 区别

求两个数的最大公约数

个人感觉这种题目,没有多大意义,都是基本的数学,知道就是知道,不知道,根本想不出
1 使用暴力解法

export default (a, b) => {
  if (a === b) return a;
  const min = Math.min(a, b);
  let max = 1;
  for (let i = min; i >= 1; i--) {
    if (a % i === 0 && b % i === 0) {
      max = Math.max(max, i);
    }
  }
  return max;
};

2 相减法

①先判断两个数的大小,如果两数相等,则这个数本身就 是就是它的最大公约数。
②如果不>b 相等,则用大数减去小数,然后用这个较小数与它们相减的结果相比较,如果相等,则这个差就是它们的最大公约数,而如果不相等,则继续执行②操作。

const gcd = (a, b) => {
  if (a === b) return a;
  let min = Math.min(a, b);
  if (min === 0) {
    return Math.max(a, b);
  }
  let temp;
  if (a < b) {
    temp = b - a;
  } else {
    temp = a - b;
  }

  return gcd(min, temp);
};

export default gcd;

①当两个数相等时,其中任意一个就是它们的最大公约数,因为它们的余数为0;
②当两个数不相等时,用较大数除以较小数,当余数不为0时,这时 使较小数作为被除数,余数作为除数,继续 ②的操作,直至余数为0,也就是这两个数相等时,其中任一数为最大公约数。

依然是上面的例子:18和12的最大公约数6 18 = 6 * a 12 = 6 * b 18/12—–商为1—–余数为6 = 6 *1—-可以看出余数也是最大公约数的倍数 12/6——-商为2—–余数为0———–所以得到6为最大公约数

const gcd = (a, b) => {
  if (a === b) return a;
  let min = Math.min(a, b);
  let max = Math.max(a, b);
  if (min === 0) {
    return Math.max(a, b);
  }
  if (max % min === 0) return min;
  let temp;
  if (a < b) {
    temp = b % a;
  } else {
    temp = a % b;
  }

  return gcd(min, temp);
};

export default gcd;

最小小黄鸡

有N个小黄鸡,每P个可以合成一个银色小黄鸡,每Q个可以合成一个金色小黄鸡 请问通过合理的合成,能让所有鸡的最小数量是多少? 1<P<Q

这题目很简单,主要是要确定不能使用贪心算法,因为比如当11只小黄鸡的时候,如果使用贪心算法,就是1只金色的小黄鸡,4只小黄鸡,这明显是不合理的,因为如果是2只银色的小黄鸡和一只小黄鸡明显比使用贪心算法的小

// 有N个小黄鸡,每P个可以合成一个银色小黄鸡,每Q个可以合成一个金色小黄鸡
// 请问通过合理的合成,能让所有鸡的最小数量是多少?
// 1<P<Q

export default (n, p, q) => {
  let maxQnum = Math.ceil(n / q);
  let minNum = Infinity;

  for (let i = 0; i <= maxQnum; i++) {
    let maxPnum = Math.ceil((n - i * q) / p);
    for (let j = 0; j <= maxPnum; j++) {
      let chickenNum = n - (i * q + j * p);
      if (chickenNum >= 0) {
        minNum = Math.min(minNum, i + j + chickenNum);
      }
    }
  }
  return minNum;
};

单例模式