10个JavaScript测试问题和答案

74 阅读4分钟

下面的问题旨在具有挑战性和指导性。如果你确切地知道如何回答每一个问题,那很好,但如果你错了一些,并了解到你为什么错了,我认为那就更好了

如果你从测验中学到了什么,请在评论中告诉我。


问题1:IIFE,HOF,或两者都是

下面这段话说明了一个立即调用的函数表达式(IIFE),一个高阶函数(HOF),两者都是,还是都不是?

((fn, val) => {
  return fn(val);
})(console.log, 5);

答案和解释

答案是:都是IIFE和HOF

这个片段清楚地说明了一个IIFE,我们通过传递console.log5 来立即调用一个函数。此外,我们发现这是一个HOF,因为fn 是一个函数,而HOF被定义为任何以另一个函数为参数或返回一个函数的函数。


问题2:数组到对象的效率

ab 都是具有相同属性和值的对象。哪个创建的效率更高?

const arr = [1, 2, 3];

const a = arr.reduce((acc, el, i) => ({ ...acc, [el]: i }), {});

const b = {};
for (let i = 0; i < arr.length; i++) {
  b[arr[i]] = i;
}

答案和解释

答案:B

b 被设置时,b[arr[i]] 属性在每次迭代时被设置为当前索引。当a被设置时,传播语法(...)将在每次迭代时创建累积器对象(acc)的浅层拷贝,并额外设置新的属性。这种浅层拷贝比不执行浅层拷贝的成本更高;a 需要在实现结果之前构建2个中间对象,而b 不构建任何中间对象。因此,b ,被设置的效率更高。


问题3:蝙蝠侠对超人

考虑下面这个superheroMaker 函数。当我们传递以下两个输入时,什么会被记录下来?

const superheroMaker = (a) => {
  return a instanceof Function ? a() : a;
};

console.log(superheroMaker(() => 'Batman'));
console.log(superheroMaker('Superman'));

答案和解释

答案:"蝙蝠侠" "超人"

当把() => 'Batman' 传给superheroMakeraFunction 的一个实例。因此,该函数被调用,返回字符串"Batman" 。当把"Superman" 传给superheroMaker时,a 不是Function 的实例,因此只是返回字符串"Superman" 。因此,输出是"Batman""Superman"


问题4:对象键,对象值

考虑下面这个对象。

const obj = {
  1: 1,
  2: 2,
  3: 3,
};

Object.keys 是否等于Object.values

console.log(Object.keys(obj) == Object.values(obj));

答案和解释

答案:假

在这种情况下,Object.keys 将键转换为字符串["1", "2", "3"]Object.values 得到[1, 2, 3] 。即使数值变成了相同的类型,这两个数组在内存中都是不同的对象,所以平等比较将返回false 。在这里你会看到很多问答题,钻研对象和数组比较的概念!


问题5:基本递归

考虑下面这个递归函数。如果我们把字符串"Hello World" ,那么什么会被记录下来?

const myFunc = (str) => {
  if (str.length > 1) {
    return myFunc(str.slice(1));
  }

  return str;
};

console.log(myFunc('Hello world'));

答案和解释

回答:"第一次调用该函数时,会记录什么? "d"

我们第一次调用这个函数时,str.length 大于1("Hello World" 是11个字符),所以我们返回在str.slice(1) 上调用的同一个函数,也就是字符串"ello World" 。我们重复这个过程,直到字符串只有一个字符:字符"d" ,它被返回到最初调用的myFunc 。然后我们记录这个字符。


问题6:函数的平等性

当我们测试以下相等的情况时,什么会被记录下来?

const a = (c) => c;
const b = (c) => c;

console.log(a == b);
console.log(a(7) === b(7));

答案和解释

答案:false true

在第一个测试中,ab 是内存中不同的对象;每个函数定义中的参数和返回值都是相同的,这并不重要。因此,a 不等于b 。在第二个测试中,a(7) 返回数字7b(7) 返回数字7 。这些原始类型严格来说是相互相等的。

在这种情况下,平等 (==) 与同一 (===) 的比较运算符并不重要;没有类型的强制力会影响结果。


问题7:对象属性的平等性

a 和 是具有相同的 属性的不同对象。这些属性是否严格地彼此相等?b firstName

const a = {
  firstName: 'Bill',
};

const b = {
  firstName: 'Bill',
};

console.log(a.firstName === b.firstName);

答案和解释

答案:真

答案是肯定的,它们是。a.firstName 是字符串值"Bill"b.firstName 是字符串值"Bill" 。两个相同的字符串总是相等的。


问题8:函数的语法

假设myFunc 是一个函数,val1 是一个变量,而val2 是一个变量。下面的语法在JavaScript中是否允许?

myFunc(val1)(val2);

答案和解释

答案:是

这是一个高阶函数的常见模式。如果myFunc(val1) 返回一个函数,那么该函数将被调用,并以val2 作为参数。这里有一个实际的例子,你可以试试。

const timesTable = (num1) => {
  return (num2) => {
    return num1 * num2;
  };
};

console.log(timesTable(4)(5));
// 20

问题9:对象属性突变

考虑下面的对象ab 。什么会被记录下来?

const a = { firstName: 'Joe' };
const b = a;
b.firstName = 'Pete';
console.log(a);

答案和解释

解答:当我们在第二部分中设置,就会记录下什么? { firstName: 'Pete' }

当我们在第二行设置b = aba 指向内存中的同一个对象。firstName 因此,改变b 上的属性将改变内存中唯一对象的firstName 属性,所以a.firstName 将反映这一变化。


问题10:数组中最大的数字

下面的函数是否总是返回数组中最大的数字?

function greatestNumberInArray(arr) {
  let greatest = 0;
  for (let i = 0; i < arr.length; i++) {
    if (greatest < arr[i]) {
      greatest = arr[i];
    }
  }
  return greatest;
}

答案和解释

答案:不会

对于至少有一个值是0 或更大的数组,这个函数可以正常工作;但是,如果所有的数字都低于0 ,它就会失败。这是因为最大变量从0 开始,即使0 大于所有数组元素。