前端面试题JavaScript篇——2022-09-07
每日3题
25 以下代码执行后,控制台中的输出内容为?
let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
26 变量 a 会被 GC 吗,为什么?
function test(){
var a = 1;
return function(){
eval("")
}
}
test();
27 以下代码执行后,控制台中的输出内容为?
console.log([2, 1, 0].reduce(Math.pow));
console.log([].reduce(Math.pow));
公众号【今天也要写bug】, 获取更多前端面试题答案与解析 25
// 答案:true
// Symbol.toPrimitive 是一个内置的 Symbol 值,
// 它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时
// 如果该函数存在,则会调用此函数。
let a = {
i: 0,
[Symbol.toPrimitive]: () => ++a.i,
};
console.log(a == 1 && a == 2 && a == 3);
// == 会触发类型转换,而且我们定义了 Symbol.toPrimitive 方法
// 所以 a == 1 触发该方法返回 1,并且 a.i 变为 1,所以 a == 1 为 true,
// 同理 a == 2 和 a == 3 均为 true
26
// 答案:不会
// 考察 eval 函数
// 因为 eval 会欺骗词法作用域,例如 function test(){eval("var a=1")},创建一个 a 变量
// JS 引擎不确定 eval 是否对 a 进行了引用,所以为了保险,不对其进行优化。
// 相似地,try catch 和 with 也会有同样的问题
// 不建议使用 eval 和 with
function test() {
var a = 1;
return function () {
eval("");
};
}test();
27
// 答案:1 报错
// 考察 reduce 方法的使用
// reduce 接受两个参数:回调函数和初始值
// 若不提供初始值,则以数组第一个元素作为初始值,并且回调函数从数组第二个元素开始调用
// 提供初始值,则回调从数组第一个元素开始调用
// 回调函数接受4个参数:previousValue、currentValue、currentIndex、array(即遍历的数组)
console.log([2, 1, 0].reduce(Math.pow));
// 执行步骤如下:初始值:2
// 第 1 次调用回调的入参:previousValue=https://www.it610.com/article/2,currentValue=1,Math.pow 只接受2个参数,结果 2^1=2
// 第 2 次调用回调的入参:previousValue=2,currentValue=0,Math.pow 只接受2个参数,结果 2^0=1
console.log([].reduce(Math.pow));
// 如果数组为空并且没有提供初始值,reduce 直接抛出错误
推荐阅读
- 写在20岁前夕
- 钛极客|扩大在华环保创新投入,耐克中国物流中心启动风电项目建设 | 科技前线
- 面试题24-找到链表中环的入口
- 命运前再次感受人类的渺小
- 为什么你还没等到眼瞎的那个人
- 眼前苟且,诗与远方
- 前端|对于女生来说,软件测试和前端,学哪一个更好啊
- 投稿|洋河股份走出迷雾,“白银时代”前途未卜
- Vben|Vben Admin 源码学习:状态管理-角色权限
- 社招前端高频面试题