JavaScript 闪卡

类别赞助商

JavaScript 是一种多功能、动态的编程语言,是现代网络开发的重要组成部分。最初创建用于为静态 HTML 页面添加交互性,JavaScript 已演变为一种强大的工具,可用于客户端和服务器端。

我们的闪卡应用包含精心挑选的 JavaScript 面试问题及全面的答案,可以有效地为您准备任何需要 JS 知识的面试。IT 闪卡不仅是求职者的工具——无论您当前的职业计划如何,这是一个加强和测试您知识的好方法。定期使用该应用有助于您保持最新的 JavaScript 趋势,并保持高水平的技能。

我们的应用中的 JavaScript 闪卡示例

从App Store或Google Play下载我们的应用程序,获取更多免费的闪卡,或订阅以访问所有的闪卡。

JavaScript中的词法作用域是什么?

JavaScript中的词法作用域是一种原则,即变量的可见范围由其在代码中的位置确定。这意味着变量在其定义的块内以及任何嵌套的块内都是可以访问的。这使得可以创建闭包并控制对变量的访问。以下是在JavaScript代码中使用词法作用域的示例:
function outerFunction() {
  let outerVariable = `I'm outside!`;

  function innerFunction() {
    console.log(outerVariable); // 可访问 'outerVariable'
  }

  innerFunction();
}
outerFunction(); // 显示 `I'm outside!`

词法作用域允许内部函数访问在外部函数中定义的变量,即使外部函数已经结束。这在JavaScript中创建闭包的过程中是一个关键因素,允许应用程序更灵活地管理状态。

什么是提升(Hoisting)?

提升是JavaScript语言中的一种机制,其中变量和函数在代码执行之前被移动到其范围的顶部。实际上,这意味着我们可以在它们实际声明之前使用函数或变量。

然而,应该注意的是变量和函数的提升工作方式略有不同

对于用var关键字声明的变量,只有声明被提升,初始化并未被提升。在声明之前初始化的变量将被返回为undefined

变量提升代码的一个例子:
console.log(myVar); // undefined
var myVar = 5;
console.log(myVar); // 5

对于函数,提升将函数的声明和定义都移到顶部,这允许在声明函数之前使用它。

函数提升代码的一个例子:
console.log(myFunction()); // "Hello World"

function myFunction() {
  return "Hello World";
}

let和const声明的变量不会发生提升。

什么是箭头函数及其优势?

箭头函数,也被称为箭头函数,是在 ECMAScript 6 (ES6) 中引入的一种函数类型。 它们之所以被称为箭头函数,是因为它们使用一种特殊的箭头语法( => )来定义函数。

比较而言,传统的函数可能看起来是这样的:
function sum(a, b) {
  return a + b;
}

箭头函数的等效形式是:
const sum = (a, b) => a + b;

箭头函数的主要好处是它不会创建自己的执行上下文(绑定到this),这在JavaScript中常常是错误的来源。在箭头函数中,this是从周围的上下文中继承的。另一个优点是简洁的语法,尤其在函数被用作其他函数的参数时,例如在高阶函数中。

另一方面,由于缺乏自己的this,箭头函数不适合定义构造器(创造性)对象或者在原型对象中创建方法。

Promise对象是什么,它如何被使用?

JavaScript中的Promise对象用于处理异步操作。一个Promise代表一个可能在创建Promise时尚不可用,但在将来可能可用,或者可能永远不可用的值。

一个Promise对象可以处于以下三种状态之一:
1. Pending - 操作仍在进行中,尚未成功或出错地完成。
2. Fulfilled - 操作成功完成,Promise返回一个值。
3. Rejected - 操作以错误完成,Promise返回错误原因。

一个已经"fulfilled"或"rejected"的Promise被认为是"settled",并且它的状态永远不会改变。

创建一个Promise对象:
const promise = new Promise((resolve, reject) => {
  const success = true;
  if (success) {
    resolve('Operation successful.');
  } else {
    reject('Operation failed.');
  }
});

使用一个Promise对象:
promise
  .then(result => {
    console.log(result); // 将打印: 'Operation successful.'
  })
  .catch(error => {
    console.log(error);
  });

.then()方法在Promise被fulfilled时执行,.catch()在它被rejected时执行。在两种情况下,操作的结果或Promise被拒绝的原因都作为参数传递。

什么是回调函数?

