百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

通过 20 个棘手的ES6面试问题来提高咱们的 JS 技能

cac55 2024-11-12 09:40 12 浏览 0 评论

作者:Alex
译者:前端小智
来源:dev.to


上个月自己花了 1300 买了阿里的服务器来学习 node 及对应的框架,在 11号(今天最后一天了) 之前它们有做活动,1300 的配置现在一年只要 86 元,三年只要229元,真心觉得很划算了,可以点击阅读原文进行参与。

今天最后一天了,有需要可以通过下面连接或者识别二维码进行查看:

https://www.aliyun.com/1111/2019/group-buying-share?ptCode=FBEDBE5CCBE365B176BB470C64C499DD647C88CF896EF535&userCode=pxuujn3r&share_source=copy_link


ECMAScript 6(以下简称ES6)是 JS 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JS 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。接下来咱们来看看 20 道棘手的面试题,通过做题,顺带提升一下咱们的 JS 的技能。

问题1:可以解释一下 `ES5` 和`ES6`的区别吗?

主题: JavaScript
难度: ???

ECMAScript 5 (ES5):ECMAScript 的第五版,于2009年标准化,该标准已在所有现代浏览器中完全支持。

ECMAScript 6 (ES6)/ ECMAScript 2015 (ES2015):ECMAscript 第 6 版,2015 年标准化。这个标准已经在大多数现代浏览器中部分实现。

以下是ES5和ES6之间的一些主要区别:

箭头函数和字符串插值

也可以这样写:

const:const 表示无法修改变量的原始值。需要注意的是,const表示对值的常量引用,咱们可以改变被引用的对象的属性值,但不能改变引用本身。

块作用域:ES6 中 let, const 会创建块级作用域,不会像 var 声明变量一样会被提升。

默认参数:默认参数使咱们可以使用默认值初始化函数。当参数省略或 undefined 时使用默认参数值。

类定义与继承

ES6 引入了对类(class关键字)、构造函数(constructor关键字)和 extend 关键字(用于继承)的语言支持。

for-of 运算符

for...of 语句创建一个遍历可迭代对象的循环。

展开操作符

Promises: Promises 提供了一种机制来处理异步操作的结果和错误。可以使用回调来完成相同的事情,但是Promises 通过方法链接和简洁的错误处理来提高可读性。

模块导出

和导入

问题 2:什么是 IIFE (立即调用的函数表达式)

主题: JavaScript
难度: ???

IIFE是一个立即调用的函数表达式,它在创建后立即执行

常常使用此模式来避免污染全局命名空间,因为在IIFE中使用的所有变量(与任何其他普通函数一样)在其作用域之外都是不可见的。

问题 3:何时在 ES6 中使用箭头函数?

主题: JavaScript
难度: ???

以下是一些经验分享:

  • 在全局作用域内和Object.prototype属性中使用 function 。
  • 为对象构造函数使用 class。
  • 其它情况使用箭头函数。

为啥大多数情况都使用箭头函数

  • 作用域安全性:当箭头函数被一致使用时,所有东西都保证使用与根对象相同的thisObject。如果一个标准函数回调与一堆箭头函数混合在一起,那么作用域就有可能变得混乱。
  • 紧凑性:箭头函数更容易读写。
  • 清晰度:使用箭头函数可明确知道当前 this 指向。

问题 4:将 Symbol 引入ES6 的目的是什么?

主题: JavaScript
难度: ???

Symbol 是一种新的、特殊的对象,可以用作对象中惟一的属性名。使用 Symbol 替换string 可以避免不同的模块属性的冲突。还可以将Symbol设置为私有,以便尚无直接访问Symbol权限的任何人都不能访问它们的属性。

Symbol 是JS新的基本数据类型。与number、string和boolean 原始类型一样,Symbol 也有一个用于创建它们的函数。与其他原始类型不同,Symbol没有字面量语法。创建它们的唯一方法是使用以下方法中的Symbol构造函数

let symbol = Symbol(); 

问题 5: 在 ES6 中使用展开(spread)语法有什么好处? 它与剩余(rest)语法有什么不同?

主题: JavaScript
难度: ???

