2025——js 面试题

一、typeof 能判断哪些类型?

  1. 基本数据类型

    • undefined(值为 undefined 的变量)
    • boolean(布尔值 truefalse
    • number(数值,包括整数、浮点数、NaNInfinity
    • string(字符串)
    • symbol(ES6 新增的符号类型)
    • bigint(ES2020 新增的大整数类型)
  2. 函数类型

    普通函数、箭头函数、构造函数等返回 function

  3. 其他引用类型

    除函数外的所有对象(包括 null、数组、日期、正则等)均返回 object,因此无法区分具体对象类型。

二、何时使用===何时使用=?

1. 严格相等 ===
  • 不进行类型转换,直接比较值和类型是否完全相同。
  • 推荐优先使用,避免隐式类型转换带来的意外结果。
  • 适用场景
    • 需要精确比较值和类型时(如判断变量是否为 nullundefined)。
    • 避免 0、空字符串 ""false 等被误判为相等(如 0 == false 返回 true,但 0 === false 返回 false)。
2. 宽松相等 ==
  • 进行类型转换,先将两边的值转换为相同类型,再比较值是否相等。
  • 谨慎使用 ,可能导致非预期结果(如 "" == 0 返回 true)。
  • 适用场景
    • 明确需要处理类型差异的情况(如表单输入值与数值比较)。

三、值类型和引用类型的区别?

值类型(基本类型)

1. 类型分类
  • 常见类型NumberStringBooleanNullUndefinedSymbolBigInt
  • 特点:数据直接存储在栈内存中,变量保存的是实际值。
2. 复制行为
  • 值传递 :复制时创建独立副本,修改互不影响。

    3. 比较方式
  • 值比较:直接比较值是否相等。

引用类型

1. 类型分类
  • 常见类型ObjectArrayFunctionDateRegExp等。
  • 特点:数据存储在堆内存中,变量保存的是指向堆内存的引用地址。
2. 复制行为
  • 引用传递:复制时只复制引用地址,而非实际对象。修改一个变量会影响其他引用同一对象的变量。
3. 比较方式
  • 引用比较:比较引用地址是否相同,而非对象内容

四、手写深拷贝?

五、变量计算------类型转换

字符串拼接

==运算符

if语句和逻辑运算

truly变量:!!a===true变量

falsely变量 !!a===false变量

六、原型和原型链

如何判断一个变量是不是数组?(instanceof)

1.使用Array.isArray()方法(推荐)

优点:简单、可靠、跨 iframe 安全

2.使用 instanceof 操作符

局限性:

  • 在跨 iframe 环境中可能不准确
  • 当原型链被修改时可能产生误判
3. 使用 Object.prototype.toString.call()

优点:跨 iframe 安全,可靠

4. 使用 Array.prototype.isPrototypeOf()5. 使用 constructor 属性

局限性:当原型链被修改时可能不准确

6. 自定义工具函数

推荐方案

在大多数情况下,推荐使用 Array.isArray() 方法,因为它简洁、高效且跨环境安全。如果需要兼容非常旧的浏览器(如 IE8 及以下),可以使用 Object.prototype.toString.call() 方法作为替代。

对于 TypeScript 项目,还可以结合类型守卫:

七、手写一个简易的jquery,考虑插件和扩展性?

八、class的原型本质,怎么理解?

1. 先想 "类(class)" 是啥

比如用 class 写个 Person(人)类,像这样:

js

复制代码
class Person {
  constructor(name) {
    this.name = name; // 每个实例独有的"姓名"
  }
  sayHi() { // 大家通用的"打招呼方法"
    console.log(`你好,我是${this.name}`);
  }
}

class 看着是 "模板",但本质上还是基于 JavaScript 原型机制实现的,只是语法更像传统面向对象语言(比如 Java),让写法更简洁好懂。

2. 原型(prototype)="家族工具箱"

  • 每个 class 背后,都有个原型对象 (比如 Person.prototype),就像 "家族共用的工具箱"。
  • 你在 class 里写的方法 (比如 sayHi),其实都藏在这个 "工具箱" 里。
  • class 创建的实例(比如 new Person('小明')),会 "隐性连接" 到这个原型对象 ------ 需要方法时,会去 "工具箱" 里找。

3. 原型链 ="家族传承链"

  • 当你调用实例的方法(比如 小明.sayHi()),JavaScript 会先看实例自己有没有这个方法。
    • 如果没有,就顺着原型链 往上找:先找 Person.prototype,再找更上层的原型(比如 Object.prototype),直到找到或者到顶(null)。
  • 这就像家族里,小明要找工具,先翻自己家抽屉(实例自身),没有就找家族工具箱(Person.prototype),还没有就找 "人类通用工具箱"(Object.prototype,比如 toString 方法)。

4. 用生活例子总结

  • class :是 "家族规矩" 的简洁写法,规定了 "每个成员(实例)该有啥属性(name)、家族工具箱(prototype)里放啥方法(sayHi)"。
  • 原型(prototype):是 "家族共用工具箱",存着大家通用的能力(方法),避免每个成员重复带工具(节省内存)。
  • 原型链:是 "家族传承的搜索链",找方法时从自己开始,一路往上翻家族工具箱,直到找到或到顶。

简单说,class 是 JavaScript 原型机制的 "语法糖"(甜语法),让你写代码时更像传统面向对象,但底层还是靠原型和原型链实现 "属性方法共享、继承" 这些功能~ 这样是不是好懂点啦

相关推荐
快下雨了L几秒前
Lua现学现卖
开发语言·lua
香饽饽~、1 小时前
【第十一篇】SpringBoot缓存技术
java·开发语言·spring boot·后端·缓存·intellij-idea
Devil枫2 小时前
Kotlin扩展函数与属性
开发语言·python·kotlin
菠萝加点糖2 小时前
Kotlin Data包含ByteArray类型
android·开发语言·kotlin
2301_803554523 小时前
c++中类的前置声明
java·开发语言·c++
Cacciatore->5 小时前
Electron 快速上手
javascript·arcgis·electron
vvilkim5 小时前
Electron 进程间通信(IPC)深度优化指南
前端·javascript·electron
不想写bug呀6 小时前
多线程案例——单例模式
java·开发语言·单例模式
某公司摸鱼前端6 小时前
ES13(ES2022)新特性整理
javascript·ecmascript·es13
我不会写代码njdjnssj7 小时前
网络编程 TCP UDP
java·开发语言·jvm