当前位置: 首页 > 科技观察

7个简单但棘手的JavaScript面试问题

时间:2023-03-13 08:29:38 科技观察

如果你是一名高级开发人员,其工作涉及JavaScript,那么在编码面试中你很有可能会被问到棘手的问题。遵循这个建议:“熟能生巧。”深入并定期学习JavaScript将提高您的编码技能,并可以提高您的面试技巧。在本文中,你会发现7个乍看简单实则棘手的JavaScript面试题。虽然这些问题乍一看似乎是随机的,但它们试图与JavaScript的重要概念挂钩。所以你最好在下次面试前练习一下!1.UnexpectedglobalvariableQuestion以下代码段用于计算typeofa和typeofb:functionfoo(){leta=b=0;a++;returna;}foo();typeofa;//=>???typeofb;//=>???Answer我们看第2行:leta=b=0,这条语句声明了一个局部变量a,然而,它也声明了一个全局变量b。变量b未在foo()作用域或全局作用域中声明。所以JavaScript将b=0表达式解释为window.b=0。换句话说,b是一个意外创建的全局变量。在浏览器中,上面的代码片段等同于:functionfoo(){leta;window.b=0;a=window.b;a++;returna;}foo();typeofa;//=>'undefined'typeofwindow。b;//=>'number'typeofa等于'undefined',变量a存在于foo()的作用域内,不在外层作用域使用。由于b是一个值为0的全局变量,因此b的类型的值为“number”。2、数组的length属性Questionclothes[0]的值是多少?constclothes=['jacket','t-shirt'];clothes.length=0;clothes[0];//=>???Answer数组对象length属性有一个特殊的行为:减少值的副作用length属性的作用是删除自己的数组元素。因此,当JavaScript执行clothes.length=0时,所有元素都会被移除。clothes[0]等于undefined因为clothes数组已经清空了。3.EagleEyetestQuestionnumbers数组的内容是什么?constlength=4;constnumbers=[];for(vari=0;i???让我们仔细看看分号;出现在左大括号{内:这个分号很容易被忽略,它会创建一个空语句。空语句是什么都不做的空语句。for()在空语句上迭代4次(什么都不做),忽略实际将项目推入数组的块:{number.push(i+1);}。上面的代码等同于:constlength=4;constnumbers=[];vari;for(i=0;i[5]for()将i变量递增到4,然后JavaScript一次进入块{number.push(i+1);},将4+1推入numbers数组。因此,数字数组的内容是[5]。4、自动分号插入QuestionArrayFromValue()返回什么值?functionarrayFromValue(item){return[item];}arrayFromValue(10);//=>???Answer很容易漏掉return关键字和[item]表达式之间的换行符。这个换行符让JavaScript自动在return和[item]表达式之间插入一个分号。这是等效的代码,在返回后插入分号:functionarrayFromValue(item){return;[item];}arrayFromValue(10);//=>undefinedreturn;在函数内部使其返回未定义。所以arrayFromValue(10)的值是未定义的。5.经典问题:Trickyclosure问题下面的代码会向控制台输出什么?leti;for(i=0;i<3;i++){constlog=()=>{console.log(i);}setTimeout(log,100);}Answer如果你以前从未听说过这个棘手的问题问题,您可能回答了0、1和2:这是错误的。当我第一次尝试解决它时,这也是我的答案!此代码片段的执行分为两个阶段。阶段1for()重复3次,在每次迭代期间,都会创建一个新函数log()来捕获变量i。然后setTimout()被调度执行log()。当for()循环完成时,变量i的值为3。log()是一个闭包,它捕获在for()循环的外部范围内定义的变量i。重要的是要注意闭包可以词法捕获i变量。阶段2第二阶段发生在100毫秒后:setTimeout()调用计划的log()3次。log()读取变量i的当前值为3,并将3记录到控制台。这就是控制台输出为3、3和3的原因。如果您在理解闭包方面遇到困难,我建议阅读“JavaScript闭包的简单解释”。您知道如何将片段记录为0、1和2吗?请在下面的评论中写下您的解决方案!6.这个等式在浮点运算题中的结果是什么?0.1+0.2===0.3//=>???回答首先我们来看0.1+0.2的值:0.1+0.2;//=>0.300000000000000040.1和0.2不完全是0.3,而是略高于0.3.由于浮点数以二进制编码,因此添加浮点数等操作可能会导致舍入错误。简而言之,浮点数的直接比较并不准确。所以0.1+0.2===0.3是错误的。点击0.30000000000000004.com了解更多信息。7.变量提升问题如果在声明之前访问myVar和myConst会发生什么情况?myVar;//=>???myConst;//=>???varmyVar='value';constmyConst=3.14;回答提升和临时死区是影响JavaScript变量生命周期的两个重要概念。在其声明之前访问myVar的结果是未定义的。提升的var变量在初始化之前具有未定义的值。但是,在声明行之前访问myConst会引发ReferenceError。const变量处于临时死区,直到声明行constmyConst=3.14。8.最后……你可以认为某些问题对面试毫无用处。我也有同感,尤其是关于鹰眼测试。然而,他们可能会被问到。无论如何,这些问题中的许多问题都可以真正评估您的JavaScript熟练程度,例如棘手的闭包。如果您在阅读一篇文章时遇到一些困难,这很好地表明了您接下来要学习的内容!