ES6 的展开语法在以函数形式进行编码时非常有用,因为咱们可以轻松地创建数组或对象的副本,而无需求助于Object.create,slice或库函数。Redux 和rx.js项目中经常使用此特性。

ES6 的 rest 语法提供了一种捷径,其中包括要传递给函数的任意数量的参数。

就像展开语法的逆过程一样,它将数据放入并填充到数组中而不是展开数组,并且它在函数变量以及数组和对象解构分中也经常用到。

问题 6: ES6 类和 ES5 函数构造函数有什么区别?

主题: JavaScript
难度: ???

对于简单的构造函数,它们看起来非常相似。

构造函数的主要区别在于使用继承。如果咱们创建一个继承Person类的Student子类并添加一个studentId字段,以下是两种方式的使用:

在 ES5 中使用继承要复杂得多,而且 ES6 版本更容易理解和记住。

问题 7: `.call` 和 `.apply` 区别是啥?

主题: JavaScript
难度: ???

.call和.apply均用于调用函数,并且第一个参数将用作函数中this的值。但是,.call将逗号分隔的参数作为下一个参数,而.apply将参数数组作为下一个参数。简单记忆法:C用于call和逗号分隔,A用于apply和参数数组。

问题 8: 为什么要使用 ES6 类?

主题: JavaScript
难度: ???

选择使用类的一些原因:

  • 语法更简单,更不容易出错。
  • 使用新语法比使用旧语法更容易(而且更不易出错)地设置继承层次结构。
  • class可以避免构造函数中使用new的常见错误(如果构造函数不是有效的对象,则使构造函数抛出异常)。
  • 用新语法调用父原型方法的版本比旧语法要简单得多,用super.method()代替ParentConstructor.prototype.method.call(this) 或Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this)

考虑下面代码:

使用 ES6 实现上述功能:

问题 9: 在 JS 中定义枚举的首选语法是什么

主题: JavaScript
难度: ???

可以 Object.freeze 来实现枚举

或者

但是,这阻止咱们把值分配给变量:

let day = DaysEnum.tuesday
day = 298832342 // 不会报错

问题 10: 解释一下 `Object.freeze()` 和 `const` 的区别

主题: JavaScript
难度: ???

const和Object.freeze是两个完全不同的概念。

const 声明一个只读的变量,一旦声明,常量的值就不可改变:

Object.freeze适用于值,更具体地说,适用于对象值,它使对象不可变,即不能更改其属性。

问题 11: JS 的提升是什么

主题: JavaScript
难度: ????

提升是指 JS 解释器将所有变量和函数声明移动到当前作用域顶部的操作,提升有两种类型

  • 变量提升
  • 函数提升

只要一个var(或函数声明)出现在一个作用域内,这个声明就被认为属于整个作用域,并且可以在任何地方访问。

问题 12: 解释一下原型设计模式(Prototype Pattern)

主题: JavaScript
难度: ????

原型模式会创建新的对象,而不是创建未初始化的对象,它会返回使用从原型或样本对象复制的值进行初始化的对象。原型模式也称为属性模式。

原型模式有用的一个例子是使用与数据库中的默认值匹配的值初始化业务对象。原型对象保留默认值,这些默认值将被复制到新创建的业务对象中。

传统语言很少使用原型模式,但是JavaScript作为一种原型语言,在构建新对象及其原型时使用这种模式。

问题 13: ES6 中的临时死区是什么

主题: JavaScript
难度: ????

在 ES6 中,let 和const 跟 var、class和function一样也会被提升,只是在进入作用域和被声明之间有一段时间不能访问它们,这段时间是临时死区(TDZ)

问题 14: 什么时候不使用箭头函数? 说出三个或更多的例子

主题: JavaScript
难度: ????

不应该使用箭头函数一些情况:

  • 当想要函数被提升时(箭头函数是匿名的)
  • 要在函数中使用this/arguments时,由于箭头函数本身不具有this/arguments,因此它们取决于外部上下文
  • 使用命名函数(箭头函数是匿名的)
  • 使用函数作为构造函数时(箭头函数没有构造函数)
  • 当想在对象字面是以将函数作为属性添加并在其中使用对象时,因为咱们无法访问 this 即对象本身。