回调,也称为回调函数,是作为参数传递给另一个函数的函数,然后在该函数完成后执行(回调)。回调函数通常在JavaScript中使用,尤其是在异步操作如AJAX请求或事件处理中。

回调函数通常接收某个操作的结果作为参数,因此它们可以用于处理或分析这些结果。

在实践中,这样一个函数的使用可能如下所示:
function executeAfterTimeout(callback, timeout) {
  setTimeout(() => {
    console.log('时间过去了!');
    callback();
  }, timeout);
}

executeAfterTimeout(() => {
  console.log('这是一个回调!');
}, 2000);

在这种情况下,`executeAfterTimeout`函数接收一个`回调`函数作为参数,该函数将在指定的时间过去后执行。回调函数对于管理JavaScript中的异步控制流非常有用。

什么是空值合并运算符,它是如何工作的?

空值合并运算符 (??) 是一种逻辑运算符,当左侧的操作数为 null 或 undefined 时,它返回操作的右侧数值。换句话说,当一个变量为空时,空值合并运算符返回定义的值作为结果。

基本的符号表示如下:
let value = null ?? 'default value';

在这种情况下,由于左侧(value)为 null,所以结果是 'default value'。此外,这个操作符与 OR 操作符 (||) 的不同之处在于,OR 函数在左侧为假(false, 0, '', null, undefined, NaN)时返回右侧数值,而空值合并运算符仅当左侧为 null 或 undefined 时才返回右侧数值。

使用 OR 的例子:
let value1 = 0 || 'default';
console.log(value1); // 输出: 'default',因为 0 是一个假值

使用空值合并的例子:
let value2 = 0 ?? 'default';
console.log(value2); // 输出: 0,因为 0 不是 null 或 undefined

所以,与 OR 不同,空值合并运算符不将 0、'' 和 NaN 视为"空"值。

Symbol是什么,应该在什么时候使用?

JavaScript中的Symbol是一个独特的不变的数据类型,常用于标识对象的独特属性。

你可以通过调用Symbol()构造函数来创建一个Symbol,每次调用都会创建一个独特的symbol。即使我们用同样的参数调用Symbol()构造函数,每个创建的symbol都会不同。
const symbol1 = Symbol('mySymbol');
const symbol2 = Symbol('mySymbol');
console.log(symbol1 === symbol2); // 返回 false

Symbol常用于定义对象的(独特的)属性,特别是当我们希望这个属性被隐藏或私有时。它还覆盖了在使用for...in或for...of迭代对象时不会考虑的属性,以及不被Object.keys()方法返回的属性。此外,symbols允许创建“伪”私有属性。
let obj = {};
let privateProperty = Symbol('private');

obj[privateProperty] = 'This is private';

console.log(obj[privateProperty]); // 'This is private'
console.log(Object.keys(obj)); // []

没有明确的规则说明何时应该使用Symbol。它们通常用于当我们希望在对象上创建一个不容易被看到或改变的独特属性,或者我们希望定义影响对象在低层行为的方法时。

什么是WeakMap和WeakSet?

WeakMapWeakSet是JavaScript Map和Set对象的特殊版本,它们不会阻止垃圾回收器自动释放内存。

WeakMap 是键-值对的集合,键必须是对象,值可以是任何东西。Map和WeakMap的主要区别在于,WeakMap中的键被"弱"持有,这意味着如果没有其他引用指向键对象,它将被垃圾回收,并且其在WeakMap中的条目将被自动删除。

以下是使用WeakMap的一个例子:
let john = { name: "John" };

let weakMap = new WeakMap();
weakMap.set(john, "...");

john = null; //覆盖引用

// john已从内存中移除!

WeakSet与WeakMap对于Map的关系相似。它是对象的集合,但如果对象在其他地方不可见,它不会阻止垃圾回收。它缺乏典型的Set方法,如`size`和`clear`,`add`方法只接受对象。

使用WeakSet的一个例子:
let john = { name: "John" };

let weakSet = new WeakSet();
weakSet.add(john);

john = null; //覆盖引用

// john已从内存中移除!

在我们希望存储关于应在对象本身被删除时删除的对象的附加信息的情况下,主要使用WeakMap和WeakSet。

下载 IT 闪卡 立即

通过我们的闪卡扩展您的 JavaScript 知识。
从编程基础到掌握高级技术,IT 闪卡是您通向 IT 卓越的护照。
立即下载,发掘您在当今竞争激烈的技术世界中的潜力。