判断JS数据类型的五种方法

article/2025/10/19 14:03:45

JavaScript 中常见的几种数据类型:

目录

JavaScript 中常见的几种数据类型:

一、分类

二、判断

1、typeof

null既然属于基本数据类型,为什么用typeof返回的是object呢?

js小数运算出现的问题(精度丢失)

解决方法一

解决方法二

解决方法三

2、instanceof

3、constructor

细节问题:

4、Object.prototype.toString 

5、===

三、相关问题

1、undefined 与 null的区别

2、什么时候给变量赋值为null呢?

3、严格区分变量类型和数据类型?


一、分类

基本类型:string,number,boolean,symbol(ES6新增)基本类型中也有两个特殊的类型,即:undefined,null

引用类型:Object,Function,Array,RegExp,Date,...

二、判断

1、typeof

typeof 返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、object、undefined、function等6种数据类型

   typeof '123'       string   // 有效typeof 1           number   // 有效typeof true        boolean  // 有效typeof Symbol('1') symbol   // 有效typeof undefined   undefined // 有效typeof {a:1,b:2}   object   // 有效function c(){console.log('123')}typeof c          function  // 有效typeof null        object  // 无效typeof  [] ;  //object 无效typeof  new  Date();  //object 无效typeof  new  RegExp();  //object 无效

总结:typeof 可以对JS基础数据类型做出准确的判断,而对于引用类型返回的基本上都是object, 其实返回object也没有错,因为所有对象的原型链最终都指向了Object,Object是所有对象的`祖宗`。 但当我们需要知道某个对象的具体类型时,typeof 就显得有些力不从心了

null既然属于基本数据类型,为什么用typeof返回的是object呢?

js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息?
000:对象
010:浮点数
100:字符串
110:布尔
1:整数
但是对于 undefined 和 null 来说,这两个值的信息存储是有点特殊的。
null:所有机器码均为0
undefined:用 −2^30 整数来表示
所以,typeof 在判断 null 的时候就出现问题了,由于 null 的所有机器码均为0,因此直接被当做了对象来看待。

js小数运算出现的问题(精度丢失)

var num1 = 0.1
var num2 = 0.2
var num3 = num1 + num2
console.log(num3) // 0.30000000000000004

本质原因:计算机对于数据都是转换为二进制存储的,但是对于某些浮点数计算机无法将其精确表达为二进制

像0.5这种数字,可以很快计算得到2进制结果,但是0.1和0.2这样的数字,是永远不可能计算得到准确的2进制结果的,因为一直乘2,就没有得到整数的时候,此时在转换2进制的过程中,会形成无限死循环。

计算机内部在存储无限死循环数据时,必须要有一个限度,采取舍去的原则,所以,0.1和0.2在计算机内部存储的对应的2进制数字,本来就不精准,所以相加得到的2进制结果,也就不精准了,那转换成10进制后,是会有一定的误差的,所以结果不是精准的0.3。

计算机内部对于2进制小数,根据IEEE754标准(是一个仔细制定的表示浮点数及其运算的标准),小数部分最多会保留52位:

所以上面那段代码,在计算机中的运算过程其实是如下所示这样的

0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 
+
0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 
=
0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011

所以,不精准是正确的,只是偶尔会有两个不精准的数字相加,正好得到一个精准的值。

解决方法一

将需要运算的小数扩大10倍、100倍、。。。将小数扩大到整数,然后进行运行,最后再缩小扩大的倍数。例:

var num1 = 0.1
var num2 = 0.2
var num3 = (num1 * 10 + num2 * 10) / 10
console.log(num3) // 0.3

解决方法二

通过js中Number的内置方法toFixed,强制保留小数点后位数。例:

var num1 = 0.1
var num2 = 0.2
var num3 = num1 + num2
console.log(num3.toFixed(3)) // 0.300 - 强制保留小数点后3位

解决方法三

封装数学运算方法,当需要进行数学运算的时候,不直接进行,而调用自己封装的方法来实现数学运算。

细说JavaScript中小数点计算不精准的原因和解决方案

2、instanceof

instanceof 是用来判断 A 是否为 B 的实例对,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。 在这里需要特别注意的是:instanceof检测的是原型,我们用一段伪代码来模拟其内部执行过程:

instanceof (A,B) = {var  L = A.__proto__;var  R = B.prototype;if (L === R) {//A的内部属性__proto__指向B的原型对象return  true ;}return  false ;
}

从上述过程可以看出,当 A 的 __proto__ 指向 B 的 prototype 时,即A的原型链上可以找到B时,就认为A就是B的实例,我们再来看几个例子:

[] instanceof Array;  //true
{} instanceof Object; //true
new  Date() instanceof Date; //truefunction Person(){};
new  Person() instanceof Person; // true[] instanceof Object;  //true
new  Date() instanceof Object; //true
new  Person instanceof Object; //true

[] 的 __proto__  直接指向Array.prototype, 间接指向Object.prototype, 所以按照 instanceof 的判断规则,[] 就是Object的实例。当然,类似的new Date()、new Person() 也会形成这样一条原型链,因此,instanceof 只能用来判断两个对象是否属于原型链的关系, 而不能获取对象的具体类型。

3、constructor

当一个函数F被定义时,JS引擎会为F添加prototype原型,然后再在prototype上添加一个constructor属性,并让其指向F的引用。如下所示:

当执行 var f = new F() 时,F被当成了构造函数,f是F的实例对象,此时F原型上的constructor传递到了f上,因此f.constructor == F

可以看出,JS在函数F的原型上定义了constructor,当F被当作构造函数用来创建对象时,创建的新对象就被标记为了“F” 类型,使得新对象有名有姓,可以追溯。

同理,JS中的数据类型也遵守这个规则

细节问题:

  • null和undefined是无效的对象,因此是不会有constructor存在的,这两种类型的数据需要通过typeof来判断。
  • JS对象的constructor是不稳定的,这个主要体现在自定义对象上,当开发者重写prototype后,原有的constructor会丢失,constructor会默认为Object

4、Object.prototype.toString 

toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是 toString运行时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型,其中包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,... 基本上所有对象的类型都可以通过这个方法获取到。 

Object.prototype.toString.call( '' ) ;    // [object String]Object.prototype.toString.call(1) ;     // [object Number]Object.prototype.toString.call( true ) ;  // [object Boolean]Object.prototype.toString.call(undefined) ;  // [object Undefined]Object.prototype.toString.call( null ) ;  // [object Null]Object.prototype.toString.call( new  Function()) ;  // [object Function]Object.prototype.toString.call( new  Date()) ;  // [object Date]Object.prototype.toString.call([]) ;  // [object Array]Object.prototype.toString.call( new  RegExp()) ;  // [object RegExp]Object.prototype.toString.call( new  Error()) ;  // [object Error]Object.prototype.toString.call(document) ;  // [object HTMLDocument]Object.prototype.toString.call(window) ;  //[object global] window是全局对象global的引

需要注意的是,必须通过Object.prototype.toString.call来获取,而不能直接 new Date().toString(), 从原型链的角度讲,所有对象的原型链最终都指向了Object, 按照JS变量查找规则,其他对象应该也可以直接访问到Object的toString方法,而事实上,大部分的对象都实现了自身的toString方法,这样就可能会导致Object的toString被终止查找,因此要用call来强制执行Object的toString方法。

5、===

  • 可以判断 undefined,null
var a;console.log(a, typeof a, typeof a === 'undefined', a === undefined); // undefined 'undefined' true trueconsole.log(undefined === 'undefined'); // falsea = 3;console.log(typeof a === 'number'); // truea = 'atguigu';console.log(typeof a === 'string'); // true  string小写a = true;console.log(typeof a === 'boolean'); // truea = null;console.log(typeof a, a === null); // object true// 2、对象数据类型var b1 = {b2:[1, 'abc', console.log],b3:function(){console.log('b3');return function(){return 'xfzhang';}}};// 判断是否是函数还有一种方式console.log(typeof b1.b3 === 'function'); // true

三、相关问题

实例:实例对象
类型:类型对象

1、undefined 与 null的区别

undefined 代表定义未赋值
null 代表定义并赋值了,只是值为null

2、什么时候给变量赋值为null呢?

初始赋值,表明将要赋值为对象
结束前,让对象称为垃圾对象(被垃圾回收器回收)

3、严格区分变量类型和数据类型?

数据的类型:① 基本类型 ② 对象类型(一般对象类型就是引用类型)
变量的类型(变量内存值的类型): ① 基本类型:保存的就是基本类型的数据 ② 引用类型:保存的是地址值


http://chatgpt.dhexx.cn/article/bbu6tTne.shtml

相关文章

Linux 文件类型及常用命令(2)(cp、mv、cat、more、less、head、tail、chmod、getenforce)

1、命令 cp:拷贝(类似于Windows系统的复制,但区别是可以重命名) 拷贝文件、目录(需要使用 -r 参数),可以重命名。 2、命令 mv:移动或重命名 ①如果是在当前目录下移动&#xff0c…

Linux验证SELinux状态

安全增强型Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。记录操作如何验证SELinux,并且避免系统无法启动的问题。 以root权限执行:sudo su - 运行命令getenforce,验证SELi…

Linux 查看 SELinux 的状态

可以运行下面的命令来查看当前服务配置的 SELinux 的状态。 getenforce 上面的输出状态显示了当前 SELinux 的配置状态。 如果上图显示当前的状态。 临时禁用 SELinux 。 使用下面的命令来临时禁用 SELinux。 setenforce 0 Linux 查看 SELinux 的状态 - 系统和容器 - OSSE…

Android Senlinux 基础说明

一、SELinux 三种模式简介 Enforcing:强制模式。代表SELinux在运行中,且已经开始限制domain/type之间的验证关系Permissive:宽容模式。代表SELinux在运行中,不过不会限制domain/type之间的验证关系,即使验证不正确&…

如何关闭防火墙和selinux操作

在每次部署相关软件的时候总是会遇到各种奇奇怪怪的问题,多半是防火墙没有关,或者是selinux没有关 如何关闭防火墙: 那先来看一下防火墙的状态:systemctl status firewalld 如果是下图所示开着的,那就把它给关了&am…

Linux下如何关闭SELinux的图文教程(完整版)

大家好! 最近遇到Mysql数据启动报错的问题,于是发现是因为SELinux没有关闭,那么这篇文章就简单的记录SElinux是如何让关闭的。 前言 SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现…

Android8.x/9.x/10.x user版本关闭selinux以及打开UART控制台输入和关闭内核日志输出功能

1、user版本关闭selinux 仅限于系统调试时使用,量产版本需要将其设置回去成ELINUX_ENFORCING模式。 1.1)背景 C:\Users\zhaojr> adb root C:\Users\zhaojr> adb remount C:\Users\zhaojr> adb shell ac8257:/ # getenforce getenforce Enforcing这个表明…

