前端面试知识点总结(一)

150 阅读2分钟

git拉取同事提交的代码时,自己本地写了一半的代码,提交不成功怎么解决?

1. 分析问题根源
  • 首先通过git status查看具体哪些文件存在冲突
  • 确认是由于本地未提交的修改还是已提交的历史记录导致的冲突
2. 保护当前工作进度

使用git stash将未完成的修改暂存到栈中。 或者 用git add .git commit -m 'xx' 来创建临时提交,保护本地写了一半的代码。

3.同步远程更新

远程分支上的版本和本地的版本没对上,提交代码就会报错

这时可以用git pull origin master拉取远程仓库最新版本的代码

4.恢复本地工作

git stash pop 取出暂存的修改并尝试自动合并

git reset HEAD~1 撤销临时提交后继续开发

5. 可视化解决冲突

同事写的代码和我写的代码可能是会有冲突的,使用VSCode可以自动识别代码冲突,询问我保留哪份代码(是保留本地更改还是传入的更改),通过这种方式手动解决冲突,这样就可以成功提交了

判断一个变量是不是数组

1. Array.isArray()

const arr = [1, 2, 3];
console.log(Array.isArray(arr)); //  true

2. instanceof

const arr = [1, 2, 3];
console.log(arr instanceof Array); //  true

3. Object.prototype.toString.call(arr)

通过调用对象身上的 toString 方法,返回 [object Array]则代表是数组。 使用 call 的目的是将 this 显式绑定到我们要检测的目标对象(如数组)上

const arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr) === '[object Array]'); //  true

4.通过 constructor 属性

检查变量的 constructor 是否指向 Array,但可被篡改,可靠性低。

const arr = [1, 2, 3];
console.log(arr.constructor === Array); //  true

//  易被修改示例:
arr.constructor = Object;
console.log(arr.constructor === Array); // false

如何遍历对象所有的key和value

1. 使用 for...in 循环

遍历对象及其原型链上的所有 ​可枚举属性​(包括继承的属性)。通常需要配合 hasOwnProperty() 过滤掉继承属性。

const obj = { a: 1, b: 2, c: 3 };

for (const key in obj) {
  if (obj.hasOwnProperty(key)) { // 过滤继承属性
    console.log(`Key: ${key}, Value: ${obj[key]}`);
  }
}

2. 使用 Object.keys()

获取对象自身的所有 ​可枚举属性 的键名数组,再通过 forEach 遍历:

const obj = { a: 1, b: 2, c: 3 };

Object.keys(obj).forEach(key => {
  console.log(`Key: ${key}, Value: ${obj[key]}`);
});

3. 使用 Object.values()

直接获取对象自身的所有 ​可枚举属性 的值数组:

const obj = { a: 1, b: 2, c: 3 };

Object.values(obj).forEach(value => {
  console.log(`Value: ${value}`);
});

4. 使用 Object.entries()

获取对象自身的所有 ​可枚举属性 的键值对数组(推荐,直接获取键值对):

const obj = { a: 1, b: 2, c: 3 };

Object.entries(obj).forEach(([key, value]) => {
  console.log(`Key: ${key}, Value: ${value}`);
});

5. 使用 for...of + Object.entries()

结合 for...of 语法更简洁地遍历键值对:

const obj = { a: 1, b: 2, c: 3 };

for (const [key, value] of Object.entries(obj)) {
  console.log(`Key: ${key}, Value: ${value}`);
}

6. 遍历所有属性(包括不可枚举属性)​

如果需要遍历对象自身的所有属性(包括不可枚举的),使用 Object.getOwnPropertyNames()

const obj = Object.create({}, {
  a: { value: 1, enumerable: true },  // 可枚举
  b: { value: 2, enumerable: false } // 不可枚举
});

Object.getOwnPropertyNames(obj).forEach(key => {
  console.log(`Key: ${key}, Value: ${obj[key]}`);
});
方法包含继承属性包含不可枚举属性返回值类型
for...in✅ 是❌ 否遍历键名
Object.keys()❌ 否❌ 否键名数组
Object.values()❌ 否❌ 否值数组
Object.entries()❌ 否❌ 否键值对数组
Object.getOwnPropertyNames()❌ 否✅ 是键名数组

computed 和 watch 的区别

  1. computed 是根据现有数据生成新数据,watch监听响应式数据的变化,并在变化时执行回调函数。
  2. computed计算属性是惰性的,只有在依赖的响应式数据变化时才会重新计算,会缓存计算结果, watch每次数据变化时立即执行回调,无缓存
  3. 语法区别:computed有返回值,watch无返回值,执行回调
  4. computed计算派生数据,避免不必要的重复计算,watch 可以用来执行异步操作、处理副作用操作,如 API 请求

watch 和 watchEffect 的区别

1. 依赖追踪方式
  • watch :需要显式声明依赖,监听指定的数据源;可以监听多个数据源或进行深度监听。
import { watch, reactive } from 'vue'
const state = reactive({
  count: 0,
})
watch(
  () => state.count, // 显式声明监听的依赖
  (newCount, oldCount) => {
    console.log(`新值 ${newCount} 老值 ${oldCount}`)
  }
)
  • watchEffect :会自动追踪 作用域内所有的响应式依赖,不需要显式声明依赖。
import { watchEffect, reactive } from 'vue'
const state = reactive({
  count: 0,
})
watchEffect(() => {
  console.log(`Count 变化了: ${state.count}`) // 自动追踪 `state.count`
})
2. 执行时机
  • watch :在监听的响应式数据变化后立即执行。
  • watchEffect :在 组件挂载时 执行一次副作用,并在 依赖发生变化时 再次执行。
3.应用场景
  • watch:适用于API 请求、保存操作等。适合需要 访问新值和旧值 进行比较的场景。
  • watchEffect:不需要访问旧值,适用于 自动追踪多个响应式依赖 的副作用,如渲染、自动保存等。