当前位置: 首页 > news >正文

JavaScript 数据类型

JavaScript 数据类型详解

JavaScript 是一种动态类型语言,这意味着变量不需要在声明时指定类型,且同一变量可以在运行过程中存储不同类型的值。

JavaScript 的数据类型分为两大类:基本数据类型(Primitive Types)引用数据类型(Reference Types)


1. 基本数据类型 (Primitive Types)

基本数据类型存储在栈内存(Stack)中,按值访问。它们是不可变的(immutable),即一旦创建,其值就不能被修改。

JavaScript 共有7 种基本数据类型:

1.1String(字符串)

用于表示文本数据。可以用单引号、双引号或反引号(模板字符串)定义。

letstr1="Hello";letstr2='World';letstr3=`Template String`;// 支持换行和插值// 特性console.log(str1.length);// 5console.log(str1.toUpperCase());// "HELLO"console.log(`${str1}${str2}`);// "Hello World" (模板字符串)

1.2Number(数字)

JavaScript只有一种数字类型,即双精度 64 位浮点数(IEEE 754)。它既可以表示整数,也可以表示小数。

letinteger=42;letfloat=3.14;letnegative=-100;letscientific=1.23e5;// 123000// 特殊值console.log(Number.MAX_SAFE_INTEGER);// 9007199254740991console.log(Number.MIN_SAFE_INTEGER);// -9007199254740991console.log(Infinity);// 无穷大console.log(-Infinity);// 负无穷大console.log(NaN);// Not a Number (非数字)// 注意:0.1 + 0.2 !== 0.3 (浮点数精度问题)console.log(0.1+0.2);// 0.30000000000000004

1.3Boolean(布尔值)

只有两个值:truefalse。常用于逻辑判断。

letisTrue=true;letisFalse=false;// 布尔转换 (Falsy 值)// 以下值在布尔上下文中会被转换为 false:// false, 0, -0, 0n, "", null, undefined, NaNconsole.log(Boolean(0));// falseconsole.log(Boolean(""));// falseconsole.log(Boolean("Hello"));// true

1.4Undefined(未定义)

表示变量已声明但未赋值

  • 函数没有返回值时,默认返回undefined
  • 访问对象不存在的属性时,返回undefined
letx;console.log(x);// undefinedfunctionnoReturn(){}console.log(noReturn());// undefinedletobj={a:1};console.log(obj.b);// undefined

1.5Null(空值)

表示有意的空值或“无对象”。

  • 注意:typeof null返回"object",这是 JavaScript 的一个历史遗留 Bug。
letempty=null;console.log(typeofempty);// "object" (Bug)// 通常用于初始化变量,表示“暂无值”letuser=null;

1.6Symbol(符号)

ES6 引入。表示唯一的标识符,常用于对象属性的键,防止属性名冲突。

letsym1=Symbol("id");letsym2=Symbol("id");console.log(sym1===sym2);// false (即使描述相同,也是不同的值)letobj={};obj[sym1]="唯一值";console.log(obj[sym1]);// "唯一值"

1.7BigInt(大整数)

ES2020 引入。用于表示任意精度的整数,解决Number类型无法安全表示大整数的限制。

  • 定义:在整数后加n
letbig=9007199254740991n;letbigger=BigInt(123456789012345678901234567890);console.log(big+1n);// 9007199254740992n// console.log(big + 1); // ❌ 报错:不能混合 BigInt 和 Number

2. 引用数据类型 (Reference Types)

引用数据类型存储在堆内存(Heap)中。变量存储的是指向内存地址的引用(指针),而不是值本身。

  • 可变性:对象的内容可以被修改。
  • 比较方式:比较的是引用地址,而不是内容。

2.1Object(对象)

最通用的引用类型,用于存储键值对集合。

letperson={name:"张三",age:25,greet:function(){console.log("你好");}};// 修改属性person.age=26;// 添加属性person.city="北京";// 访问属性console.log(person.name);// "张三"

