7道简单的 JavaScript 面试题

1. 意外的全局变量

问题

在以下代码中,typeof atypeof b的值分别是什么:

function foo() {
  let a = b = 0;
  a++;
  return a;
}

foo();
typeof a; // => ??? typeof b; // => ???
 

答案

让我们仔细看看第2行:let a = b = 0。这个语句确实声明了一个局部变量a。但是,它确实声明了一个全局变量b

foo()作用域或全局作用域中都没有声明变量 b ”。因此JavaScript将表达式 b = 0 解释为 window.b = 0

b是一个偶然创建的全局变量。

在浏览器中,上述代码片段相当于:

function foo() {
  let a;  window.b = 0;  a = window.b;  a++;
  return a;
}

foo();
typeof a;        // => ‘undefined‘
typeof window.b; // => ‘number‘

typeof a是 ‘undefined‘。变量a仅在 foo()范围内声明,在外部范围内不可用。

typeof b等于‘number‘b是一个值为 0的全局变量。

2. 数组 length 属性

问题

clothes[0] 的值是什么:

const clothes = [‘jacket‘, ‘t-shirt‘];
clothes.length = 0;

clothes[0]; // => ???

答案

数组对象的 length 属性有一个 特殊的行为:

减少length属性的值有一个副作用,就是会删除索引位于新旧长度值之间的元素。

因为 length的这种行为,当JavaScript执行clothes.length = 0 时,数组 clothes 中的所有项都被删除了。

clothes[0] 是undefined,因为 clothes 数组被清空了。

3. 鹰眼测试

问题

numbers 数组的内容是什么:

const length = 4;
const numbers = [];
for (var i = 0; i < length; i++);{
  numbers.push(i + 1);
}

numbers; // => ???

答案

