首页 > 其他分享 >【面试题】 经典但依然超难做的 前端面试题 (值得收藏)

【面试题】 经典但依然超难做的 前端面试题 (值得收藏)

时间:2022-11-29 22:39:12浏览次数:32  
标签:面试题 console log 作用域 前端 arr 超难 题库 sum


【面试题】 经典但依然超难做的 前端面试题 (值得收藏)_块级作用域

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

最近我的一些学员比较膨胀,认为已经精通了 HTML、CSS、JavaScript 三剑客,老是催我进入框架学习和项目实战。

为了让他们意识到自身的不足,我搬出了几道经典前端面试题,毫无例外,全员覆灭。

1. a 应该等于什么可以让下面的 console.log 输出 true?

const a = void 0;

console.log(a == 1 && a == 2 && a == 3);// true

2. 实现 sum 函数,参数为数组,求该数组所有项之和,不允许使用循环和数组方法

const arr = [1, 2, 3, 4, 5]

function sum (arr) {
// TODO:
}

sum(arr);// 15

3.请说出如下代码的输出

var x;
let y;
var z;

if(true) {
let z;
x();
console.log(z);
x = 1;
function x(z) {
z = 4;
}
function y(z) {
z = 3;
}
z = () => {}
y(z);
console.log(z);
x = 2;
console.log(x);
}

console.log(x);
console.log(y);
console.log(z);

题解

1

这一题是在考察隐式类型转换。

当两个类型不一样的变量进行双等于比较时,会调用它的 valueOf 方法,并使用 valueOf 方法返回的值进行比较。

我们只需要定义一个初始为 1 的属性,每次调用时让它增加 1 就可以了。

var a = {
n: 1,
valueOf() {
return this.n++;
}
}

2

这一题是在考察递归。

遍历一个数组中的所有子项,能用到的方法只有循环和递归。

首选需要分析递归公式。

假设有个内部函数 _sum,该函数接受 i 作为参数,可以计算出从数组第 i 位到数组末尾之和。

基于这个函数,我们还可以推演出一个递推公式:_sum(i) = arr[i] + _sum(i + 1)。

最后再来分析边缘情况,当参数 i 大于等于数组的 length 之后,就无法求和了,所以这时返回 0。

function sum(arr) {
function _sum(i) {
if(i >= arr.length) return 0
return arr[i] + _sum(++i)
}
return _sum(0)
}

3

这一题是在考察作用域。

但是题出得确实有点丧心病狂。

第 8 行输出 undefined。这个比较简单,因为调用 x 时没有传递参数,所以 x 函数中改变的 z 是 x 的参数,和外层的 z 无关。

第 18 行输出 ()=>{}。因为 15 行将 z 设置成了箭头函数,16 行调用了 y,但是在 y 中修改的是函数作用域内的参数,而不是外层的 z。

第 20 行输出 2,毫无疑问。

第 23 行输出 1,这就有点难以理解了。第 9 行代码会把外层的 x 设置为 1,但是第 10 行代码会在 if 块级作用域中创建一个函数 x。在此之后 x 的访问,都是在访问块级作用域中的 x,和外部的 x 无关。

第 24 行输出 undefined,因为外层的 y 是通过 let 声明,会形成块级作用域,if 中的函数 y 不会提升。

第 25 行输出 undefined,因为 if 块中有使用 let 声明 z,所以 z 存在块级作用域,不会起到变量提升的效果。

说实话这些题目看上去头很刁难人,但确实又是在考察基础的编程语言能力。不乏一些老手程序员也在这些「初级面试题」上面翻了跟头。

你答对了几道题呢?

 

给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

标签:面试题,console,log,作用域,前端,arr,超难,题库,sum
From: https://blog.51cto.com/u_14627797/5897161

相关文章

  • 新一代前端应该使用的“开发套餐“
    前言众所周知,前端界,框架库一直处在学不过来,大佬们还一直在开发的 黄金时代(卷王时代,bushi),在这个大卷王时代,我们有必要浅浅了解下这些新果实,不做上个时代的残党!......
  • 有了这些前端css工具,我下班都更早了!
    你是不是还在手写按钮、文本字体等简单样式?这些工具就可以帮你解决以上种种难题,从此下班你将快人一步,赶快用起来吧!1、前端技术导航大全推荐:★★★★★地址:​​前端技术导航......
  • 程序面试题——C实现
    平台:win10x64+VC6.02019/5/221.合并三个有序的链表链表节点定义structnode{   intval;   structnode*next;};structnode*merge_3(形参由你定义){   //......
  • 【面试题】 ES6知识点详细解析
    给大家推荐一个实用面试题库1、前端面试题库(面试必备)      推荐:★★★★★地址:前端面试题库 ......
  • 【面试题】吃透Promise?先实现一个再说(包含所有方法)
    前言在网上阅读过很多关于实现promise的文章,大致分为2类,一种是基于promiseA+规范,一种是基于ECMA规范和v8引擎下的promise,对于A+规范可以快速让我们理解promise的核心,但对些......
  • 【面试题】 做了一份前端面试复习计划,保熟~
     给大家推荐一个实用面试题库1、前端面试题库(面试必备)      推荐:★★★★★地址:前端面试题库一、简历简历在找工作过程中是非常非常重要的,无论你是什么途径......
  • mac前端切换版本
    1.需要在电脑上安装nvm。2.查看电脑上安装的node的版本:nvmls。3.使用某个版本nvmuse---,TRANSLATEwithxEnglishArabicHebrewPolishBulgarian......
  • Servlet面试题合集
    servlet的生命周期在创建servlet对象时,通过调用.init()方法进行初始化通过service()方法来接收客户端的请求.根据请求方式的不同转发给对应的doGet()或doPost()方法停止......
  • Python后端开发(主Django)面试题
    最近两个后端同事离职了,帮忙面试了些后端开发的实习生,虽然有过一些后端经验,但我不是主要写后端的,复习了下Django也稍微准备了一些主要是Django相关的面试题,数据库相关部分额......
  • 前端一键复制,隐藏元素亦可用
    varrange=document.createRange();range.selectNode(document.querySelector('#元素id'));varselection=window.getSelection(......