面试题解析之对象类型的判断

对象类型是引用类型的一种,表示一个存储了键值对的集合。在对对象类型进行判断之前,我来为大家回忆一下有哪些数据类型。

数据类型有哪些

在 JavaScript中,数据类型可以分为原始类型和引用类型。

原始类型:

  1. 字符串(String) :表示一串字符。
  2. 数字(Number) :表示数值。
  3. 布尔值(Boolean) :表示真或假。
  4. 空值(Null) :表示一个空值对象。
  5. 未定义(Undefined) :表示一个未定义的值。
  6. Symbol:表示唯一的标识符。

原始类型是不可改变的简单数据类型,它的值在赋值和传递时,是按值传递的,即复制了原始值本身。

ini 复制代码
var a = 18;
var b = a;
a = 10;
console.log(b); // 输出: 18

引用类型:是可以改变的复杂数据类型

  1. 对象(Object) :表示键值对的集合。
  2. 数组(Array) :表示有序的值的集合。
  3. 函数(Function) :表示可执行的代码块。

引用类型的值在赋值和传递时,是按引用传递的,即复制了引用(指向内存中的对象)。

ini 复制代码
var obj1 = { name: '张三' };
var obj2 = obj1;
obj1.name = '李四';
console.log(obj2.name); // 输出: 李四

需要注意的是,虽然原始类型的值是不可改变的,但是我们可以通过重新赋值来改变变量的值。而引用类型的值是可变的,所以改变对象的属性会影响到所有引用该对象的变量。

对象类型的判断

typeof

javascript 复制代码
console.log(typeof 42); // 输出: "number"
console.log(typeof "Hello"); // 输出: "string"
console.log(typeof true); // 输出: "boolean"
console.log(typeof undefined); // 输出: "undefined"
console.log(typeof null); // 输出: "object" (这是 typeof 操作符的一个特殊情况)
console.log(typeof {}); // 输出: "object"
console.log(typeof []); // 输出: "object" (数组也是一种对象)
console.log(typeof function(){}); // 输出: "function"

typeof 运算符虽然可以帮助我们判断一个值是否为对象类型,但无法准确区分对象、数组和 null。为了更精确地判断一个值是否为对象类型,我们可以使用其他方法。


instanceof

javascript 复制代码
var obj = {};
var arr = [];
var nullValue = null;

console.log(obj instanceof Object); // 输出: true
console.log(arr instanceof Array); // 输出: true
console.log(nullValue instanceof Object); // 输出: false

instanceof 操作符用于检测构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。如果是,则返回 true;否则返回 false

需要注意的是,instanceof 操作符只能用来判断对象是否是某个构造函数创建的实例,而不能用来判断基本数据类型(如字符串、数字、布尔值等)的类型。


Object.prototype.toString.call(xx)

javascript 复制代码
var obj = {};
var arr = [];
var str = "Hello";
var num = 42;

console.log(Object.prototype.toString.call(obj)); // 输出: "[object Object]"
console.log(Object.prototype.toString.call(arr)); // 输出: "[object Array]"
console.log(Object.prototype.toString.call(str)); // 输出: "[object String]"
console.log(Object.prototype.toString.call(num)); // 输出: "[object Number]"

Object.prototype.toString 是 JavaScript 所有对象都具有的方法,它返回一个表示当前对象类型的字符串,格式为 "object 类型"。通过使用 call 方法,我们可以改变 this 的指向,从而让 toString 方法作用于传入的参数 xx

总结

  • 可以使用 typeof 操作符来判断基本数据类型和大部分对象类型,而使用 instanceof 操作符来判断对象是否是特定构造函数创建的实例。
  • 可以通过Object.prototype.toString.call(xx)获得类似 objectType 的字符串。
  • instanceof可以正确的判断对象的类型,因为它用于检测构造函数的 prototype 属性是否出现在对象的原型链中。
相关推荐
用户156306810351几秒前
Day01 | 什么是Agent?
面试
Momo__3 分钟前
VueUse createReusableTemplate —— 单文件组件内的模板复用神器
前端·vue.js
只一7 分钟前
😭从回调地狱到 async/await:一文打通 Ajax 与 JS 异步编程
javascript
程序员小富10 分钟前
我开源了一个开发者专属的智能 JSON 工具,得到了媳妇高度认可
前端·vue.js·后端
小小小小宇10 分钟前
程序员如何给 LLM 装工具以及看懂推理过程
前端
写代码的皮筏艇10 分钟前
React中的forwardRef
前端·react.js·面试
槑有老呆19 分钟前
花三个月工资请了个 AI 程序员,结果它连青岛啤酒股价都查不了
前端
风骏时光牛马21 分钟前
Verilog开发常见问题汇总解析
前端
子兮曰23 分钟前
AI Coding Method Map:一张图看懂 AI 编程的完整链路
前端·人工智能·后端