JavaScript数据类型 以及检测方法

在JavaScript中,数据类型是编程中非常重要的概念,它决定了数据的性质、如何存储以及如何操作这些数据。以下是JavaScript中的主要数据类型、它们的区别以及数据类型检测的方式的详细介绍。

JavaScript的主要数据类型

1. 原始数据类型(Primitive Types)
  • Number: 表示数字,包括整数和浮点数。
let num = 42; // 整数
let floatNum = 3.14; // 浮点数
  • String: 表示文本或字符序列。
let str = "Hello, world!";
  • Boolean: 表示逻辑值,只有两个值:truefalse
let isTrue = true;
let isFalse = false;
  • Null: 表示一个空的值或没有对象。它是 null 值的唯一实例。
let nullValue = null;
  • Undefined: 当变量声明了但没有赋值时,它的值就是 undefined
let undefinedVar;
console.log(undefinedVar); // 输出: undefined
  • Symbol: 唯一且不可变的数据类型,常用于对象属性的键。
let sym = Symbol('mySymbol');
2. 对象数据类型(Object Types)
  • Object: 用于存储键值对的集合。
let obj = {key1: 'value1',key2: 'value2'
};
  • Array: 有序的元素集合。
let arr = [1, 2, 3, 'four', true];
  • Function: 可执行的代码块,也是对象的一种。
function myFunction() {console.log('Hello from a function!');
}
  • 其他内置对象:如 DateRegExpError 等,以及自定义的对象。

数据类型的区别

  • 原始数据类型:这些类型的数据直接存储在变量位置的内存里,它们在赋值时会创建副本。
  • 对象数据类型:对象类型的值实际上是对堆内存中对象位置的引用,它们在赋值时只是复制了引用地址。

数据类型检测的方式

1. 使用 typeof 操作符
console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof null); // "object" (注意,这是一个常见的误解)
console.log(typeof undefined); // "undefined"
console.log(typeof Symbol('sym')); // "symbol"
console.log(typeof {}); // "object"
console.log(typeof []); // "object" (数组也是对象)
console.log(typeof function() {}); // "function"
2. 使用 instanceof 操作符

主要用于检测对象是否属于某个构造函数的实例。

let arr = [];
console.log(arr instanceof Array); // truelet date = new Date();
console.log(date instanceof Date); // truefunction MyObject() {}
let obj = new MyObject();
console.log(obj instanceof MyObject); // true
3. 使用 constructor 属性

可以通过检查对象的 constructor 属性来确定其构造函数。

let num = 42;
console.log(num.constructor === Number); // truelet str = "hello";
console.log(str.constructor === String); // truelet arr = [];
console.log(arr.constructor === Array); // true

注意constructor 属性可以被修改,因此不总是可靠的检测方式。

4. 使用 Object.prototype.toString.call()

这是检测数据类型最可靠的方式之一,因为它返回的是对象的内部类。

let num = 42;
console.log(Object.prototype.toString.call(num)); // "[object Number]"let str = "hello";
console.log(Object.prototype.toString.call(str)); // "[object String]"let arr = [];
console.log(Object.prototype.toString.call(arr)); // "[object Array]"let obj = {};
console.log(Object.prototype.toString.call(obj)); // "[object Object]"let date = new Date();
console.log(Object.prototype.toString.call(date)); // "[object Date]"let nullValue = null; 
console.log(Object.prototype.toString.call(nullValue)); // "[object Null]"let undefinedVar; 
console.log(Object.prototype.toString.call(undefinedVar)); // "[object Undefined]"let sym = Symbol('mySymbol'); 
console.log(Object.prototype.toString.call(sym)); // "[object Symbol]"let func = function() {}; 
console.log(Object.prototype.toString.call(func)); // "[object Function]"

Object.prototype.toString.call() 方法可以非常准确地确定一个变量的类型,因为它不依赖于变量自身的 toString 方法,这个方法可以被重写,而 Object.prototype.toString 是无法被对象自身修改的。

注意事项

  • typeof null 会返回 "object",这是一个历史上的错误,但在JavaScript中一直保留了下来。
  • 数组和 null 使用 instanceof 会返回 false,因为 instanceof 是用来检测一个对象是否是一个构造函数的 prototype 属性指向的原型链上的实例。
  • 当使用 constructor 属性时,需要注意它可能已经被更改,因此它可能不是一个可靠的类型检测方式。

在实际编程中,通常需要根据具体的应用场景和精度要求来选择合适的类型检测方式。对于简单的类型检测,typeof 通常足够;对于更复杂的对象类型检测,可能需要结合使用 instanceofObject.prototype.toString.call()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

selenium反反爬虫,隐藏selenium特征

一、stealth.min.js 使用 用selenium爬网页时,常常碰到被检测到selenium ,会被服务器直接判定为非法访问,这个时候就可以用stealth.min.js 来隐藏selenium特征,达到绕过检测的目的 from selenium import webdriver from seleniu…

Day 2 正式coding之基础模块的搭建

Day 2 正式coding之基础模块的搭建 这里会总结构建项目过程中遇到的问题,以及一些个人思考!! 学习方法: 1 github源码 文档 官网 2 内容复现 ,实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端…

Spring基础篇-快速面试笔记(速成版)

文章目录 1. Spring概述2. 控制反转(IoC)2.1 Spring声明Bean对象的方式2.2 Spring的Bean容器:BeanFactory2.3 Spring的Bean生命周期2.4 Spring的Bean的注入方式 3. Spring的事件监听器(Event Listener)3.1 Spring内置事…