2.2Array(数组)

特殊的对象,用于存储有序的值列表。

letnumbers=[1,2,3,4,5];letmixed=[1,"hello",true,null,{a:1}];// 数组是对象console.log(Array.isArray(numbers));// trueconsole.log(typeofnumbers);// "object"

2.3Function(函数)

函数也是对象,是可以被调用的特殊对象。

functionadd(a,b){returna+b;}letmultiply=function(a,b){returna*b;};console.log(typeofadd);// "function"

2.4 其他内置对象

  • Date: 处理日期和时间。
  • RegExp: 正则表达式。
  • Map/Set: ES6 引入的集合数据结构。
  • Promise: 处理异步操作。

3. 类型检测

3.1typeof运算符

用于检测基本类型和函数。

console.log(typeof"Hello");// "string"console.log(typeof123);// "number"console.log(typeoftrue);// "boolean"console.log(typeofundefined);// "undefined"console.log(typeofSymbol());// "symbol"console.log(typeof123n);// "bigint"console.log(typeoffunction(){});// "function"console.log(typeof{});// "object"console.log(typeof[]);// "object" (注意:数组也是 object)console.log(typeofnull);// "object" (历史遗留 Bug)

3.2instanceof运算符

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

letarr=[1,2,3];console.log(arrinstanceofArray);// trueconsole.log(arrinstanceofObject);// trueletdate=newDate();console.log(dateinstanceofDate);// true

3.3Object.prototype.toString.call()(最准确)

可以准确区分所有内置对象类型。

console.log(Object.prototype.toString.call([]));// "[object Array]"console.log(Object.prototype.toString.call(null));// "[object Null]"console.log(Object.prototype.toString.call(undefined));// "[object Undefined]"console.log(Object.prototype.toString.call({}));// "[object Object]"console.log(Object.prototype.toString.call(newDate()));// "[object Date]"

4. 类型转换 (Type Coercion)

JavaScript 会在运算或比较时自动进行类型转换,也可以手动转换。

4.1 隐式转换

// 字符串拼接console.log(5+"5");// "55" (数字转字符串)// 算术运算console.log("5"-2);// 3 (字符串转数字)console.log("10"*"2");// 20// 布尔转换if("0"){console.log("真");}// 真 (非空字符串为真)if([]){console.log("真");}// 真 (空数组为真)if({}){console.log("真");}// 真 (空对象为真)

4.2 显式转换

转为字符串
String(123);// "123"(123).toString();// "123"""+123;// "123"
转为数字
Number("123");// 123Number("12.5");// 12.5Number("abc");// NaNparseInt("12px");// 12parseFloat("3.14px");// 3.14+"123";// 123 (一元加号)
转为布尔值
Boolean(0);// falseBoolean("");// falseBoolean(null);// falseBoolean(undefined);// falseBoolean(NaN);// falseBoolean("0");// true (非空字符串)Boolean([]);// true!!value;// 常用技巧,将任意值转为布尔值

5. 值传递 vs 引用传递

理解这一点对避免 Bug 至关重要。

基本类型:值传递

leta=10;letb=a;// 复制值b=20;console.log(a);// 10 (a 不受影响)

引用类型:引用传递

letobj1={name:"张三"};letobj2=obj1;// 复制引用地址obj2.name="李四";console.log(obj1.name);// "李四" (obj1 也变了,因为它们指向同一个对象)obj2={name:"王五"};// 重新赋值 obj2 指向新对象console.log(obj1.name);// "李四" (obj1 不受影响)

