JavaScript 数据类型

基本概念
什么是数据类型
JavaScript是一种 灵活的动态类型语言 ,其数据类型构成了程序的基础构建块。它主要包括两类数据类型:

原始数据类型 :包括String、Number、Boolean、Undefined、Null和Symbol。

复杂数据类型 :以Object为代表,还包括Array和Function。

这种设计使开发者能够高效处理各种数据结构,同时利用动态类型特性实现灵活的编码风格。JavaScript的动态类型系统允许变量在运行时改变类型,增加了语言的灵活性,但也要求开发者更加谨慎地管理数据,以防止潜在的类型错误。

动态类型特性
JavaScript作为一种动态类型语言,在运行时确定变量类型,并允许类型在运行过程中动态变化。这种特性带来了显著优势:

提高开发效率

增强语言灵活性

支持更灵活的编程范式

然而,动态类型也可能导致一些挑战:

潜在类型错误难以在编译时发现

可能在运行时遇到意外的行为

尽管如此,通过合理的设计和编码实践,开发者可以充分利用JavaScript的动态类型特性,同时有效控制可能出现的问题。

原始数据类型
Number类型
JavaScript的Number类型是一个强大而复杂的原始数据类型,基于IEEE 754标准的64位双精度浮点数格式。这种设计使得Number类型能够表示极其广泛的数值范围,从小数到极大数都能涵盖。然而,这种灵活性也带来了一些独特的挑战和特殊值。

数值范围和精度
Number类型的数值范围可以从极小到极大:

 

值得注意的是,虽然Number类型可以表示如此宽广的范围,但在实际应用中,只有在-2^53到2^53之间的整数才能保证完全精确地表示。这一限制是由Number类型的内部表示方式决定的,使用了52位来表示尾数,11位表示指数,1位表示符号。

特殊值
Number类型还包含了三个特殊的值:

NaN (Not a Number) :表示无法表示的数值,如0除以0的结果。

Infinity :表示正无穷大,如正数除以0的结果。

-Infinity :表示负无穷大,如负数除以0的结果。

这些特殊值的存在使得JavaScript能够处理一些超出常规数值范围的情况,增强了语言的表达能力和健壮性。

常用操作
JavaScript提供了多种方法来处理和操作Number类型的值:

转换方法 :

Number():将其他类型转换为数字

parseInt():将字符串转换为整数

parseFloat():将字符串转换为浮点数

数学运算方法 :

Math.abs():求绝对值

Math.round():四舍五入

Math.floor():向下取整

Math.ceil():向上取整

格式化方法 :

.toFixed():将数字格式化为固定小数位数的字符串

.toLocaleString():将数字转换为本地化字符串

验证方法 :

Number.isInteger():检查是否为整数

Number.isNaN():检查是否为NaN

Number.isFinite():检查是否为有限数

这些方法和特性共同构成了JavaScript中处理数字的强大工具集,使得开发者能够在各种复杂的数值操作和场景中灵活运用Number类型。

String类型
JavaScript中的String类型是一种原始数据类型,用于表示零或多个16位Unicode字符序列。字符串可以通过三种方式定义:

