js数据类型探索之旅:从识别到深入理解

对于几乎任何一门编程语言,理解数据类型的存储与识别是至关重要的。本文将带领你认识JavaScript中的数据存储机制、各种判断数据类型的方法以及它们的使用及其背后的原理。现在就一起搭乘上这趟探索数据类型的知识之旅吧,希望大家都可以有所收获。✌️

第一站:数据的栖息地 ------ 栈与堆的区分

设想我们是一名建筑设计师,需要设计一座图书馆。在设计之初,我们面临一个决策:如何高效利用空间存放不同规模的文献资料?

【情景代入】 想象我们手头有两类资料:

  • 报纸和小册子 ------原始类型:体积小,便于携带,我们可以直接放在读者容易接触的前台展示区,也就是栈内存。例如:

    ini 复制代码
    let str = "hello"; 
  • 古典巨作和百科全书 ------复杂类型:体积庞大,内容丰富,更适合存放在后方的大型书架区域也就是堆内存,并在前台留下索引卡片指引读者去哪里寻找,这就是引用地址。例如:

    bash 复制代码
    let 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(),你能够直接、明确地判定一个对象是否为数组,无需经历复杂的原型链追溯,为处理数组型文献提供了高效便捷的途径。

结语

本次旅程,我们从数据存储的基础出发,逐步深入到复杂数据类型的识别与理解。这个过程中不仅学习了typeofinstanceofObject.prototype.toString()以及Array.isArray()的使用,更重要的是,理解了它们背后的设计逻辑与适用场景。希望这些内容对你起到帮助,让我下次一起继续启程!👌

相关推荐
苏十八2 小时前
前端进阶:Vue.js
前端·javascript·vue.js·前端框架·npm·node.js·ecmascript
乐容3 小时前
vue3使用pinia中的actions,需要调用接口的话
前端·javascript·vue.js
似水明俊德3 小时前
ASP.NET Core Blazor 5:Blazor表单和数据
java·前端·javascript·html·asp.net
friklogff5 小时前
【JavaScript脚本宇宙】美化网格布局:Isotope和Masonry让你的网页焕然一新
开发语言·前端·javascript
程楠楠&M6 小时前
vue3.0(十六)axios详解以及完整封装方法
前端·javascript·vue.js·axios·anti-design-vue
朝思暮柒9 小时前
顶顶通呼叫中心中间件-外呼通道变量同步到坐席通道变量(mod_cti基于Freeswitch)
开发语言·javascript·ecmascript
清橙20009 小时前
Vite配置环境变量以及动态更新html数据
开发语言·javascript·safari
st紫月9 小时前
用MySQL+node+vue做一个学生信息管理系统(二):创建MySQL数据表、创建HTML用户列表页面
javascript·vue.js·mysql
睿智的海鸥9 小时前
html+JavaScript+css 24点计算器
前端·javascript·css·算法·html
名字还没想好☜9 小时前
React Hooks --- 分享自己开发中常用的自定义的Hooks (1)
前端·javascript·react.js