6. 最佳实践

  1. 避免隐式转换

    • 使用===(严格相等) 代替==(宽松相等),避免类型自动转换带来的意外。
    console.log(0==false);// true (容易出错)console.log(0===false);// false (推荐)console.log("5"==5);// trueconsole.log("5"===5);// false
  2. 初始化变量

    • 声明对象或数组时立即初始化,避免undefined导致的错误。
    letlist=[];// 推荐letlist;// 不推荐,后续使用时可能报错
  3. 处理NaN

    • NaN不等于任何值(包括它自己),使用Number.isNaN()检测。
    console.log(NaN===NaN);// falseconsole.log(Number.isNaN(NaN));// true
  4. 大整数使用BigInt

    • 当处理超过Number.MAX_SAFE_INTEGER的整数时,务必使用BigInt
  5. 使用Object.prototype.toString进行类型判断

    • 在需要精确判断数组、日期、正则等类型时,不要依赖typeof

总结表

类型分类示例typeof结果特点
String基本"hello""string"不可变,文本
Number基本42,3.14"number"双精度浮点,含NaN,Infinity
Boolean基本true,false"boolean"逻辑判断
Undefined基本undefined"undefined"未赋值
Null基本null"object"(Bug)空对象指针
Symbol基本Symbol()"symbol"唯一标识符
BigInt基本123n"bigint"任意精度整数
Object引用{},[],Date"object"可变,引用传递
Function引用function(){}"function"可调用对象

掌握数据类型的特性是编写健壮 JavaScript 代码的基石。

http://www.jsqmd.com/news/628545/

相关文章:

  • Qwen3-ForcedAligner-0.6B与卷积神经网络结合方案
  • 企业微信和腾讯会议如何预定线上会议?一篇文章讲清两种预定方式
  • 小白也能部署的AI模型:Qwen3-4B-Instruct-2507,vLLM+Chainlit实战指南
  • 告别I2S DAC:用FPGA和Verilog实现PDM音频输出的保姆级教程(附完整代码)
  • 从Markdown小白到排版高手:用Typora打造专业级技术文档
  • 忍者像素绘卷:天界画坊MySQL数据库集成:作品管理与用户数据存储
  • 设计保温杯杯套开孔,吸管精准穿出,输出:儿童/学生必备。
  • Alibaba DASD-4B Thinking 对话工具在时序预测中的应用:结合LSTM模型的分析与报告生成
  • Cursor Pro终极激活指南:3分钟解锁无限AI编程功能
  • 微信小程序自定义tabBar实战:从零构建到常见问题解决
  • WiFiAnalyzer深度解析:Android上不可或缺的Wi-Fi网络诊断利器
  • 如何快速制作专业字幕:SubtitleEdit终极使用指南
  • 原神抽卡数据分析终极指南:免费开源工具genshin-wish-export完整教程
  • Citra模拟器终极指南:免费在电脑上畅玩3DS游戏的完整教程
  • Pixel Couplet Gen效果展示:红晶/金块/像素蓝三色高亮春联生成对比图
  • 5分钟快速解决Arduino ESP32安装失败问题:新手终极完整指南
  • 从配色到代码:手把手教你用Python复刻Nature/Science级别的数据可视化风格
  • C++ 调用 Windows API 实现进程隐身术,打造你的专属“摸鱼”神器
  • 如何快速掌握浏览器定制:终极用户脚本使用指南
  • ERNIE-4.5-0.3B-PT与C++高性能计算集成方案
  • Ostrakon-VL-8B浏览器插件开发:一键解析网页图片内容
  • 查重降AI一篇搞定!2026热门论文工具抄作业版
  • 文脉定序系统处理Typora Markdown笔记库:知识点的自动重构与链接建议
  • AWPortrait-Z功能体验:批量生成、历史记录恢复等实用功能详解
  • BIM设计师必备:Revit等高线地形建模的5个高效技巧与常见问题解决
  • Vivado实战:基于AXI4-Lite协议的自定义IP核开发指南
  • 3步实现CS:GO皮肤自定义:nSkinz开源工具深度解析
  • TA7291P双H桥电机驱动芯片原理与STM32嵌入式实践
  • 别再手动扫码了!用Python+海康MV-CH120-60UM相机,5分钟搞定自动化条码识别
  • JavaScript 输出