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,一经查实,立即删除!

相关文章

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

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

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

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

绘制决策树尝试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…

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…

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

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

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

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

ESP32-c3实现获取土壤湿度(ADC模拟量)

1硬件实物图 2引脚定义 3使用说明 4实例代码 // 定义土壤湿度传感器连接的模拟输入引脚 const int soilMoisturePin 2; // 假设连接到GPIO2void setup() {// 初始化串口通信Serial.begin(115200); }void loop() {// 读取土壤湿度传感器的模拟值int sensorValue analogRead…

Java 大视界 -- Java 大数据在量子通信安全中的应用探索(69)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

86.(2)攻防世界 WEB PHP2

之前做过&#xff0c;回顾一遍&#xff0c;详解见下面这篇博客 29.攻防世界PHP2-CSDN博客 既然是代码审计题目&#xff0c;打开后又不显示代码&#xff0c;肯定在文件里 <?php // 首先检查通过 GET 请求传递的名为 "id" 的参数值是否严格等于字符串 "admi…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

【数据结构】初识链表

顺序表的优缺点 缺点&#xff1a; 中间/头部的插入删除&#xff0c;时间复杂度效率较低&#xff0c;为O(N) 空间不够的时候需要扩容。 如果是异地扩容&#xff0c;增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间&#xff0c;会有不小的消耗。 扩容可能会存在…

增删改查(CRUD)操作

文章目录 MySQL系列&#xff1a;1.CRUD简介2.Create(创建)2.1单行数据全列插入2.2 单行数据指定插入2.3 多⾏数据指定列插⼊ 3.Retrieve(读取)3.1 Select查询3.1.1 全列查询3.1.2 指定列查询3.1.3 查询字段为表达式&#xff08;都是临时表不会对原有表数据产生影响&#xff09;…

使用Pygame制作“贪吃蛇”游戏

贪吃蛇 是一款经典的休闲小游戏&#xff1a;玩家通过操控一条会不断变长的“蛇”在屏幕中移动&#xff0c;去吃随机出现的食物&#xff0c;同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单&#xff0c;但可玩性和扩展性都不错&#xff0c;非常适合作为新手练习游戏…

JavaScript闭包深入剖析:性能剖析与优化技巧

一、引言 在 JavaScript 的奇妙世界里&#xff0c;闭包无疑是一个既强大又迷人的特性。它就像是一把万能钥匙&#xff0c;为开发者打开了实现各种高级功能的大门。从数据封装与保护&#xff0c;到函数的记忆化&#xff0c;再到模块化开发&#xff0c;闭包都发挥着举足轻重的作…

蓝桥杯嵌入式赛道备考1 —— 基础GPIO实战

1. 点亮一个LED 蓝桥杯的板子资料的URL&#xff0c;笔者是从GitHub - JoyRiderJie/LanQiaoBei-QianRuShi拉去下来的。这个是Github仓库地址。 从应用层去玩一个开发板子&#xff0c;首先需要的是去尝试是点亮一个LED。让我们切换到手册《CT117E——产品手册》的第11页&#x…