interview
javascript-frontend-basics
JavaScript 中如何合并对象

前端 JavaScript 基础面试题, JavaScript 中如何合并对象?

前端 JavaScript 基础面试题, JavaScript 中如何合并对象?

QA

Step 1

Q:: JavaScript 中如何合并对象?

A:: 在 JavaScript 中,合并对象的常用方法包括: 1. 使用 Object.assign() 方法:

 
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObj = Object.assign({}, obj1, obj2);
// mergedObj => { a: 1, b: 3, c: 4 }
 

2. 使用扩展运算符 (...)

 
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObj = { ...obj1, ...obj2 };
// mergedObj => { a: 1, b: 3, c: 4 }
 

Step 2

Q:: 如何判断一个对象是否为空?

A:: 判断一个对象是否为空的方法包括: 1. 使用 Object.keys() 方法:

 
const isEmpty = (obj) => Object.keys(obj).length === 0;
 

2. 使用 JSON.stringify() 方法:

 
const isEmpty = (obj) => JSON.stringify(obj) === '{}';
 

Step 3

Q:: 如何深拷贝一个对象?

A:: 深拷贝对象的方法包括: 1. 使用 JSON.parse 和 JSON.stringify:

 
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
 

2. 使用递归函数:

 
function deepCopy(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }
  const copy = Array.isArray(obj) ? [] : {};
  for (const key in obj) {
    copy[key] = deepCopy(obj[key]);
  }
  return copy;
}
 

3. 使用 lodash 的 _.cloneDeep 方法:

 
const _ = require('lodash');
const deepCopy = _.cloneDeep(original);
 

Step 4

Q:: 如何合并两个数组并去重?

A:: 合并两个数组并去重的方法包括: 1. 使用 Set 和扩展运算符:

 
const arr1 = [1, 2, 3];
const arr2 = [2, 3, 4];
const mergedArray = [...new Set([...arr1, ...arr2])];
// mergedArray => [1, 2, 3, 4]
 

2. 使用 Array.prototype.concat 和 Array.prototype.filter:

 
const arr1 = [1, 2, 3];
const arr2 = [2, 3, 4];
const mergedArray = arr1.concat(arr2).filter((item, index, self) => self.indexOf(item) === index);
// mergedArray => [1, 2, 3, 4]
 

Step 5

Q:: 什么是闭包?闭包有哪些实际应用?

A:: 闭包是指在一个函数内部定义的函数可以访问外部函数的变量,即使外部函数已经执行完毕。 闭包的实际应用包括: 1. 创建私有变量:

 
function createCounter() {
  let count = 0;
  return function() {
    return ++count;
  };
}
const counter = createCounter();
counter(); // 1
counter(); // 2
 

2. 模拟块级作用域:

 
for (var i = 0; i < 3; i++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);
    }, 1000);
  })(i);
}
// 输出:0, 1, 2
 

用途

这些问题涉及 JavaScript 的基础知识,这些知识是前端开发中经常用到的。合并对象、判断对象是否为空、深拷贝对象以及数组去重等操作在实际开发中非常常见。例如,在处理表单数据、管理应用状态、处理响应数据时经常需要进行这些操作。了解闭包对于理解 JavaScript 的作用域和内存管理也非常重要,有助于编写更高效、更安全的代码。\n

相关问题

🦆
JavaScript 中的变量提升是如何工作的?

在 JavaScript 中,变量声明(使用 var)和函数声明会被提升到所在作用域的顶部。但变量赋值不会被提升。

 
console.log(a); // undefined
var a = 5;
console.log(a); // 5
 
🦆
解释 JavaScript 中的原型链及其工作原理

JavaScript 中的每个对象都有一个原型(prototype),对象可以通过原型链(prototype chain)继承其他对象的属性和方法。原型链的顶端是 Object.prototype,它的原型是 null。

 
function Person(name) {
  this.name = name;
}
Person.prototype.greet = function() {
  console.log('Hello ' + this.name);
};
const alice = new Person('Alice');
alice.greet(); // Hello Alice
 
🦆
解释事件循环 Event Loop 在 JavaScript 中的作用

事件循环是 JavaScript 的执行模型,用于处理异步操作。它的主要工作是监听调用栈和任务队列,如果调用栈为空,它将把队列中的第一个任务推入栈中执行。

 
console.log('Start');
setTimeout(() => {
  console.log('Timeout');
}, 0);
console.log('End');
// 输出:Start, End, Timeout
 
🦆
什么是 JavaScript 的this关键字?它在不同上下文中的行为如何?

“this” 关键字的值取决于它所在的执行上下文: 1. 在全局上下文中,this 指向全局对象(浏览器中为 window)。 2. 在函数中,this 的值取决于函数的调用方式。 3. 在对象的方法中,this 指向该对象。 4. 在箭头函数中,this 继承自外层作用域。

 
const obj = {
  method: function() {
    console.log(this);
  }
};
obj.method(); // obj
const fn = obj.method;
fn(); // undefined 或 global/window