8种。JavaScript有且仅有8种数据类型。这个数字够小,小到任何一个前端面试都能问倒一大片人;这个数字也够大,大到每年产生的万行屎山代码里,至少有一半都跟用错类型有关。今天不聊框架、不聊协议,就掰开揉碎看这个天天写但天天踩的基础概念。
先纠正一个被无数教程带歪的认知:数据类型不是“变量上面贴的标签”,而是直接决定了你手里的变量能干什么、不能干什么。原文给出的定义很直白——一个变量的数据类型,就是它能存什么样的值,以及你对着它能用什么样的操作。你把3和4存成数字,加号就是加法,结果7;你把它们存成字符串“3”和“4”,加号就变成拼接,结果“34”。同一个运算符,不一样的行为,根源全在类型。脱离类型去谈编程,跟不看说明书拆家电没区别。
![]()
初级(基本)数据类型,是直接焊死在语言虚拟机里的,不需要任何额外构造就能用。原文列了四样:整数、浮点数、字符、布尔。整数存的是不带小数点的完整数字,正负都行,像42或者-7。浮点数专治小数点,3.14或0.005这种带小数的数就靠它。字符在你看来就一个字母、一个符号,单引号括起来就行,比如A或者$。布尔是最刚烈的类型,只有两条路:true或者false,非真即假,没有中间态。这四种类型共同的特点是它们直接在内存里存值,不是存啥引用地址,所以改一个不会莫名其妙联动另一个,这为后面复合类型的各种“意外”埋下了对比的伏笔。
非初级(复合)数据类型就是另一种世界观了。它们不直接存值,存的是一块内存的引用,像一个门牌号,数据本身在别处。原文举了三种:字符串、数组、对象。字符串本质是个字符序列,一堆字符串在一起,比如"Hello World"。数组则是同类型元素排成固定顺序的集合,写法上最常见的就是方括号包着一串数,[10, 20, 30, 40]这东西,你一看就知道是四个整数排排坐。对象,或者叫字典,是键值对的集合,给每个值贴一个名字标签,比如{"name": "Alice", "age": 25},这样你可以通过名字拿值,而不是靠位置序号。因为复合类型存的是引用,你把它赋给另一个变量,两个变量会指着同一块内存,改一个另一个也跟着变——这特性在后来的无数项目里制造了数不清的“为什么这里值变了”的加班夜。
好了,聊到这里,最让人上火的点来了。原文标题叫“Data Types in JavaScript”,前面洋洋洒洒讲了整数、浮点、字符、布尔、字符串、数组、对象,最后抛出一句“The 8 JavaScript Data Types”然后——没了。就没了。没有列表,没有对照,没告诉读者JS里到底哪8个,也没说前面这些通用类型哪个算JS的、哪个不算。这种戛然而止的教程留白,像极了某些技术博客把“后续详解”留在三年后。按照语言规范,JS那8个其实是:Undefined, Null, Boolean, Number, String, Symbol, BigInt, Object。但原文一个都没点名,我们就不能替它编,只能实打实告诉各位:作者挖了个坑,然后跑了。如果你正拿着这份材料准备面试,建议赶紧自己查缺补漏,别指望它能让你过关。
但原文至少干了一件大好事——它用两行代码就把隐式类型转换的坑给亮了出来。数字3加数字4等于7,小学生算术。可是换成字符串“3”加字符串“4”,你得到的不是7,而是“34”,一个长度2的字符串。这种现象在强类型语言里会被编译器直接骂回来,但在JavaScript里,加号运算符一看两边有字符串,二话不说就把另一边也转了字符串再拼起来。你以为你在做加法,实际上你启动了拼接引擎。更恶心的是,这种转换往往发生在你不注意的角落:从输入框拿到的值,从API反序列化出来的字段,都可能悄悄变成字符串,然后你的求和突然变得诡异。至今不知道多少电商结算页因为一个“+”的误用把总价算成了字符串拼接,这种Bug既低级又难查,因为不出异常,只是结果离谱。
归根结底,数据类型不是死记硬背的概念,而是深刻影响每一行代码运行逻辑的底层规则。不管是用整数存年龄,还是用布尔管状态,或者用对象组织复杂结构,选错类型轻则逻辑走偏,重则数据全乱。原文虽然烂尾,但它把“类型决定操作”这条铁律讲清楚了,这比背下一百个类型列表都管用。下次再看到“3”+“4”等于“34”的时候,你至少知道该从哪里查起,而不是怀疑计算器坏了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.