2019 JavaScript面试题大汇总,还搞不定?
2023-12-19 19:58:34
JavaScript的强制转换
在 JavaScript 中,两种不同的内置类型间的转换被称为强制转型。强制转型在 JavaScript 中有两种形式:显式和隐式。
显式强制转型
显式强制转型使用两种方法:
Number()
:将值转换为数字。String()
:将值转换为字符串。
// 显式强制转型示例
const value1 = 10;
const value2 = "20";
// 使用 Number() 将字符串转换为数字
const number1 = Number(value1);
console.log(number1); // 10
// 使用 String() 将数字转换为字符串
const string1 = String(value2);
console.log(string1); // "20"
隐式强制转型
隐式强制转型发生在 JavaScript 引擎自动将一种类型的值转换为另一种类型。隐式强制转型在以下情况下发生:
- 当数值和字符串相加时,数值将转换为字符串。
- 当布尔值与数值相加时,布尔值将转换为数值。
- 当数值与字符串比较时,数值将转换为字符串。
- 当布尔值与字符串比较时,布尔值将转换为字符串。
// 隐式强制转型示例
const value1 = 10;
const value2 = "20";
// 数值和字符串相加时,数值将转换为字符串
const result1 = value1 + value2;
console.log(result1); // "1020"
// 布尔值与数值相加时,布尔值将转换为数值
const value3 = true;
const result2 = value3 + value1;
console.log(result2); // 11
// 数值与字符串比较时,数值将转换为字符串
const result3 = value1 == value2;
console.log(result3); // false
// 布尔值与字符串比较时,布尔值将转换为字符串
const result4 = value3 == value2;
console.log(result4); // false
JavaScript的作用域
JavaScript的作用域是指变量和函数在程序中可访问的范围。JavaScript有两种作用域:
- 全局作用域: 全局作用域是整个程序可以访问的变量和函数的作用域。全局变量和函数在程序的任何位置都可以访问。
- 局部作用域: 局部作用域是函数内部的变量和函数的作用域。局部变量和函数只能在函数内部访问。
// 全局变量
var globalVariable = 10;
// 全局函数
function globalFunction() {
console.log(globalVariable); // 10
}
// 局部变量
function localFunction() {
var localVariable = 20;
// 局部函数
function nestedFunction() {
console.log(localVariable); // 20
}
nestedFunction();
}
localFunction();
// 全局变量只能在全局作用域中访问
console.log(globalVariable); // 10
// 局部变量只能在函数内部访问
console.log(localVariable); // ReferenceError: localVariable is not defined
JavaScript的闭包
JavaScript的闭包是指函数及其所访问的变量和函数作为一个单元一起被封装起来,当函数被调用时,该单元仍然存在。闭包可以用来实现数据隐藏和模块化。
// 创建闭包
function createClosure() {
var privateVariable = 10;
function innerFunction() {
console.log(privateVariable); // 10
}
return innerFunction;
}
// 获取闭包
const closure = createClosure();
// 调用闭包
closure(); // 10
在上面的示例中,createClosure()
函数返回 innerFunction()
函数,并且 innerFunction()
函数可以访问 createClosure()
函数中的私有变量 privateVariable
。这就是闭包。
JavaScript的原型
JavaScript的原型是指一个对象从另一个对象继承属性和方法的机制。原型是 JavaScript 面向对象编程的基础,它允许对象共享属性和方法,并可以动态地添加和删除属性和方法。
// 创建一个对象
const object1 = {
name: "John Doe",
age: 30
};
// object1 的原型是 Object.prototype
console.log(object1.__proto__ === Object.prototype); // true
// 创建一个构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
// Person 构造函数的原型是 Object.prototype
console.log(Person.prototype === Object.prototype); // true
// 创建一个 Person 对象
const person1 = new Person("John Doe", 30);
// person1 的原型是 Person.prototype
console.log(person1.__proto__ === Person.prototype); // true
// 给 Person.prototype 添加一个方法
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
};
// person1 可以访问 Person.prototype 中的 greet 方法
person1.greet(); // Hello, my name is John Doe and I am 30 years old.
JavaScript的事件循环
JavaScript的事件循环是指 JavaScript 引擎处理事件的机制。事件循环是一个不断循环的过程,它不断地检查是否有新的事件发生,如果有,就将该事件添加到事件队列中。事件队列是一个先进先出(FIFO)队列,这意味着最早添加的事件将最早被处理。
// 添加一个事件监听器
document.addEventListener("click", function() {
console.log("Click event occurred.");
});
// 事件循环将 click 事件添加到事件队列中
// 事件循环从事件队列中获取 click 事件并将其处理
// console.log("Click event occurred.") 输出到控制台
在上面的示例中,当用户单击页面时,document.addEventListener()
函数将 click 事件添加到事件队列中。然后,事件循环从事件队列中获取 click 事件并将其处理,从而导致 console.log("Click event occurred.")
输出到控制台。
JavaScript的异步编程
JavaScript的异步编程是指在不阻塞主线程的情况下执行任务的编程技术。异步编程允许 JavaScript 程序同时执行多个任务,从而提高程序的性能。
// 使用 setTimeout() 函数执行异步任务
setTimeout(function() {
console.log("Hello, world!");
}, 1000);
// 主线程继续执行其他任务
// 1000 毫秒后,setTimeout() 函数执行并输出 "Hello, world!" 到控制台
在上面的示例中,setTimeout()
函数执行异步任务,该任务将在 1000 毫秒后执行。在此期间,主线程继续执行其他任务。当 1000 毫秒后,异步任务执行并输出 "Hello, world!" 到控制台。
JavaScript的 Promise
JavaScript的 Promise 是一个表示异步操作的最终完成或失败的对象。Promise 可以用来处理异步操作的结果,并可以将多个异步操作串联起来。
// 创建一个 Promise
const promise = new Promise(function(resolve, reject) {
// 模拟异步操作
setTimeout(function() {
resolve("Hello, world!");
}, 1000);
});
// 处理 Promise 的结果
promise.then(function(result) {
console.log(result); // Hello, world!
});
在上面的示例中,Promise
对象表示异步操作,该异步操作将在 1000 毫秒后完成。当异步操作完成后,Promise
对象将调用 resolve()
函数,并将 "Hello, world!" 作为参数传递给 resolve()
函数。然后,Promise
对象将调用 .then()
函数并将 "Hello, world!" 作为参数传递给 .then()
函数。最后,.then()
函数将 "Hello, world!" 输出到控制台。
JavaScript的 fetch API
JavaScript的 fetch API 是一个用于发送 HTTP 请求并接收 HTTP 响应的 API。fetch API 可以用来从服务器获取数据,也可以用来向服务器发送数据。
// 使用 fetch() 函数发送 GET 请求
fetch("https://example.com/api/data")
.then(function(response) {
return response.json();
})
.then(function(data) {