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);
答案与解释
答案: IIFE 和 HOF
这段代码清晰地展现了 IIFE 的用法,我们通过传递console.log
和5
给一个函数来立即调用它。此外,我们发现这本身就是一个 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;
}
答案与解释
答案: 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'));
答案与解释
答案: “蝙蝠侠”“超人”
当传递() => 'Batman'
给 时superheroMaker
,a
是 的一个实例Function
。因此,该函数被调用,返回字符串"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));
答案与解释
答案:假 真
在第一个测试中,a
和b
是内存中的不同对象;即使每个函数定义中的参数和返回值相同,也无所谓。因此,a
不等于b
。在第二个测试中,a(7)
返回 数字7
,并b(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:对象属性变异
考虑以下对象a
。b
会记录什么?
const a = { firstName: 'Joe' };
const b = a;
b.firstName = 'Pete';
console.log(a);
答案与解释
回答: { firstName: 'Pete' }
当我们b = a
在第二行设置 时,b
和a
指向内存中的同一个对象。因此,更改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
如果您喜欢这个测验,请给它一个💓、🦄或🔖并考虑:
想要更多测验题目?前往https://quiz.typeofnan.dev查看72 道JavaScript 测验题目!
文章来源:https://dev.to/nas5w/10-challenging-javascript-quiz-questions-and-answers-2a2b