JavaScript九大面试问题集锦,助你顺利通关!(2)
实际操作中,关键的区别在于函数声明要被提升,而函数表达式则没有。这意味着JavaScript解释器将函数声明移动到其作用域的顶部,因此可以定义函数声明并在代码中的任何位置调用它。相比之下,只能以线性顺序调用函数表达式:必须在调用它之前解释。 如今,许多开发人员偏爱函数表达式有如下几个原因:
5. var,let和const有什么区别? 自ES6发布以来,现代语法已进入各行各业,这已是一个极其常见的面试问题。Var是第一版JavaScript中的变量声明关键字。但它的缺点导致在ES6中采用了两个新关键字:let和const。 这三个关键字具有不同的分配,提升和域 - 因此我们将单独讨论。 (1) 分配 最基本的区别是let和var可以重新分配,而const则不能。这使得const成为不变变量的最佳选择,并且它将防止诸如意外重新分配之类的失误。注意,当变量表示数组或对象时,const确实允许变量改变,只是无法重新分配变量本身。 Let 和var都可重新分配,但是正如以下几点应该明确的那样,如果不是所有情况都要求更改变量,多数选择中,let具有优于var的显著优势。 (2) 提升 与函数声明和表达式(如上所述)之间的差异类似,使用var声明的变量总是被提升到它们各自的顶部,而使用const和let声明的变量被提升,但是如果你试图在声明之前访问,将会得到一个TDZ(时间死区)错误。由于var可能更容易出错,例如意外重新分配,因此运算是有用的。请看以下代码:
这里,foo()和console.log(x)的结果与预期一致。但是,如果去掉第二个变量又会发生什么呢?
尽管在函数内定义,但x =“functional scope”已覆盖全局变量。需要重复关键字var来指定第二个变量x仅限于foo()。 (3) 域 虽然var是function-scoped(函数作用域),但let和const是block-scoped(块作用域的:一般情况下,Block是大括号{}内的任何代码,包括函数,条件语句和循环。为了阐明差异,请看以下代码:
在条件块中,全局范围的var a已重新定义,但全局范围的let b和const c则没有。一般而言,确保本地任务保持在本地执行,将使代码更加清晰,减少出错。 6. 如果分配不带关键字的变量会发生什么? 如果不使用关键字定义变量,又会如何?从技术上讲,如果x尚未定义,则x = 1是window.x = 1的简写。 要想完全杜绝这种简写,可以编写严格模式,——在ES5中介绍过——在文档顶部或特定函数中写use strict。后,当你尝试声明没有关键字的变量时,你将收到一条报语法错误:Uncaught SyntaxError:Unexpected indentifier。 7. 面向对象编程(OOP)和函数式编程(FP)之间的区别是什么? JavaScript是一种多范式语言,即它支持多种不同的编程风格,包括事件驱动,函数和面向对象。 编程范式各有不同,但在当代计算中,函数编程和面向对象编程最为流行 - 而JavaScript两种都可执行。 (1) 面向对象编程 OOP以“对象”这一概念为基础的数据结构,包含数据字段(JavaScript称为类)和程序(JavaScript中的方法)。 一些JavaScript的内置对象包括Math(用于random,max和sin等方法),JSON(用于解析JSON数据)和原始数据类型,如String,Array,Number和Boolean。 无论何时采用的内置方法,原型或类,本质上都在使用面向对象编程。 (2) 函数编程 FP(函数编程)以“纯函数”的概念为基础,避免共享状态,可变数据和副作用。这可能看起来像很多术语,但可能已经在代码中创建了许多纯函数。 输入相同数据,纯函数总是返回相同的输出。这种方式没有副作用:除了返回结果之外,例如登录控制台或修改外部变量等都不会发生。 至于共享状态,这里有一个简单的例子,即使输入是相同的,状态仍可以改变函数的输出。设置一个具有两个函数的代码:一个将数字加5,另一个将数字乘以5。
如果先调用add5在调用乘以5,则整体结果为30。但是如果以相反的方式执行函数并记录结果,则输出为10,与之前结果不一致。 (编辑:ASP站长网) |