JavaScript基础之基于数据类型和引用数据类型

简介: JavaScript基础之基于数据类型和引用数据类型

原文合集地址如下,有需要的朋友可以关注

本文地址

数据类型

JavaScript的数据类型有7中,包括6个基本类型和一个引用类型
基本数据类型:number, string, boolean, null, undefined, symbol
引用数据类型:object(数组、对象、函数、正则等)

基本数据类型和引用数据类型的区别

  • 存储方式
    基本类型:基本数据类型的值直接存储在改变量所分配的内存空间中,它们是简单数据类型,占用的空间小
    引用类型:引用数据类型的值存储在堆内存中,变量存储的是对象在堆内存的地址,而不是实际的值,所以引用数据的大小不固定, 可以包含大量数据。
    • 赋值行为
      基本类型:将一个基本数据类型赋值给另一个变量,直接将该值的副本赋值给新的变量
      引用类型:而将引用数据类型的变量赋值给另一个变量,是将该引用类型的地址给另一个变量,不是直接的值,两个变量指向同一个数据,当修改另一个变量时,此变量的值也会跟着变。
    • 比较方式
      基本数据类型:基本数据类型的值通过它们的实际值进行比较。
      引用数据类型:引用数据类型的值比较的是它们在内存中的地址(引用),而不是实际的值。因此,即使两个对象具有相同的属性和值,它们在内存中是不同的对象,比较结果会是 false。

基本数据类型:

let num1 = 42;
let num2 = num1; // 复制值,num2 现在是 42 的副本
num1 = 100; // 修改 num1 的值不会影响 num2

console.log(num1); // 输出 100
console.log(num2); // 输出 42

引用数据类型:

const obj1 = {
    name: "John" };
const obj2 = obj1; // 复制引用,obj2 指向 obj1 引用的对象

obj1.name = "Alice"; // 修改 obj1 的属性,也会影响 obj2

console.log(obj1.name); // 输出 "Alice"
console.log(obj2.name); // 输出 "Alice",因为 obj2 指向与 obj1 相同的对象

判断变量的数据类型

typeof

typeof运算符用来获取数据的类型。但是对于 null 返回的是 "object",这是历史遗留问题,可能会导致误判。
对于函数返回的是 "function",但函数也是对象的一种,因此不能准确区分一个变量是简单的函数还是其他类型的对象。

typeof "hello" // 返回 "string"
typeof 42 // 返回 "number"
typeof true // 返回 "boolean"
typeof undefined // 返回 "undefined"
typeof null // 返回 "object"
typeof [] // 返回 "object"
typeof {
   } // 返回 "object"
typeof function(){
   } // 返回 "function"

instanceof

instanceof 运算符用于检查一个对象是否属于某个特定类的实例。
但是它只能判断赋复杂数据类型,不能判断基本数据类型。

const myArray = [];
const myDate = new Date();

console.log(myArray instanceof Array); // 输出 true
console.log(myArray instanceof Object); // 输出 true,因为 Array 是 Object 的子类
console.log(myDate instanceof Date); // 输出 true
console.log(myDate instanceof Object); // 输出 true,因为 Date 是 Object 的子类

Array.isArray()

Array.isArray()用于判断值是否为数组类型。

console.log(Array.isArray([])); // 输出 true
console.log(Array.isArray({
   })); // 输出 false

Object.prototype.toString.call()

使用 Object.prototype.toString.call() 方法:这是一种通用的方法,可以检测几乎所有的数据类型。

console.log(Object.prototype.toString.call("hello")); // 输出 "[object String]"
console.log(Object.prototype.toString.call(42)); // 输出 "[object Number]"
console.log(Object.prototype.toString.call(true)); // 输出 "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)); // 输出 "[object Undefined]"
console.log(Object.prototype.toString.call(null)); // 输出 "[object Null]"
console.log(Object.prototype.toString.call([])); // 输出 "[object Array]"
console.log(Object.prototype.toString.call({
   })); // 输出 "[object Object]"
console.log(Object.prototype.toString.call(function () {
   })); // 输出 "[object Function]"
console.log(Object.prototype.toString.call(new Date())); // 输出 "[object Date]"

