对于几乎任何一门编程语言,理解数据类型的存储与识别是至关重要的。本文将带领你认识JavaScript中的数据存储机制、各种判断数据类型的方法以及它们的使用及其背后的原理。现在就一起搭乘上这趟探索数据类型的知识之旅吧,希望大家都可以有所收获。✌️
第一站:数据的栖息地 ------ 栈与堆的区分
设想我们是一名建筑设计师,需要设计一座图书馆。在设计之初,我们面临一个决策:如何高效利用空间存放不同规模的文献资料?
【情景代入】 想象我们手头有两类资料:
-
报纸和小册子 ------
原始类型
:体积小,便于携带,我们可以直接放在读者容易接触的前台展示区,也就是栈内存
。例如:inilet str = "hello";
-
古典巨作和百科全书 ------
复杂类型
:体积庞大,内容丰富,更适合存放在后方的大型书架区域也就是堆内存
,并在前台留下索引卡片指引读者去哪里寻找,这就是引用地址
。例如:bashlet book = { title: "你不知道的JavaScript", author: "KYLE SIMPSON" };
【设计思路】
为何采取这样的布局?因为前台展示区(栈)空间有限且需要快速访问,适合存放频繁访问且占用空间小的信息。而后方书架区(堆)则提供了广阔的存储空间,适合存放复杂、大型的数据结构,通过索引提高访问效率。
第二站:识别的挑战升级 ------ typeof的不足
现在,我们想要建立一套文献分类系统。首先尝试使用初步的识别技术------typeof
,但很快就发现了问题。
【深入思考】
尝试对以下情况进行分类:
javascript
let nu = null;
console.log(typeof nu); // 输出 object 而不是 null
为何会出现这种误导性的结果呢,这就需要我们开始探索更精细的识别方法。
第三站:版本的记录 ------ instanceof的深度挖掘
现在决定引入更复杂的识别系统------instanceof
,它能依据文献的"版本记录"也就是原型链
进行分类。
【实例分析】
现在分析一个具体的例子:
ini
function Book(title, author) {
this.title = title;
this.author = author;
}
let js = new Book("你不知道的JavaScript", "KYLE SIMPSON);
console.log(js instanceof Book); // true
【深入理解】
通过instanceof
,我们不仅能够区分出哪些文献属于特定的类别,还能进一步理解这些文献的来源和特性,这是typeof
所不能实现的。
我们甚至可以自己手写一个自己的instanceof方法:通过判断是否能够在原型链上找到联系来得到是否属于这个类型,因为可以是好几代之前的联系,所以使用回调函数一直往上寻找。
javascript
function myInstanceof(L,R) {
if (L.__proto__ === R.prototype) {
return true
}
else {
return myInstanceof(L.__proto__,R)
}
}
var arr = []
console.log(myInstanceof(arr,Object)); // true
第四站:本质的深度解析 ------ Object.prototype.toString()的大能
面对一些经过精心伪装的文献,比如被错误分类的书籍,我们引入了Object.prototype.toString()
这一高级的识别工具。
【实例挑战】
javascript
console.log(Object.prototype.toString.call(null)); // [object Null]
【解析思路】
为何此方法能准确识别?因为它深入到文献的根本,通过查看其内部的[[Class]]
属性,揭示了即便是null
这样难以直接辨别的对象的真正本质。
我们也可以设计一个自己的方法:因为根据底层的代码来看,最终输出的都会是由三个字符串 "[object" 和 "class" 以及 "]"拼接得到的字符串,所以我们简单采用剪切的方法拿到我们需要的内容片段。
javascript
function type(x) {
let res = Object.prototype.toString.call(x)
return res.slice(8,-1)
}
console.log(type('hello')); // String
console.log(type(123)); // Number
console.log(type([])); // Array
终点站:数组的专属认证 ------ Array.isArray()的精准锁定
在文献世界中,数组作为一种特殊的集合形式,经常需要特别对待。为此,我们设计了针对性极强的识别模块------Array.isArray()
。
【实例与思考】
ini
let arr = [1,2,3];
console.log(Array.isArray(arr)); // true
【深度解析】
通过Array.isArray()
,你能够直接、明确地判定一个对象是否为数组,无需经历复杂的原型链追溯,为处理数组型文献提供了高效便捷的途径。
结语
本次旅程,我们从数据存储的基础出发,逐步深入到复杂数据类型的识别与理解。这个过程中不仅学习了typeof
、instanceof
、Object.prototype.toString()
以及Array.isArray()
的使用,更重要的是,理解了它们背后的设计逻辑与适用场景。希望这些内容对你起到帮助,让我下次一起继续启程!👌