JavaScript之数据类型

2023-10-31

一.数据类型

JavaScript中有7中数据类型,分为基本数据类型和引用数据类型两大类:

1.基本数据类型

  • Number(数字):整数或浮点数,例如3.14-42

  • String(字符串):字符串是一系列字符,例如"Hello, World!"

  • Boolean(布尔值):表示真或假,例如truefalse

  • Null(空值):表示没有值,例如null

  • Undefined(未定义):表示未定义的值,例如undefined

  • Symbol(符号):表示唯一的标识符,例如Symbol('example)

2.引用数据类型

  • Object(对象):是一组属性和方法的集合,例如{ name: 'Alice', age: 30 }

  • Array(数组):是一个有序的集合,例如[1, 2, 3]

  • Function(函数):是一段可重复使用的代码块,例如function add(a, b) { return a + b; }

  • Date(日期):表示日期和时间,例如new Date()

  • RegExp(正则表达式):用于匹配字符串的模式,例如/\d+/g

3.基本数据类型和引用数据类型区别

  • 基本数据类型存在于(stack)中,是不可变的,修改一个基本数据类型的值,实际上会创建一个新的值。

  • 引用数据类型存在于(heap)中,是可变的,引用数据类型的变量实际上是对值得引用,而不是值本身。

    • 例如:如果两个变量引用同一个对象,当一个变量修改该对象时,另一个变量也会受到影响。
  • 注:堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中:

    • 在数据结构中,栈中数据的存取方式为先进后出。

    • 堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。

4.判断数据类型的方法

  • typeof操作符
console.log(typeof 123); // number
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof function(){}); // function

typeof操作符用于检测变量的数据类型,返回一个字符串,其值为变量的数据类型。它能够正确地判断基本数据类型的数据类型,但不能用于判断引用类型,因为它会统一返回为object

  • instanceof操作符
console.log(new String("hello") instanceof String); // true
console.log(123 instanceof Number); // false
console.log(new Number(123) instanceof Number); // true
console.log(true instanceof Boolean); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log({} instanceof Object); // true
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true

instanceof操作符用于检测一个对象是否为某个类的实例,它的原理是检查对象的原型链中是否存在指定类的原型。它不能用于判断基本数据类型。

  • Object.prototype.toString.call()方法
console.log(Object.prototype.toString.call(123)); // [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 Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(function(){})); // [object Function]

Object.prototype.toString方法用于返回一个表示对象类型的字符串。它的原理是获取对象的内部[[Class]]属性,并将其转换为字符串形式。所有对象的内部[[Class]]属性都可以通过Object.prototype.toString.call(obj)方法获取。

  • constructor属性
console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true

constructor 属性返回对象的构造函数。每个对象(除 nullundefined)都有一个constructor属性,可以通过该属性获取对象的构造函数。由于每个数据类型都对应一个构造函数,因此可以通过判断变量的 constructor 属性来判断变量的数据类型。

5.判断数组的方法

  • instanceof 运算符
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
  • Array.isArray() 方法
let arr = [1, 2, 3];
console.log(Array.isArray(arr)); // true

Object.prototype.toString.call() 方法

let arr = [1, 2, 3];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true

注意: 第一种和第二种方式的效率较高,并且可以处理跨 iframe 的情况。第三种方式会出现误判,例如当一个类似数组的对象使用 Object.prototype.toString.call() 方法判断时,也会返回 “[object Array]”,因此需要谨慎使用。

6.instanceof的原理和实现

instanceof用于检查一个对象是否是另一个对象的实例。它的语法如下:

object instanceof constructor //object是要检查的对象,constructor是一个函数或类,表示要检查的类型。
  • 原理

    instanceof的原理是检查object的原型链上是否存在constructor.prototype。如果object的原型链上存在constructor.prototype,则objectconstructor的实例,否则不是。

  • 实现

    下面是一种基于原型链的实现instanceof的方法:

