八个针对高级职位的高级 JavaScript 面试题

JAVAScript 是一种功能强大的语言 , 是网络的主要构建块之一 。这种强大的语言也有一些怪癖 。例如 , 您是否知道 0 === -0 的计算结果为 true , 或者 Number("") 的结果为 0?

八个针对高级职位的高级 JavaScript 面试题

文章插图
问题是 , 有时这些怪癖会让你摸不着头脑 , 甚至质疑 Brendon Eich 发明 JavaScript 的那一天 。好吧 , 重点不在于 JavaScript 是一种糟糕的编程语言 , 或者像它的批评者所说的那样它是邪恶的 。所有编程语言都有某种与之相关的奇怪之处 , JavaScript 也不例外 。
因此 , 在今天这篇文章中 , 我们将会看到一些重要的 JavaScript 面试问题的深入解释 。我的目标是彻底解释这些面试问题 , 以便我们能够理解基本概念 , 并希望在面试中解决其他类似问题 。
1、仔细观察 + 和 - 运算符console.log(1 + '1' - 1);您能猜出 JavaScript 的 + 和 - 运算符在上述情况下的行为吗?
当 JavaScript 遇到 1 + '1' 时 , 它会使用 + 运算符处理表达式 。+ 运算符的一个有趣的属性是 , 当操作数之一是字符串时 , 它更喜欢字符串连接 。在我们的例子中 , “1”是一个字符串 , 因此 JavaScript 隐式地将数值 1 强制转换为字符串 。因此 , 1 + '1' 变为 '1' + '1' , 结果是字符串 '11' 。
现在 , 我们的等式是 '11' - 1 。- 运算符的行为恰恰相反 。无论操作数的类型如何 , 它都会优先考虑数字减法 。当操作数不是数字类型时 , JavaScript 会执行隐式强制转换 , 将其转换为数字 。在本例中 , “11”被转换为数值 11 , 并且表达式简化为 11 - 1 。
把它们放在一起:
'11' - 1 = 11 - 1 = 102、复制数组元素考虑以下 JavaScript 代码并尝试查找此代码中的任何问题:
function duplicate(array) {for (var i = 0; i < array.length; i++) {array.push(array[i]);}return array;}const arr = [1, 2, 3];const newArr = duplicate(arr);console.log(newArr);在此代码片段中 , 我们需要创建一个包含输入数组的重复元素的新数组 。初步检查后 , 代码似乎通过复制原始数组 arr 中的每个元素来创建一个新数组 newArr 。然而 , 重复函数本身出现了一个关键问题 。
重复函数使用循环来遍历给定数组中的每个项目 。但在循环内部 , 它使用 push() 方法在数组末尾添加一个新元素 。这使得数组每次都变得更长 , 从而产生循环永远不会停止的问题 。循环条件 (i < array.length) 始终保持为 true , 因为数组不断变大 。这使得循环永远持续下去 , 导致程序卡住 。
为了解决数组长度不断增长导致无限循环的问题 , 可以在进入循环之前将数组的初始长度存储在变量中 。
然后 , 您可以使用该初始长度作为循环迭代的限制 。这样 , 循环将仅针对数组中的原始元素运行 , 并且不会因添加重复项而受到数组增长的影响 。这是代码的修改版本:
function duplicate(array) {var initialLength = array.length; // Store the initial lengthfor (var i = 0; i < initialLength; i++) {array.push(array[i]); // Push a duplicate of each element}return array;}const arr = [1, 2, 3];const newArr = duplicate(arr);console.log(newArr);输出将显示数组末尾的重复元素 , 并且循环不会导致无限循环:
[1, 2, 3, 1, 2, 3]3、原型和__proto__之间的区别原型属性是与 JavaScript 中的构造函数相关的属性 。构造函数用于在 JavaScript 中创建对象 。定义构造函数时 , 还可以将属性和方法附加到其原型属性 。
然后 , 从该构造函数创建的对象的所有实例都可以访问这些属性和方法 。因此 , prototype 属性充当在实例之间共享的方法和属性的公共存储库 。
考虑以下代码片段:
// Constructor functionfunction Person(name) {this.name = name;}// Adding a method to the prototypePerson.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}.`);};// Creating instancesconst person1 = new Person("HAIder Wain");const person2 = new Person("Omer Asif");// Calling the shared methodperson1.sayHello();// Output: Hello, my name is Haider Wain.person2.sayHello();// Output: Hello, my name is Omer Asif.


推荐阅读