一、typeof 能判断哪些类型?
-
基本数据类型:
undefined
(值为undefined
的变量)boolean
(布尔值true
或false
)number
(数值,包括整数、浮点数、NaN
和Infinity
)string
(字符串)symbol
(ES6 新增的符号类型)bigint
(ES2020 新增的大整数类型)
-
函数类型:
普通函数、箭头函数、构造函数等返回
function
。 -
其他引用类型:
除函数外的所有对象(包括
null
、数组、日期、正则等)均返回object
,因此无法区分具体对象类型。

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

值类型(基本类型)
1. 类型分类
- 常见类型 :
Number
、String
、Boolean
、Null
、Undefined
、Symbol
、BigInt
。 - 特点:数据直接存储在栈内存中,变量保存的是实际值。
2. 复制行为
-
值传递 :复制时创建独立副本,修改互不影响。
3. 比较方式
-
值比较:直接比较值是否相等。
-
引用类型
1. 类型分类
- 常见类型 :
Object
、Array
、Function
、Date
、RegExp
等。 - 特点:数据存储在堆内存中,变量保存的是指向堆内存的引用地址。
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 原型机制的 "语法糖"(甜语法),让你写代码时更像传统面向对象,但底层还是靠原型和原型链实现 "属性方法共享、继承" 这些功能~ 这样是不是好懂点啦