10 个具有挑战性的 JavaScript 测验问题和答案问题 1:IIFE、HOF 或两者问题 2:数组到对象的效率问题 3:蝙蝠侠大战超人问题 4:对象键、对象值问题 5:基本递归问题 6:函数相等性问题 7:对象属性相等性问题 8:函数语法问题 9:对象属性变异问题 10:数组中的最大数字

2025-05-25

10 个具有挑战性的 JavaScript 测验问题和答案

问题 1:IIFE、HOF 还是两者兼而有之

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

问题3:蝙蝠侠大战超人

问题 4:对象键、对象值

问题 5:基本递归

问题 6:函数相等性

问题 7:对象属性相等性

问题 8:函数函数语法

问题 9:对象属性变异

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

以下问题旨在挑战性和启发性。如果你知道如何准确回答每一个问题,那当然很好;但如果你能答错一些问题,并了解错误的原因,那就更好了!

如果您从测验中学到任何东西,请在评论中告诉我!


如果您喜欢这个测验,请给它一个💓、🦄或🔖并考虑:


问题 1:IIFE、HOF 还是两者兼而有之

以下代码片段是否说明了立即调用函数表达式(IIFE)、高阶函数(HOF)、两者兼有,还是两者都不是?

((fn, val) => {
  return fn(val);
})(console.log, 5);
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案: IIFE 和 HOF

这段代码清晰地展现了 IIFE 的用法,我们通过传递console.log5给一个函数来立即调用它。此外,我们发现这本身就是一个 HOF fn,一个函数本身就是一个 HOF,而 HOF 的定义是:任何接受另一个函数作为参数或返回一个函数的函数。


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

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

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;
}
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案: b

b设置时,b[arr[i]]每次迭代时都会将属性设置为当前索引。设置 a 时,扩展语法 ( ...) 会在每次迭代时创建累加器对象的浅拷贝 ( acc),并额外设置新属性。这种浅拷贝比不执行浅拷贝的开销更大;a它需要构造两个中间对象才能获得结果,而不b需要构造任何中间对象。因此,b设置 的效率更高。


问题3:蝙蝠侠大战超人

考虑以下superheroMaker函数。当我们传递以下两个输入时会输出什么?

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

console.log(superheroMaker(() => 'Batman'));
console.log(superheroMaker('Superman'));
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案: “蝙蝠侠”“超人”

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


如果您喜欢这个测验,请给它一个💓、🦄或🔖并考虑:


问题 4:对象键、对象值

考虑以下对象。

const obj = {
  1: 1,
  2: 2,
  3: 3
};
Enter fullscreen mode Exit fullscreen mode

等于Object.keysObject.values

console.log(Object.keys(obj) == Object.values(obj));
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案:错误

在本例中,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'));
Enter fullscreen mode Exit fullscreen mode

答案与解释

回答: "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));
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案:假 真

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

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


问题 7:对象属性相等性

ab是具有相同firstName属性的不同对象。这些属性严格相等吗?

const a = {
  firstName: 'Bill'
};

const b = {
  firstName: 'Bill'
};

console.log(a.firstName === b.firstName);
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案:正确

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


问题 8:函数函数语法

假设myFunc是一个函数,val1是一个变量,val2是一个变量。JavaScript 中允许以下语法吗?

myFunc(val1)(val2);
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案:是的

这是高阶函数的常见模式。如果myFunc(val1)返回一个函数,则该函数将作为参数被调用val2。以下是一个实际示例,您可以尝试一下:

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

console.log(timesTable(4)(5));
// 20
Enter fullscreen mode Exit fullscreen mode

问题 9:对象属性变异

考虑以下对象ab会记录什么?

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

答案与解释

回答: { firstName: 'Pete' }

当我们b = a在第二行设置 时,ba指向内存中的同一个对象。因此,更改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;
}
Enter fullscreen mode Exit fullscreen mode

答案与解释

答案:

对于至少有一个值0大于或等于的数组,此函数可以正常工作;但是,如果所有数字都小于,则函数将失败。这是因为即使大于所有数组元素,0最大变量也从开始。00


如果您喜欢这个测验,请给它一个💓、🦄或🔖并考虑:


想要更多测验题目?前往https://quiz.typeofnan.dev查看72 道JavaScript 测验题目!

文章来源:https://dev.to/nas5w/10-challenging-javascript-quiz-questions-and-answers-2a2b
PREV
10 个 JavaScript 测验问题和答案,以提高您的技能问题 1:数组排序比较问题 2:一组对象问题 3:深度对象可变性问题 4:原型继承问题 5:Promise.all 解析顺序问题 6:减少数学问题 7:短路通知问题 8:扩展和重命名问题 9:数组方法绑定问题 10:设置唯一性和排序 JavaScript 问题
NEXT
Web 1.0、Web 2.0 和 Web3 详解