虽然上述方法在很多情况下可以满足数据类型判断的需求,但它们也有一些弊端需要注意:

  1. typeof 的问题:

    • 对于 null 返回的是 "object",这是历史遗留问题,可能会导致误判。例如,无法准确判断一个变量是 null 还是对象。
    • 对于函数返回的是 "function",但函数也是对象的一种,因此不能准确区分一个变量是简单的函数还是其他类型的对象。
  2. instanceof 的问题:

    • instanceof 只能检测对象类型,并且还要考虑原型链。如果对象是在不同的全局上下文中创建的,或者涉及多个框架,instanceof 可能会失效。
    • 不能判断基本数据类型,如字符串、数字、布尔值等。
  3. Array.isArray() 的问题:

    • Array.isArray() 只能判断数组类型,不能判断其他对象类型。
  4. Object.prototype.toString.call() 的问题:

    • 这种方法虽然可以准确判断大部分类型,但使用起来较为繁琐,需要额外的调用,并且不够直观。
    • 如果出现自定义类的实例,Object.prototype.toString.call() 只会返回 "[object Object]",无法具体判断其属于哪个类。

封装判断变量的数据类型函数

这里分别用了typeof和Object.prototype.toString.call()方法。

/**
 * @param 要判断类型的值
 * @returns 数据类型
 */
export const getDataType = (value: any) => {
   
  if (typeof value === "object") {
   
    if (value === null) return "null";
    if (Array.isArray(value)) return "array";
    return "object";
  }
  return typeof value;
};

export const getDataType2 = (value: any) => {
   
  const type = Object.prototype.toString.call(value);
  if (type === "[object String]") return "string";
  if (type === "[object Number]") return "number";
  if (type === "[object Boolean]") return "boolean";
  if (type === "[object Undefined]") return "undefined";
  if (type === "[object Null]") return "null";
  if (type === "[object Array]") return "array";
  if (type === "[object Object]") return "object";
  if (type === "[object Function]") return "function";
  if (type === "[Object Date]") return "date";
};
目录
相关文章
|
4月前
|
存储 JavaScript 对象存储
js检测数据类型有那些方法
js检测数据类型有那些方法
146 59
|
20天前
|
存储 JavaScript 前端开发
JavaScript中的数据类型以及存储上的差别
通过本文的介绍,希望您能够深入理解JavaScript中的数据类型及其存储差别,并在实际编程中灵活运用这些知识,以提高代码的性能和稳定性。
48 3
|
2月前
|
存储 JavaScript 前端开发
js中的数据类型
JavaScript 中的数据类型包括五种基本类型(String、Number、Undefined、Boolean、Null)和三种引用类型(Object、Array、Function,以及ES6新增的Symbol)。基本类型直接存储值,引用类型存储的是指向实际数据的内存地址。了解它们的区别对于掌握 JavaScript 的变量赋值和函数传参至关重要。
27 1
|
3月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
132 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
3月前
|
JavaScript 前端开发 开发者
【干货拿走】JavaScript中最全的数据类型判断方法!!!!
【干货拿走】JavaScript中最全的数据类型判断方法!!!!
32 1
|
4月前
|
JavaScript 前端开发
JavaScript基础知识-基本数据类型和引用数据类型
关于JavaScript基础知识的文章,主要介绍了基本数据类型和引用数据类型。
49 2
JavaScript基础知识-基本数据类型和引用数据类型
|
3月前
|
存储 JavaScript 前端开发
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
JavaScript数据类型全解:编写通用函数,精准判断各种数据类型
59 0
|
4月前
|
存储 前端开发 JavaScript
前端基础(三)_JavaScript数据类型(基本数据类型、复杂数据类型)
本文详细介绍了JavaScript中的数据类型,包括基本数据类型(Number、String、Boolean、Undefined、Null)和复杂数据类型(Object),并解释了如何使用`typeof`操作符来识别变量的数据类型。同时,还讨论了对象、函数和数组等复杂数据类型的使用方式。
87 2
|
5月前
|
JavaScript 前端开发
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
这篇文章是JavaScript基础与实战教程的第一部分,涵盖了JavaScript的基本语法、标识符、数据类型以及如何进行强制类型转换,通过代码示例介绍了JS的输出语句、编写位置和数据类型转换方法。
JavaScript基础&实战(1)js的基本语法、标识符、数据类型
|
5月前
|
开发者 图形学 开发工具
Unity编辑器神级扩展攻略:从批量操作到定制Inspector界面,手把手教你编写高效开发工具,解锁编辑器隐藏潜能
【8月更文挑战第31天】Unity是一款强大的游戏开发引擎,支持多平台发布与高度可定制的编辑器环境。通过自定义编辑器工具,开发者能显著提升工作效率。本文介绍如何使用C#脚本扩展Unity编辑器功能,包括批量调整游戏对象位置、创建自定义Inspector界面及项目统计窗口等实用工具,并提供具体示例代码。理解并应用这些技巧,可大幅优化开发流程,提高生产力。
470 1