JavaScript九大面试问题集锦,助你顺利通关( 二 )


一个常见用途是Unix系统的文件权限 , 其中有八个权限变体:
4 2 1
0 - - - no permissions
1 - - x only execute
2 - x - only write
3 - x x write and execute
4 x - - only read
5 x - x read and execute
6 x x - read and write
7 x x x read, write and execute
出于相似的原由 , 八进制也用于数字显示器 。
回到问题本身
在JavaScript中 , 前缀0将所有数字转换为八进制 。但是 , 八进制中不使用数字8 , 任何包含8的数字都将自动转换为常规十进制数 。
因此 , 018-017实际上等同于十进制表达式:18-15 , 因为017使用八进制而018使用十进制 。

JavaScript九大面试问题集锦,助你顺利通关

文章插图
 
第二部分:常见问题
JavaScript九大面试问题集锦,助你顺利通关

文章插图
图片来源:pexels.com/@divinetechygirl
本节中 , 将介绍面试中一些更加常见的JavaScript问题 。第一次学习JavaScript时 , 这些问题容易被忽略 。但在编写最佳代码时 , 了解下述问题用处颇大 。
4. 函数表达式与函数声明有哪些不同?
函数声明使用关键字function , 后跟函数的名称 。相反 , 函数表达式以var , let或const开头 , 后跟函数名称和赋值运算符= 。请看以下代码:
// Function Declarationfunction sum(x, y) { return x + y;};// Function Expression: ES5var sum = function(x, y) { return x + y;}; // Function Expression: ES6+const sum = (x, y) => { return x + y };实际操作中 , 关键的区别在于函数声明要被提升 , 而函数表达式则没有 。这意味着JavaScript解释器将函数声明移动到其作用域的顶部 , 因此可以定义函数声明并在代码中的任何位置调用它 。相比之下 , 只能以线性顺序调用函数表达式:必须在调用它之前解释 。
如今 , 许多开发人员偏爱函数表达式有如下几个原因:
· 首先 , 函数表达式实施更加可预测的结构化代码库 。当然 , 函数声明也可使用结构化代码库; 只是函数声明让你更容易摆脱凌乱的代码 。
· 其次 , 可以将ES6语法用于函数表达式:这通常更为简洁 , let和const可以更好地控制是否重新赋值变量 , 我们将在下一个问题中看到 。
5. var , let和const有什么区别?
自ES6发布以来 , 现代语法已进入各行各业 , 这已是一个极其常见的面试问题 。Var是第一版JavaScript中的变量声明关键字 。但它的缺点导致在ES6中采用了两个新关键字:let和const 。
这三个关键字具有不同的分配 , 提升和域 - 因此我们将单独讨论 。
i) 分配
最基本的区别是let和var可以重新分配 , 而const则不能 。这使得const成为不变变量的最佳选择 , 并且它将防止诸如意外重新分配之类的失误 。注意 , 当变量表示数组或对象时 , const确实允许变量改变 , 只是无法重新分配变量本身 。
Let 和var都可重新分配 , 但是正如以下几点应该明确的那样 , 如果不是所有情况都要求更改变量 , 多数选择中 , let具有优于var的显著优势 。
ii)提升
与函数声明和表达式(如上所述)之间的差异类似 , 使用var声明的变量总是被提升到它们各自的顶部 , 而使用const和let声明的变量被提升 , 但是如果你试图在声明之前访问 , 将会得到一个TDZ(时间死区)错误 。由于var可能更容易出错 , 例如意外重新分配 , 因此运算是有用的 。请看以下代码:
var x = "global scope";function foo() { var x = "functional scope"; console.log(x);}foo(); // "functional scope"console.log(x); // "global scope"这里 , foo()和console.log(x)的结果与预期一致 。但是 , 如果去掉第二个变量又会发生什么呢?
var x = "global scope";function foo() { x = "functional scope"; console.log(x);}foo(); // "functional scope"console.log(x); // "functional scope"尽管在函数内定义 , 但x =“functional scope”已覆盖全局变量 。需要重复关键字var来指定第二个变量x仅限于foo() 。
iii) 域
虽然var是function-scoped(函数作用域) , 但let和const是block-scoped(块作用域的:一般情况下 , Block是大括号{}内的任何代码 , 包括函数 , 条件语句和循环 。为了阐明差异 , 请看以下代码:


推荐阅读