自学Java的第二十四次笔记

一,方法重载 1.基本介绍 java 中允许同一个类中,多个同名方法的存在,但要求 形参列表不一致! 比如: System.out.println(); out 是 PrintStream 类型 2.重载的好处 1) 减轻了起名的麻烦 2) 减轻了记名的麻烦 3.快速入门案…

Linux crontab练习之在系统中设定定时任务并优化定时任务

Linux crontab练习之在系统中设定定时任务并优化定时任务_2 要求 每天凌晨4点系统的设备使用信息并以邮件的方式放送到root邮箱中确保此任务为系统定时任务 脚本实现 #!/bin/bashdnf install postfix s-nail-14.9.22-6.el9.x86_64 -y &> /dev/nullsystemctl enable …

认识海康摄像头的编码信息以及使用等

认识海康摄像头的编码信息以及使用等 主要是来源一下文章: 海康摄像头、NVR命名规则-弱电新人学习! - 知乎 大体是分了三类,当然海康的产品实在是有点多,没找见官方权威的解答,参考着先看看。 网络摄像机、网络球机…

浅谈Java JVM

Java虚拟机(Java Virtual Machine,简称JVM)是Java语言的核心组成部分,它是一个抽象的计算机,负责执行Java字节码指令。JVM是Java平台无关性的基石,它为Java代码提供了一个标准的运行环境,使Java…

golang-基础语法

make 和 new 的区别 make 和 new 都是用来分配内存 make 只能对 slice map channel 进行初始化结构体实例。new 可以对任意类型进行初始化make 用于分配数据对象的具体实例,new 用于分配数据类型的默认值,并返回该数据的指针。 new 出来的 slice 、ma…

【Nginx】MACOS 安装与部署

安装 【前景提要】 1.本文需要使用 Homebrew,没有的建议先安装一下,很好用 国内下载有不可抗力,想要快速下载可以参考这里 2.进入 Terminal(终端/黑窗口),输入以下指令: brew install nginx我…

爬虫(小案例)

点开其中一个链接, http://desk.zol.com.cn/dongman/huoyingrenzhe/(前面为浏览器自动补全,在代码里需要自己补全) 可以看到图片的下载地址以及打开本图集下一张图片的链接 了解完网站的图片构造后动手写代码,我们筛…

html5测试题整理--针对标签的概念性,我们究竟还要学习哪些软件测试知识

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…

Ubuntu20.04版本命令行设置挂载磁盘,并设置开机自动挂载

最近部署应用 系统是Ubuntu20.4版本的Linux系统,加了数据盘,需要格式化后挂载,记录下: Linux 数据盘挂载(采用 parted 分区工具)-格式化为 ext4 1. 初始化 Linux 数据盘 挂载数据盘后或者随实例创建时一并创建的数据盘&#xff…

使用SpringBoot3+Vue3开发公寓管理系统

项目介绍 公寓管理系统可以帮助公寓管理员更方便的进行管理房屋。功能包括系统管理、房间管理、租户管理、收租管理、房间家具管理、家具管理、维修管理、维修师傅管理、退房管理。 功能介绍 系统管理 用户管理 对系统管理员进行管理,新增管理员,修改…

碳课堂|碳关税是什么?企业如何从容应对?

2023年10月1日,欧盟碳边境调节机制(CBAM)法规,即全球首个“碳关税”开始实施。据世界银行研究报告称,如果“碳关税”全面实施,在国际市场上,中国制造可能将面临平均26%的关税,出口量…

Android JetPack Compose+Room----实现搜索记录功能

文章目录 需求概述功能展示实现搜索功能使用的技术1.Android Jetpack room2.Android JetPack Compose 代码实现编写搜索界面接入Room实现搜索功能的管理引入依赖定义包结构定义操作表的Dao类定义数据库的基础配置定义数据库的Dao管理类使用数据库升级 源码地址 需求概述 搜索功…

c++中pair的使用方式以及一些常见的操作

c中pair的使用方式以及一些常见的操作 说明 在C中&#xff0c;std::pair 是一个标准库模板&#xff0c;用于将两个值作为一个单元进行存储。可以使用std::pair来将两个值组合成一个有序对。 头文件 #include <utility>创建 std::pair 对象 可以使用多种方式创建 std…

台灯目前口碑最好的护眼灯有哪些?分享多款高口碑护眼灯

根据数据表明中国近视患者人数已达到7亿&#xff0c;关于视力问题&#xff0c;而儿童及中小学生居多&#xff0c;关于视力问题&#xff0c;很多人都归咎于幼时学习时的用眼时间过长&#xff0c;但这只是其中的一部分&#xff0c;不合适的光源环境影响也是非常大的&#xff0c;尤…

006Node.js cnpm的安装

百度搜索 cnpm,进入npmmirror 镜像站https://npmmirror.com/ cmd窗口输入 npm install -g cnpm --registryhttps://registry.npmmirror.com

Fluke ADPT连接器(隔离版)----发布2

代替手工记录、记录后在整理的麻烦&#xff0c;轻点鼠标&#xff08;单次采集、自动时间间隔采集自由选择&#xff09;即可完成&#xff0c;测试数据导出图片、导出数据到EXCEL文件随意选择&#xff1b; 所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b;内附链接 ● …