400个最常见的 JavaScript 面试问答(2)

400个最常见的 JavaScript 面试问答(2)今天将给大家带来的是 400 个最常见的 JavaScript 面试问答第二部分。例如,在这种语言中,一个函数可以作为参数传递给其他函数,可以由另一个函数返回,也可以作为一个值分配给一个变量。

大家好,欢迎来到IT知识分享网。

大家好,我是海拥,专注于前端知识的分享。今天将给大家带来的是 400 个最常见的 JavaScript 面试问答第二部分。接下来我会持续更新(争取日更,也可能每周3-5篇),每小节大概 10 道题左右,总共会有 400 多道。

大家一定要记得点赞收藏呀!!!

11.什么是头等函数?

在 Javascript 中,函数是第一类对象。头等函数意味着该语言中的函数被视为任何其他变量。

例如,在这种语言中,一个函数可以作为参数传递给其他函数,可以由另一个函数返回,也可以作为一个值分配给一个变量。例如,在下面的示例中,分配给侦听器的处理函数

const handler = () => console.log ('This is a click handler function'); document.addEventListener ('click', handler);

12.什么是一阶函数?

一阶函数是不接受另一个函数作为参数并且不返回函数作为其返回值的函数。

const firstOrder = () => console.log ('I am a first order function!');

13.什么是高阶函数?

高阶函数是接受另一个函数作为参数或返回一个函数作为返回值或两者兼而有之的函数。

const firstOrderFunc = () => console.log ('Hello, I am a First order function'); const higherOrder = ReturnFirstOrderFunc => ReturnFirstOrderFunc(); higherOrder(firstOrderFunc);

14.什么是一元函数?

一元函数(即 monadic)是一个只接受一个参数的函数。它代表一个函数接受的单个参数。

让我们以一元函数为例,

const unaryFunction = a => console.log (a + 10); // 给给定的参数加 10

15.什么是柯里化函数?

柯里化是将具有多个参数的函数转换为每个只有一个参数的函数序列的过程。Currying 以数学家Haskell Curry 的名字命名。通过应用柯里化,n 元函数将其变成一元函数。

让我们举一个 n-ary 函数的例子,以及它如何变成一个柯里化函数,

const multiArgFunction = (a, b, c) => a + b + c; console.log(multiArgFunction(1,2,3));// 6 const curryUnaryFunction = a => b => c => a + b + c; curryUnaryFunction (1); // return a function: b => c => 1 + b + c curryUnaryFunction (1) (2); // return a function: c => 3 + c curryUnaryFunction (1) (2) (3); // return 数字 6

Curried 函数对于提高代码复用性函数组合非常有用。


16.什么是纯函数?

一个纯函数是在返回值是由它的参数没有任何副作用只有确定的函数。即如果您在应用程序中调用具有相同参数 ‘n’ 次和 ‘n’ 个位置的函数,则它将始终返回相同的值。

我们举个例子来看看纯函数和非纯函数的区别,

//不纯 let numberArray = []; const impureAddNumber = number => numberArray.push(number); //纯 const pureAddNumber = number => argNumberArray => argNumberArray.concat([number]); //显示结果 console.log (impureAddNumber(6)); // returns 1 console.log (numberArray); // returns [6] console.log (pureAddNumber(7) (numberArray)); // returns [6, 7] console.log (numberArray); // returns [6]

根据上面的代码片段,通过改变数组并返回一个与参数值无关的推送数字索引,推送函数本身是不纯的。而另一方面,Concat获取数组并将其与另一个数组连接起来,产生一个没有副作用的全新数组。此外,返回值是前一个数组的串联。

请记住,纯函数很重要,因为它们简化了单元测试,没有任何副作用,也不需要依赖注入。它们还避免了紧密耦合,并通过没有任何副作用使您的应用程序更难中断。这些原则通过优先使用const 而不是let与 ES6 的不变性概念结合在一起。


17.let 关键字的用途是什么?

let语句声明了一个块作用域局部变量。因此,使用 let 关键字定义的变量的范围仅限于使用它的块、语句或表达式。而使用var关键字声明的变量用于定义全局变量或局部变量,而不管块作用域如何。

我们举个例子来演示一下用法,

let counter = 30; if (counter === 30) { let counter = 31; console.log(counter); // 31 } console.log(counter); // 30 (因为这里不存在 if 块中的变量)

18.let 和 var 有什么区别?

以表格格式列出差异

var

let

它从 JavaScript 开始就可用

作为 ES6 的一部分引入

它有函数作用域

它有块作用域

变量将被提升

已提升但未初始化

让我们举个例子看看区别,

function userDetails(username) { if(username) { console.log(salary); // 由于变量提升未定义 console.log(age); // 参考错误:初始化前无法访问"age" let age = 30; var salary = 10000; } console.log(salary); //10000 (可访问到适当的函数范围) console.log(age); //error:age未定义(由于块作用域) } userDetails('Haiyong');

19. 为什么选择 let 这个名字作为关键字?

let是一种数学语句,被早期的编程语言如Scheme和Basic 所采用。它是从数十种其他语言中借用而来的,这些语言let已经尽可能地作为传统关键字使用var。


20.你如何在没有错误的情况下重新声明 switch 块中的变量?

如果您尝试在 a 中重新声明变量,switch block则会导致错误,因为只有一个块。例如,下面的代码块抛出如下语法错误,

let counter = 1; switch(x) { case 0: let name; break; case 1: let name; // 重新声明的语法错误。 break; }

为避免此错误,您可以在 case 子句中创建一个嵌套块并创建一个新的块范围词法环境。

let counter = 1; switch(x) { case 0: { let name; break; } case 1: { let name; // 没有用于重新声明的 SyntaxError。 break; } }

希望大家能够给海海 点赞+收藏+关注 ,你的支持是海海更新的动力!后面我会持续分享面试经验 & 前端相关的专业知识。

最后祝大家都能找到满意的实习和 offer!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/89699.html

(0)
上一篇 2024-10-18 21:45
下一篇 2024-10-18 22:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信