问题 15: ES6 中的 WeakMa p的实际用途是什么?

主题: JavaScript
难度: ????

WeakMaps 提供了一种从外部扩展对象而不影响垃圾收集的方法。当咱们想要扩展一个对象,但是因为它是封闭的或者来自外部源而不能扩展时,可以应用WeakMap。

WeakMap只适用于 ES6 或以上版本。WeakMap是键和值对的集合,其中键必须是对象

WeakMaps的有趣之处在于,它包含了对map内部键的弱引用。弱引用意味着如果对象被销毁,垃圾收集器将从WeakMap中删除整个条目,从而释放内存。

问题 16: 说明下列方法为何不能用作 IIFE,要使其成为 IIFE,需要进行哪些更改?

主题: JavaScript
难度: ????

IIFE 代表立即调用的函数表达式。JS解析器读取函数foo(){}();作为函数foo(){}和();,前者是一个函数声明,后者(一对括号)是尝试调用一个函数,但没有指定名称,因此它抛出Uncaught SyntaxError: Unexpected token 异常。

咱们可以使用void操作符:void function foo(){ }();。不幸的是,这种方法有一个问题。给定表达式的求值总是undefined的,所以如果IIFE 函数有返回值,则不能使用它,如下所示:

问题 17: 能否比较模块模式与构造函数/原型模式的用法?

主题: JavaScript
难度: ????

模块模式通常用于命名空间,在该模式中,使用单个实例作为存储来对相关函数和对象进行分组。这是一个不同于原型设计的用例,它们并不是相互排斥,咱们可以同时使用它们(例如,将一个构造函数放在一个模块中,并使用new MyNamespace.MyModule.MyClass(arguments) )。

构造函数和原型是实现类和实例的合理方法之一。它们与模型并不完全对应,因此通常需要选择一个特定的scheme或辅助方法来实现原型中的类。

问题 18: ES6 Map 和 WeakMap 有什么区别?

主题: JavaScript
难度: ?????

当它们的键/值引用的对象被删除时,它们的行为都不同,以下面的代码为例:

执行上面的 IIFE,就无法再引用{x:12}和{y:12}。垃圾收集器继续运行,并从 WeakMa中删除键b指针,还从内存中删除了{y:12}。

但在使用 Map的情况下,垃圾收集器不会从Map中删除指针,也不会从内存中删除{x:12}。

WeakMap 允许垃圾收集器执行其回收任务,但Map不允许。对于手动编写的 Map,数组将保留对键对象的引用,以防止被垃圾回收。但在WeakMap中,对键对象的引用被“弱”保留,这意味着在没有其他对象引用的情况下,它们不会阻止垃圾回收。

问题 19: 举一个柯里化函数的例子,并说明柯里化的好处?

主题: JavaScript
难度: ?????

柯里化是一种模式,其中一个具有多个参数的函数被分解成多个函数,当被串联调用时,这些函数将一次累加一个所需的所有参数。这种技术有助于使用函数式编写的代码更容易阅读和编写。需要注意的是,要实现一个函数,它需要从一个函数开始,然后分解成一系列函数,每个函数接受一个参数。

问题 20: 如何在 JS 中“深冻结”对象

主题: JavaScript
难度: ?????

如果咱们想要确保对象被深冻结,就必须创建一个递归函数来冻结对象类型的每个属性:

没有深冻结

深冻结

原文:https://dev.to/fullstackcafe/20-tricky-es6-interview-questions-to-revamp-your-javascript-skills-5a4o

相关推荐

如何将PDF转换成TXT文档?介绍9种方法,轻松就能学会!

PDF和TXT作为两种较为常见的文档格式,各自以其独特的优势占据了重要地位,甚至在某些特定场景下,将PDF转为TXT会显得尤为重要。一、为什么选择将PDF转为TXT?提升阅读效率:TXT格式的纯文本...

怎么给电子文档加密?推荐用这四个方法,步骤简单,轻松学会!

最近朋友小李跟我吐槽,他熬夜整理的客户资料被同事误发到公司大群,差点酿成大祸。怎么给电子文档加密?其实,给电子文档加密就像给家门上锁一样简单。今天就手把手教你4种超实用的加密方法,小白也能3分钟搞定!...