单引号(')

双引号(")

反引号(`)

其中,反引号定义的字符串称为模板字符串,是ES6引入的新特性。模板字符串不仅保留换行字符,还能跨行定义,提高了代码的可读性。

模板字符串的一大特点是支持 字符串插值 。通过在${}中使用JavaScript表达式,可以将变量或计算结果直接嵌入字符串中。这种方法相比传统字符串拼接更为简洁直观:

let name = "World";
let greeting = `Hello, ${name}!`;
console.log(greeting); // 输出 "Hello, World!"

模板字符串还支持 嵌套 ,无需转义内部的反引号:
 

console.log(`Hello, ${ `World` }!`);
function simpleTag(strings, ...expressions) {console.log(expressions);return '早起的年轻人';
}let taggedResult = simpleTag`${10} + ${12} = ${10 + 12}`;
console.log(taggedResult); // 输出 "早起的年轻人"

String类型提供了丰富的内置方法,如:

charAt() :返回指定索引处的字符

toUpperCase() :将字符串全部转换为大写

toLowerCase() :将字符串全部转换为小写

indexOf() :返回指定子字符串首次出现的位置

replace() :替换字符串中的指定内容

这些方法使字符串操作变得简单直观,提高了代码的可读性和维护性。通过熟练运用String类型的各种特性,开发者可以更高效地处理文本数据,编写出更加优雅和高效的JavaScript代码。

Boolean类型
继Number和String之后,JavaScript中的另一个基础数据类型是Boolean。Boolean类型仅包含两个值: true和false ,分别代表逻辑上的真和假。这种简单的二元性质使Boolean成为条件判断的理想选择。

在条件语句中,Boolean类型发挥着关键作用。例如:

if (condition) {// 当 condition 为 true 时执行此代码块
}

这里,condition通常是一个返回Boolean值的表达式,如比较运算或逻辑运算。JavaScript还支持将非Boolean值 隐式转换 为Boolean,这在实践中非常常见。例如:

if ("hello") {// 这里的 "hello" 被转换为 true
}

这种机制简化了许多常见的编程模式,但同时也可能引入潜在的陷阱,需要开发者格外注意。

Undefined和Null
在JavaScript的世界里,Undefined和Null这两个看似相近却又截然不同的概念扮演着重要角色。它们各自代表着特定的语义和使用场景,准确理解和运用它们对于编写高质量的JavaScript代码至关重要。

Undefined
Undefined 本质上表示一个变量处于最原始、未经赋值的状态。它通常出现在以下几种情况:

变量声明后未赋值

访问未定义的变量或对象属性

函数参数未传递值

函数无返回值

例如:

let foo;
console.log(foo); // 输出: undefined

这里,foo被声明但未赋值,因此其值为Undefined。

Null

相比之下, Null 更像是一个主动的选择,表示“空值”或“空对象引用”。它常用于以下情形:

  1. 初始化变量,尤其是未来将用于保存对象的变量

  2. 清除对象引用

  3. 表示函数没有返回有意义的值

    let person = null; // 明确表示person暂时不指向任何对象

    区别
    尽管Undefined和Null在某些情况下表现相似,但它们在语义和使用上有本质区别:

    类型差异 :Undefined属于原始类型,而Null的历史遗留问题使其被归类为对象类型。

    比较运算 :Undefined和Null在宽松比较(==)时相等,但在严格比较(===)时不等。

    语义差异 :Undefined暗示“未知”或“未定义”,而Null则表示“已知的空”。

    正确理解和使用Undefined和Null可以帮助开发者更好地控制程序流程,减少潜在的错误和混淆。在实际编程中,明智的做法是:

    避免显式地将变量赋值为Undefined

    使用Null来表示空对象引用

    在需要清除对象引用时,将变量设为Null

    通过这种方式,我们可以提高代码的可读性和可靠性,同时也能更好地利用JavaScript的动态特性。

    Symbol类型
    在JavaScript中,Symbol类型是一种独特的原始数据类型,主要用于创建不可枚举的唯一标识符。它特别适合用于对象的“隐藏”属性,确保这些属性不会被外部代码意外访问或修改。Symbol的一个关键特征是其 描述符 属性,可通过.description访问,这有助于识别和调试。

    Symbol类型还支持 全局注册 机制,允许跨模块共享相同的Symbol实例,这对于大型项目或需要统一命名空间的场景尤为有用。这种机制通过Symbol.for()方法实现,配合Symbol.keyFor()方法可用于检索Symbol的名称,实现了既保护隐私又便于管理和使用的平衡。

    复杂数据类型
    Object类型
    JavaScript中的Object类型是一种强大的复杂数据结构,用于存储和组织相关的数据和功能。它提供了一种灵活的方式来创建和操作键值对集合,是JavaScript面向对象编程的核心基石。

    创建对象
    创建对象主要有三种方式:

    对象字面量 :最常用的方法,使用花括号{}定义属性和方法。

    构造函数 :使用new关键字和构造函数创建对象实例。

    Object.create()方法 :创建具有指定原型的对象。

    访问属性
    对象属性可以通过两种方式进行访问:

    点符号 :适用于大多数情况。

    方括号 :适用于属性名包含特殊字符或变量的情况。

    常用方法
    Object类型提供了多种实用方法:

    Object.keys() :返回对象自身的可枚举属性名组成的数组。

    Object.values() :返回对象自身的可枚举属性值组成的数组。

    Object.entries() :返回对象自身的可枚举属性的键值对数组。

    Object.assign() :用于浅拷贝对象的属性。

    这些方法大大提高了对象操作的便利性和代码的可读性。例如,使用Object.assign()可以轻松地合并多个对象:

    const defaultSettings = { theme: 'light', fontSize: 16 };
    const userSettings = { theme: 'dark' };
    const mergedSettings = Object.assign({}, defaultSettings, userSettings);
    console.log(mergedSettings); // { theme: 'dark', fontSize: 16 }
    冻结对象

    值得一提的是,Object.freeze()方法可以阻止进一步修改对象:

    const frozenObj = Object.freeze({ prop: 'value' });
    frozenObj.prop = 'new value'; // 抛出TypeError异常

    这在需要保护对象完整性或创建不可变数据结构时非常有用,有助于提高代码的安全性和可预测性。

    Array类型
    JavaScript中的Array类型是一种强大而灵活的数据结构,它不仅能存储多个值,还提供了丰富的内置方法来操作和处理数组元素。数组的创建和操作方法多样,为开发者提供了多种选择。

    创建数组
    创建数组主要有两种方式:

    数组字面量 :使用方括号[]定义数组,如:

    let fruits = ['apple', 'banana', 'orange'];

  4. 构造函数 :使用new Array()创建数组,如:

    let fruits = new Array('apple', 'banana', 'orange');

    数组操作方法
    JavaScript数组提供了多种操作方法:

    添加元素 :

    push():向数组末尾添加一个或多个元素

    unshift():向数组开头添加一个或多个元素

    删除元素 :

    pop():删除并返回数组的最后一个元素

    shift():删除并返回数组的第一个元素

    修改元素 :

    splice():用于插入、删除或替换数组元素

    遍历方法 :

    forEach():对数组每个元素执行给定函数

    map():创建新数组,元素为原数组元素执行函数后的结果

    filter():创建新数组,包含通过测试的所有元素

    reduce():将数组元素减少为单个值

    查询方法 :

    indexOf():返回指定元素首次出现的索引

    lastIndexOf():返回指定元素最后一次出现的索引

    includes():检查数组是否包含指定元素

    排序和反转 :

    sort():对数组元素进行排序

    reverse():反转数组元素的顺序

    遍历技巧
    在遍历数组时,除了传统的for循环外,还有多种现代方法可供选择:

    for...of循环 :直接遍历数组元素

    for (let fruit of fruits) {console.log(fruit);
    }

  5. 箭头函数 :简化匿名函数的书写

    fruits.forEach(fruit => console.log(fruit));

  6. Array.prototype.forEach() :提供额外的参数(索引和数组本身)

    fruits.forEach((fruit, index, arr) => {console.log(`${index}: ${fruit}`);
    });

    通过灵活运用这些方法和技巧,开发者可以更高效地处理数组,提高代码的可读性和维护性。在实际应用中,选择适当的方法不仅可以简化代码,还可以优化性能,特别是在处理大量数据时。

    Function类型
    在JavaScript中,Function类型是一种核心数据结构,用于封装可重用的代码块。它有三种主要的定义方式:

    函数声明 :使用function关键字,如:

    function greet(name) {console.log(`Hello, ${name}!`);
    }

  7. 函数表达式 :将函数赋值给变量,如:

    const greet = function(name) {console.log(`Hello, ${name}!`);
    };

  8. 箭头函数 :使用=>语法,如:

    const greet = (name) => {console.log(`Hello, ${name}!`);
    };

    箭头函数相较于传统函数有以下特点:

    更简洁的语法

    自动绑定this

    不能用作构造函数

    没有自己的arguments对象

    这些特性使箭头函数在处理异步操作、事件处理器和回调函数时特别有用,提高了代码的可读性和维护性。

    类型检测与转换
    类型检测方法
    JavaScript中类型检测是确保代码正确性和性能的关键部分。本节将详细介绍三种主要的类型检测方法:typeof、instanceof和Object.prototype.toString,并比较它们在不同场景下的适用性。

    typeof操作符
    typeof操作符是最基本的类型检测方法,它返回一个表示操作数类型的字符串。对于原始类型,typeof的表现相当可靠:

    console.log(typeof 123); // "number"
    console.log(typeof "hello"); // "string"
    console.log(typeof true); // "boolean"

    然而,typeof在处理复杂数据类型时存在一些局限性:

  9. 对于所有引用类型(除函数外),typeof均返回"object":

    console.log(typeof {}); // "object"
    console.log(typeof []); // "object"
    console.log(typeof new Date()); // "object"

  10. 特殊地,typeof null返回"object",这是一个历史遗留问题:

    console.log(typeof null); // "object"
    instanceof运算符

    instanceof运算符用于检查一个对象是否为特定构造函数的实例。它通过检查对象的原型链来实现这一点:

    console.log([] instanceof Array); // true
    console.log({} instanceof Object); // true

    instanceof的优势在于它可以区分不同的引用类型:
     

    console.log([] instanceof Object); // true
    console.log([] instanceof Array); // true
    console.log({} instanceof Array); // false

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

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

相关文章

被裁与人生的意义--春节随想

还有两个月就要被迫离开工作了十多年的公司了,不过有幸安安稳稳的过了一个春节,很知足! 我是最后一批要离开的,一百多号同事都没“活到”蛇年。看着一批批仁人志士被“秋后斩首”,马上轮到我们十来个,个中滋味很难言清…

【multi-agent-system】ubuntu24.04 安装uv python包管理器及安装依赖

uv包管理器是跨平台的 参考sudo apt-get update sudo apt-get install -y build-essential我的开发环境是ubuntu24.04 (base) root@k8s-master-pfsrv:/home/zhangbin/perfwork/01_ai/08_multi-agent-system# uv venv 找不到命令 “uv”,但可以通过以下软件

Redis代金卷(优惠卷)秒杀案例-多应用版

Redis代金卷(优惠卷)秒杀案例-单应用版-CSDN博客 上面这种方案,在多应用时候会出现问题,原因是你通过用户ID加锁 但是在多应用情况下,会出现两个应用的用户都有机会进去 让多个JVM使用同一把锁 这样就需要使用分布式锁 每个JVM都会有一个锁监视器,多个JVM就会有多个锁监视器…

Makefile 教程(一)——基础

本文裁剪汇总自Makefile教程和示例指南。 Makefile 意义 Makefile 用于帮助决定大型程序的哪些部分需要重新编译。在绝大多数情况下,都会编译 C 或 C 文件。其他语言通常有自己的与 Make 功能类似的工具。Make 也可以在编译之外使用,即当需要根据已更改…

绘制决策树尝试3

目录 代码解读AI 随机状态 种子 定义决策树回归模型 tree的decision regressor fit 还可用来预测 export 效果图 我的X只有一个特征 为何这么多分支 ??? 这是CART回归 CART回归 为什么说代码是CART回归? 不是所有的决…

为大模型提供webui界面的利器:Open WebUI 完全本地离线部署deepseek r1

为大模型提供webui界面的利器:Open WebUI Open WebUI的官网:🏡 Home | Open WebUI 开源代码:WeTab 新标签页 Open WebUI是一个可扩展、功能丰富、用户友好的自托管AI平台,旨在完全离线运行。它支持各种LLM运行程序&am…

分布式微服务系统架构第87集:kafka

Kafka 就是为了解决上述问题而设计的一款基于发布与订阅的消息系统。它一般被称为 “分布式提交日志”或者“分布式流平台”。文件系统或数据库提交日志用来提供所有事务 的持久记录,通过重放这些日志可以重建系统的状态。同样地,Kafka 的数据是按照一定…

k均值聚类将数据分成多个簇

人工智能例子汇总:AI常见的算法和例子-CSDN博客 K-Means 聚类并将数据分成多个簇,可以使用以下方法: 实现思路 随机初始化 K 个聚类中心计算每个点到聚类中心的距离将点分配到最近的簇更新聚类中心重复上述过程直到收敛 完整代码&#x…

使用 Docker 部署 pSQL 服务器 的教程

如何使用 Edu 邮箱申请 Azure 订阅并开通免费 VPS 使用 Edu 邮箱不仅可以申请 Azure 的免费订阅来开通 VPS,还可以免费使用 Adobe 和 Notion 等软件,极大地提高学习和工作的效率。如果您还没有 Edu 邮箱,可以参考在线笔记s3.tebi.io/notes-i…

langchain 实现多智能体多轮对话

这里写目录标题 工具定义模型选择graph节点函数定义graph 运行 工具定义 import random from typing import Annotated, Literalfrom langchain_core.tools import tool from langchain_core.tools.base import InjectedToolCallId from langgraph.prebuilt import InjectedSt…

【Block总结】CPCA,通道优先卷积注意力|即插即用

论文信息 标题: Channel Prior Convolutional Attention for Medical Image Segmentation 论文链接: arxiv.org 代码链接: GitHub 创新点 本文提出了一种新的通道优先卷积注意力(CPCA)机制,旨在解决医学图像分割中存在的低对比度和显著…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

强化学习、深度学习、深度强化学习的区别是什么?

前言 深度强化学习就是 深度学习 和 强化学习 的结合体。它让计算机程序(也就是智能体)在特定环境中不断尝试,从错误中学习,最终找到最优的行动策略。 深度学习是AlphaGo从棋谱里学习,强化学些Alphazero 学习规则&am…

string类(详解)

为什么学习string类? 1.1 C语言中的字符串 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想&#xf…

工业相机如何获得更好的图像色彩

如何获得更好的图像色彩 大部分的工业自动化检测中对物体的色彩信息并不敏感,因此会使用黑白的相机,但是在显微镜成像、颜色分类识别等领域,相机的色彩还原就显得格外重要,在调节相机色彩方面的参数时,有以下几个方面需…

五.简单函数

五.简单函数 函数是什么? 函数是 一种将输入值映射到唯一输出值的对应关系 1。 在数学中,函数通常表示为 $y f(x)$,其中 $x$ 是自变量,$y$ 是因变量,$f$ 是对应法则2。 c中,函数是…

SQLite Update 语句详解

SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统,以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中,UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句,包括其语法…

【Redis】set 和 zset 类型的介绍和常用命令

1. set 1.1 介绍 set 类型和 list 不同的是,存储的元素是无序的,并且元素不允许重复,Redis 除了支持集合内的增删查改操作,还支持多个集合取交集,并集,差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …

一些计算机零碎知识随写(25年2月)

今天复习 MySQL 的时候,我突然冒出一个想法:能不能远程连接 MySQL 呢?虽说心里清楚理论上可行,但一直没实际操作过。 于是,起床后我立马打开服务器,准备启动 MySQL。结果,这一启动就发现问题了&…

【Java异步编程】CompletableFuture实现:异步任务的合并执行

文章目录 一. 合并两个异步任务的结果1. thenCombine():组合两个异步任务的结果2. runAfterBoth():在两个任务完成后执行无返回值操作3. thenAcceptBoth():消费两个任务的结果 二. allOf():等待所有任务完成 如果某个任务同时依赖…