GeForce Experience 绕过登录与禁止自动更新

本文说明了,如何在未注册Nvidia账户的情况下,绕过GeForce Experience(以下简称为GFE)账户登录的方法,从而直接使用登陆后才能使用的各种功能。在PC未联网的情况下,此方法依旧能正常绕过登录,直接…

adb shell getenforce/setenforce(三级命令)

adb shell getenforce adb shell setenforce

PyTorch官方教程(中文版)

PyTorch官方教程(中文版) TENSOR概述初始化向量对Tensor的操作转移存储位置到GPU张量的切片操作张量的合并操作张量乘法将单元素tensor转换为基本数据类型 与NumPy的联系tensor转numpynumpy转tensor DATASETS & DATALOADERS载入数据集迭代和可视化数…

pytorch基础教程(目标检测)

文章目录 1 python ;两大法宝函数2 加载数据3 TensorBoard 的使用4 transforms的使用5 torchvision中的数据集使用6 dataloader的使用7 卷积操作8 卷积层9 最大池化10 非线性激活11 线性层12 Sequential的使用13 损失函数14 优化器15 现有网络模型的使用及修改16 网…

总结 | 深度学习之Pytorch入门教程

目录 一、整体学习的建议 1.1 如何成为Pytorch大神? 1.2 如何读Github代码? 1.3 代码能力太弱怎么办? 二、Pytorch与TensorFlow概述 2.1 什么是Pytorch? 2.1.1 Pytorch两个核心模块 2.1.2 Pytorch可视化:Visdom 2.1.3 Pyt…

面向Windows的Pytorch完整安装教程

目录 1. 概述 2. 安装 2.1 安装cuda 2.2 安装cudnn 2.3 安装Pytoch 2.4 验证 1. 概述 PyTorch是一个开源的Python机器学习库,其前身是著名的机器学习库Torch。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyT…

pytorch新手自学教程(一)

Pytorch详细新手自学教程(一) 前言Tensor(张量)Variable (变量) 前言 本教程参考书籍《深度学习入门之pytorch》 -----关于pytorch的优点这里不再说明,毕竟现在的主流仍然是TensorFlow。 1、环境配置可到pytorch官网搜索下载包的pip或conda指…

GPU版本安装Pytorch教程最新方法

目录 步骤 第一步:安装 Anaconda 和 Pycharm 软件 第二步:下载安装CUDA11.3 (1)首先查看自己电脑GPU版本 方式一:搜索框输入nvidia,打开nvidia控制面板 方式二:winR打开cmd,输…

pytorch官方教程中文版(一)PyTorch介绍

pytorch编程环境是1.9.1cu10.2 建议有能力的直接看官方网站英文版! 下面所示是本次教程的主要目录: pytorch官方教程中文版: PyTorch介绍学习PyTorch图像和视频声音文本强化学习在生产环境中部署PyTorch模型使用FX重构代码前端API扩展PyT…

【PyTorch入门教程】1. 基础知识

欢迎关注 【LearnOpenCV: PyTorch入门教程】 PyTorch入门:Ch1 基础知识 PyTorch入门:[Ch2 使用预训练模型进行图像分类] PyTorch入门:[Ch3 使用迁移学习进行图像分类] PyTorch入门:[Ch4 使用ONNX和Caffe2进行模型推理] PyTorch入门…

PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】笔记

PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】笔记 教程与代码地址P1 PyTorch环境的配置及安装(Configuration and Installation of PyTorch)【PyTorch教程】P2 Python编辑器的选择、安装及配置(PyCharm、Jup…

【超详细】Pytorch 入门教程(一)

Pytorch基本语法 1 认识Pytorch2 Pytorch的基本元素操作3 Pytorch的基本运算操作4 关于Torch Tensor和Numpy array之间的相互转换5 总结1 认识Pytorch 什么是Pytorch? Pytorch是一个基于Numpy的科学计算包, 向它的使用者提供了两大功能. 作为Numpy的替代者, 向用户提供使用GPU…

PyTorch安装教程(带图文)

文章目录 1.准备工作2.安装pytorch3.检验4.总结 前言 上一篇文章讲解了如何安装Anaconda,现在来安装pytorch,安装好工具就可以好好学习了。 1.准备工作 由于我安装anaconda时选择了最新版的,它默认安装了最新版python 3.8.5版本,我看网上大多数博主推荐…