怎么把Word文档转换成PDF?这3种方法很实用!

怎么把Word文档转换成PDF?PDF格式文件稳定,是传输文件首选格式,将Word文档转换成PDF文件格式是一种常见的需求,下面就来教大家三种方法,Word转PDF文件如此简单!01AdobeA...

"解决Word文档只读权限问题:四种有效方法帮您编辑文件"

你是否遇到过想编辑一个Word文档,却被告知你没有权限修改任何内容?这意味着文件已被设定为“只读”状态,也就是说你只能读取文件,却无权做出任何修改。发生此类状况的原因有很多,我们首先会分析具体的情况,...

如何把doc文档转换为word文档?批量转换的四个方法

在日常生活和工作中,我们经常会遇到需要将doc文档转换为word文档的情况。无论是出于兼容性的考虑,还是为了使用某些特定的功能,掌握这一技能都显得尤为重要。本文将详细介绍几种常见且高效的方法,帮助大家...

四种简易方法:快速将常见文档转换为PDF格式

由于PDF文件具有良好的视觉阅读性和通用性,因此在日常工作和学习中得到了广泛的应用。然而,与一些常见的文档相比,PDF文件的排版更加稳定,不易被修改,且在不同设备上查看时文档格式不容易出错。因此,在许...

Deepseek文档转换方法(deepseek投喂本地文档的方法)

Deepseek的火热程度大家都有目共睹,作为一种新的AI生产力工具,已在各个领域广泛应用。然而对大部分从没接触过此类智语言模型的新手来说,结合Deepseek进行生活、学习以及工作,还是有不小的挑战...

只要多加这样一句提示词,就能让DeepSeek帮你生成下载各种文档!

你提到的这个提示词技巧确实能极大提升效率!不过需要特别说明:DeepSeek作为AI助手不提供任何文档下载功能,但可以通过以下合法方式帮你更高效地获取知识:利用DeepSeek生成并下载文档,关键...

如何免费下载文档?原创力文档来啦!

在如今这个信息共享的时代,有许多渠道和方式可以让我们免费获取到所需的文档,只是很多人没有去深入探索和了解。免费下载文档可太实用了,既能给咱们省不少钱,还能让咱们自由自在的获取知识和信息。接下来我就把自...

用deepseek提问题,结果可以直接下载的excel文档

步骤:1.打开deepseek,录入你的要求,如请你帮我做一份会计日常工作安排表,内容按年、按月、按周的时间轴来写。2.写上提示词:以表格的方式呈现,用html格式输出,需要能直接下载excel文档的...

AI大模型推理优化(附原文pdf文档和DeepSeek资料下载)

大模型推理引擎采用了多种定制化的优化技术,针对预填充和解码阶段进行优化。大多数引擎都使用了KVCaching避免解码阶段的重复计算,使用缓存的上下文,只计算最新一个token。引入连续批处理和...

网上下载的Word文档打不开?这样解决!

你是不是遇到过这种情况?下载的Word文件打不开,双击无响应?出现“文件已损坏”或“受保护的视图”提示?别担心!这篇文章适用于最新版Office365,教你4种方法快速修复W...

密封垫片的选择,PPT文档(可全套下载),建议机械人都看看

密封垫片选择难题,PPT详解,机械工程资料等你解锁!工业生产中,密封是至关重要的一环,而密封垫片,就是守护这道防线的无名英雄。可小小的垫片,选择起来却让人头秃!型号繁多,参数复杂,让人摸不着头脑。你...

教你怎么破解收费文档的技巧,很多文档复制都是要钱,别说下载了

现在很多网站或文档,复制都需要交会员费,或者就是让你付费,有没有什么其他的办法解决这一问题呢?办法其实是有的,只是细节问题很难处理了。那么今天就来提供三种本人在实际应用中用到的破解限制的功能。来看看具...

如何免费 下载360文库文档?(360文库付费下载)

想要免费下载360文库的文档,你可以试试下面这几种办法:一、用冰点下载器:冰点下载器这个工具不用登录,也不用积分,就能免费下载文库文档。你只要把要下载的文档链接粘贴到搜索框里,然后点下载就行。二、...

取消回复欢迎 发表评论: