前端 JavaScript 基础面试题, 如何获取安全的 undefined 值?
前端 JavaScript 基础面试题, 如何获取安全的 undefined 值?
QA
Step 1
Q:: 如何获取安全的 undefined 值?
A:: 在 JavaScript 中,安全获取 undefined 值的方式有多种。最常见的是直接使用 undefined 关键字。为了避免意外地重写 undefined,可以通过如下方法获取一个真正的 undefined 值:1. 通过 void 操作符,如 void 0;2. 自定义函数参数未提供默认值,如 function foo(x) { return x; }(undefined)
。这些方法确保我们获得的是未定义值。
Step 2
Q:: 什么是闭包(Closure)?
A:: 闭包是指那些能够访问自由变量的函数。换句话说,闭包可以捕获并记住其所在的词法作用域,即使函数在其词法作用域之外执行。例如:function outer() { var x = 10; function inner() { console.log(x); } return inner; } var closure = outer(); closure(); // 输出 10
。这里的 inner 函数就是一个闭包,它捕获了外部函数 outer 的变量 x。
Step 3
Q:: JavaScript 中的事件冒泡和事件捕获是什么?
A:: 事件冒泡和事件捕获是 DOM 事件处理的两个阶段。事件捕获从文档的根节点开始向目标节点传播,而事件冒泡则是从目标节点开始向上至根节点传播。可以通过 addEventListener 方法的第三个参数来指定是使用捕获还是冒泡:element.addEventListener('click', handler, true) 表示捕获,element.addEventListener('click', handler, false)
表示冒泡。
Step 4
Q:: 如何实现继承?
A:: 在 JavaScript 中,可以通过原型链或 ES6 的 class 关键字实现继承。通过原型链:function Parent() {} Parent.prototype.sayHello = function() { console.log('Hello'); } function Child() {} Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child; var child = new Child(); child.sayHello(); // 输出 'Hello'。通过 class 关键字:class Parent { sayHello() { console.log('Hello'); } } class Child extends Parent {} const child = new Child(); child.sayHello(); // 输出 'Hello'
。
Step 5
Q:: 什么是Promise,如何使用它?
A:: Promise 是一个表示异步操作最终完成或失败的对象。它有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。可以使用 new Promise 创建一个 Promise 实例,并使用 then 和 catch 方法处理结果:let promise = new Promise((resolve, reject) => { // 异步操作完成后调用 resolve 或 reject }); promise.then(value => { console.log(value); }).catch(error => { console.log(error); });