让我们仔细看看出现在左花括号{前面的分号; :

很容易忽略这个分号,而它创建了一个空语句。空语句是不做任何事情的语句。

for() 在空语句(什么也不做)上循环了 4 次,忽略了实际上往数组里添加元素的代码块{ numbers.push(i + 1); }

上述代码等同于:

const length = 4;
const numbers = [];
var i;
for (i = 0; i < length; i++) {
  // does nothing
}
{
  // a simple block
  numbers.push(i + 1);
}

numbers; // => [5]

for()递增变量i直到4。然后JavaScript 进入代码块 { numbers.push(i + 1); },将4 + 1 添加 到numbers数组中。

这样 numbers 就是 [5].

4. 自动插入分号

问题

arrayFromValue() 返回什么值?

function arrayFromValue(item) {
  return
    [items];
}

arrayFromValue(10); // => ???

答案

很容易忽略return关键字和[items]表达式之间的换行。

换行使JavaScript自动在return[items]表达式之间插入一个分号。

这里有一段等价的代码,它在return后插入分号:

function arrayFromValue(item) {
  return;  [items];
}

arrayFromValue(10); // => undefined

函数中的 return; 导致它返回 undefined

因此 arrayFromValue(10) 的值是 undefined

5. 经典问题:坑爹的闭包

问题

以下脚本将会在控制台输出什么:

let i;
for (i = 0; i < 3; i++) {
  const log = () => {
    console.log(i);  }
  setTimeout(log, 100);
}

答案

如果你之前没有听说过这个棘手的问题,你的答案很可能是01 和 2,这是不正确的。当我第一次尝试解答它时,我的答案也是这样!

执行这个代码段包含两个步骤。 步骤 1

  1. for()迭代3次。在每次迭代过程中,都会创建一个新的函数log(),它捕获变量 i。然后setTimout()执行log()
  2. for()循环完成时,i变量的值为3

log()是一个捕获变量 i 的闭包,它在for()循环的外部作用域定义。重要的是要理解闭包从词法上捕获了变量i 。 步骤 2

第2步在 100 毫秒后发生:

setTimeout()调用了队列中的3个log() 回调。log() 读取变量 i当前值,即3,并记录到控制台3

这就是为什么控制台输出33 和3

6. 浮点数问题

问题

等号判断的结果是什么?

0.1 + 0.2 === 0.3 // => ???

答案

首先,我们看看0.1 + 0.2 的值:

0.1 + 0.2; // => 0.30000000000000004

0.1 和 0.2 的和 不完全等于  0.3,而是略大于 0.3

由于浮点数在二进制中的编码机制,像浮点数的加法这样的操作会受到舍入误差的影响。

简单地说,直接比较浮点数是不精确的。

因此 0.1 + 0.2 === 0.3 是 false.

7. 变量提升

问题

如果在声明之前访问myVarmyConst会发生什么?

myVar;   // => ???myConst; // => ???
var myVar = ‘value‘;
const myConst = 3.14;

答案

变量提升和暂时性死区是影响JavaScript变量生命周期的两个重要概念。

在声明之前访问 myVar 结果为undefined。一个被提升的var变量,在它的初始化之前,有一个 undefined的值。

但是,在声明之前访问myConst会抛出 ReferenceError。在声明行const myConst = 3.14之前,const 变量处于暂时死区。

作者:KaysonLi
链接:https://juejin.im/post/5dbe818a6fb9a0203c34e4bb

原文地址:https://www.cnblogs.com/cyh-blogs/p/11806105.html

时间: 2024-08-07 16:01:20

7道简单的 JavaScript 面试题的相关文章

分享几道经典的javascript面试题

这几道题目还是有一点意思的,大家可以研究一番,对自己的技能提升绝对有帮助. 1.调用过程中输出的内容是什么 function fun(n, o) { console.log(o); return { fun : function(m) { return fun(m, n); } } } var a = fun(0); a.fun(1); a.fun(2); a.fun(3); var b = fun(0).fun(1).fun(2).fun(3); var c = fun(0).fun(1);

Javascript面试题解析

Javascript的一些面试题让很多同学感到头疼,下面就根据兄弟连教育(www.lampbrother.net)毕业学员面试遇到的面试题,给大家做一个简单的分享,希望对初入职场的你们有一些帮助:Javascript面试题解析. 第一题 /* 解析: + 优先级大于 ? 此题等价于: 'Value is true' ? 'Something' : 'Nothing' 所以结果是:'Something' */ var val = 'smtg'; console.log('Value is ' +

javascript 面试题

面试题: 1.下面代码运行结果 var bl = false; $.ajax(url, { //... success: function(){ bl = true; } }); while ( !bl ) { alert( bl ); } alert( bl ); // 结果大家自己去想,这道题是面试官临时写的,简单直接,很好的考察你是否理解javascript中的运行机制,很棒的一道面试题 2.扩展Array原型,编写一个去除数组重复项的方法 // 算法一,两层循环,性能差 Array.pr

100多道经典的JAVA面试题及答案解析

面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码的可理解性. 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会逐个分析这些特性. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在Java当中,有3种修饰符:public,private和protected.每一种修

【转载】20道常见初级Java面试题

这篇文章的内容很不错.学到了很多东西.值得仔细琢磨. http://mt.sohu.com/20160831/n466900239.shtml 20道常见初级Java面试题,入职者必备! 广州华信智原2016-08-31 09:30:37阅读(564)评论(0) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 大家都应该知道Java是目前最火的计算机语言之一,连续几年蝉联最受程序员欢迎的计算机语言榜首,因此每年新入职Java程序员也数不胜数.究

松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸

什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石! 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry ,我们不合适! 今天松哥就给大家整理了 15 道高频 Spring Boot 面试题,希望能够帮助到刚刚走出校门的小伙伴以及准备寻找新的工作机会的小伙伴. 1.什么是 Spring Bo

15 道 Spring Boot 高频面试题,看完直接当面霸【入门实用】

前言 本文转自松哥(网名:江南一点雨)的一篇实用入门文章,写的挺好的,希望对各位有所帮助. 什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石! 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面试,无论多小的公司 or 项目,都要跟你扯一扯 Spring Boot,扯一扯微服务,不会?没用过? Sorry ,我们不合适! 今天松哥就给大家整理了 15 道高频 Spring Boot 面试题,希望能够

淘宝API学习之道:简单介绍淘宝API功能接口作用

前一阵子按照上级指示,根据淘宝API开发符合自已应用的系统,比如批量上传,批量修改名称,价格等功能什么的,在此就将我的开发历程写一写,为自己前段时间的工作做个总结. 淘宝开发平台(http://www.taobao.com/theme/tao_source/#prev),向第三方开发者提供API接口和相关开发环境的平台,使开发者可以开发属于自已的系统应用于淘宝店铺和阿里上,同时,运用SAAS模式,开发者开发的系统也可以在该平台上进行销售. 为进行开发做的准备,得在开发同盟网站注册帐号(http:

几道坑人的PHP面试题 试试看看你会不会也中招

这篇文章主要介绍了几道坑人的PHP面试题,试试看看你会不会也中招,这些题目都用了一些障眼法,需要你有一双火眼金睛哦,需要的朋友可以参考下 这几道题是在德问上看到的,感觉挺有意思,拿来给大家分享其中的陷阱,看看你会不会掉入其中. 第一题 $arr = array(0=>1,"aa"=>2, 3, 4); foreach($arr as $key=>$val){    print($key == "aa" ? 5 : $val);} 输出结果是多少?如