function myInstanceOf(object, constructor) {
  let proto = Object.getPrototypeOf(object);
  while (proto) {
    if (proto === constructor.prototype) {
      return true;
    }
    proto = Object.getPrototypeOf(proto);
  }
  return false;
}
let arr = [];
console.log(myInstanceOf(arr, Array)); // true
console.log(myInstanceOf(arr, Object)); // true
console.log(myInstanceOf(arr, RegExp)); // false

该方法首先获取object的原型对象,并循环遍历原型链,逐级比较每个原型对象是否等于constructor.prototype。如果找到了相等的原型对象,则返回true,否则返回false

7.(0.1+0.2 ! == 0.3)问题

  • 原因

    使用 IEEE 754 标准来表示浮点数,该标准使用二进制来表示小数。因为在二进制中无法准确地表示一些十进制小数,因此在进行浮点数计算时会出现舍入误差,从而导致某些计算结果不准确。

    0.1 在十进制中可以准确地表示为 0.1,但在二进制中表示为 0.0001100110011001100110011001100110011001100110011...(循环节为 0011),其中小数点后的数值是无限循环的。同样地,0.2 在二进制中也是无限循环的,表示为 0.0011001100110011001100110011001100110011001100110...(循环节为 0011

  • 解决方案

    • 方案1:Math.abs()

      function isEqual(num1, num2) {
        return Math.abs(num1 - num2) < Number.EPSILON;
      }
      // Number.EPSILON 属性表示 1 与Number可表示的大于 1 的最小的浮点数之间的差值。
      console.log(isEqual(0.1 + 0.2, 0.3); // 输出 true
      
    • 方案2:toFixed()

      var result = (0.1 + 0.2).toFixed(1); // 将小数点后一位四舍五入
      console.log(result); // 输出 0.3
      

      注意:``toFixed()Chrome 浏览器中存在精度问题(工作中踩的坑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript之数据类型 的相关文章

随机推荐

  • LDA(latent dirichlet allocation)的应用

    主题模型LDA latent dirichlet allocation 的应用还是很广泛的 之前我自己在检索 图像分类 文本分类 用户评论的主题词抽取等都用过 做feature 降维等 例如可以用主题维度来表示原来的字典维度 大大的降低了文
  • 最新骗局:利用支付宝快捷支付 套取手机验证码转账

    最新骗局 利用支付宝快捷支付 套取手机验证码转账 小心 骗子在你不知情的情况下 也能帮你开通支付宝快捷支付 昨天 市民王先生向媒体反映 骗子通过QQ知道他的银行账号等信息后 又通过花言巧语骗取他的手机验证码 替他开通支付宝快捷支付功能 并转
  • LeetCode-1237. 找出给定方程的正整数解【双指针,二分查找】

    LeetCode 1237 找出给定方程的正整数解 双指针 二分查找 题目描述 解题思路一 双指针 首先我们不管f是什么 即function id等于什么不管 但是我们可以调用customfunction中的f函数 然后我们遍历x y 1
  • 如何在Idea打开一个本地项目(超详细版)

    背景 网上关于Idea的介绍和使用其实很多了 但是答应了某人还是要写一个打开项目的详细教程 下载项目压缩包 从本地打开 比如说我下载一个海大校园通的项目到本地 解压后 打开Idea 在左上角点击File gt New gt Project
  • 手把手,如何搭建一个通用组件库?(文档+样式+按需打包

    之前的文章 手把手 如何搭建一个通用组件库 并发布到npm 搭建了一个简单的组件库框架 并发布到了npm 在文章结果也留了几个个坑 1 没有样式 2 文档系统也没有 3 组件也不能按需加载 我们今天来一一解决 样式系统 搭建之前 先来看看e
  • 永久设置pip指定国内镜像源(含Windows和Linux)

    永久设置pip指定国内镜像源 含Windows和Linux 前言 首先来看一下Python临时指定安装的镜像源 命令格式 sudo pip3 install 包名 i 镜像源url eg sudo pip3 install redis i
  • MySQL_第00章_MySQL数据库基础篇大纲

    第00章 写在前面 一 MySQL数据库基础篇大纲 MySQL 数据库基础篇分为 5 个篇章 1 数据库概述与MySQL安装篇 第 01 章 数据库概述 第 02 章 MySQL 环境搭建 2 SQL之SELECT使用篇 第 03 章 基本
  • 决策树的训练过程

    决策树 以分类有毒和无毒蘑菇为例 这里的原始数据是agaricus lepiota data文件 每一行代表一个样本 每一列代表一个特征 这里一共8024个样本 每个样本有22个特征 其中第一列是样本标签 标示有毒 p 和无毒 e 除此之外
  • UE4游戏提取的通用步骤(21_9_8)

    准备工具 1 UEViewer最新版本 Umodel的新名 2 UnrealPakTool最新版本 用于查看uproject文件确认版本号 3 Uasset Reader新版 用于查看Uasset的内容 可有可无 4 NotePad 文本查
  • C语言实现通讯录

    对于通讯录中的每一个成员 有姓名 年龄 电话等信息 所以可以通过结构体实现通讯录 通讯录的功能如下 1 可以保存自定义最大数量人的信息 年龄 age 性别 sex 姓名 name 地址 addr 电话 tele 2 可以对存储的信息进行增删
  • 搭建Harbor2.1.0最新版私有镜像仓库

    文章目录 搭建Harbor仓库 Harbor是什么 为什么会用到Harbor Harbor的三种安装方式 离线安装 测试推送镜像 搭建Harbor仓库 Harbor是什么 为什么会用到Harbor harbor是构建企业级私有docker镜
  • 【转】C++类(Class)总结,经典易懂

    C 类 Class 总结 一 C 类的定义 C 中使用关键字 class 来定义类 其基本形式如下 class 类名 public 行为或属性 protected 行为或属性 private 行为或属性 示例 定义一个点 Point 类 具
  • Niushop开源商城系统-宝塔部署

    1 登录宝塔网址 在网站 添加站点 2 上传文件到根目录 3 选择之前在官网下载下的源码进行上传 4 上传到根目录之后进行解压 5 检查php版本以及php fileinfo扩展是否已安装 6 访问搭好的项目 用域名访问来进行安装 7 安装
  • Latex添加空格

    Latex添加空格
  • zabbix使用手动、自动、使用api添加agent

    添加主机 开启一个server2 装上zabbix agent yum install zabbix agent 4 0 5 1 el7 x86 64 rpm y 现在server1上添加 上一篇文章的快速搭建zabbix的方法 手动添加
  • 【postgres】3、源码结构

    文章目录 PostgreSQL的使用形态 PostgreSQL的结构 Potgres 常驻进程 Postgres 子进程 其他的进程 Writer process WAL writer process Archive process sta
  • 大对象属性JPA映射

    大对象类型的数据库表字段 以MySQL为例 保存字符数据的数据库表字段类型一般选择char varchar nchar nvarchar 保存二进制数据的数据库表字段类型一般选择binary varbinary 但是 这些类型保存的数据长度
  • R语言机器学习之caret包详解(二:模型的训练以及调参)

    R语言机器学习之caret包详解 二 模型的训练以及调参 前言 caret包模型调优的策略 示例 以及一些小tips 前言 在之前的博客中我们详细介绍过了数据的拆分策略 各种数据处理的方法 各种交叉验证的方法 并且以示例介绍了R函数crea
  • java ssh 远程执行_Java SSH远程执行Shell脚本实现(转)

    远程执行shell脚本类 author l public classRmtShellExecutor privateConnection conn 远程机器IP privateString ip 用户名 privateString usr
  • JavaScript之数据类型

    一 数据类型 JavaScript中有7中数据类型 分为基本数据类型和引用数据类型两大类 1 基本数据类型 Number 数字 整数或浮点数 例如3 14或 42 String 字符串 字符串是一系列字符 例如 Hello World Bo