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()的使用,更重要的是,理解了它们背后的设计逻辑与适用场景。希望这些内容对你起到帮助,让我下次一起继续启程!👌

相关推荐
别拿曾经看以后~5 分钟前
【el-form】记一例好用的el-input输入框回车调接口和el-button按钮防重点击
javascript·vue.js·elementui
川石课堂软件测试11 分钟前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
JerryXZR25 分钟前
前端开发中ES6的技术细节二
前端·javascript·es6
problc40 分钟前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
Gavin_91544 分钟前
【JavaScript】模块化开发
前端·javascript·vue.js
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
待磨的钝刨3 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
前端青山8 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
从兄9 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
清灵xmf10 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询