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

相关推荐
活宝小娜1 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点1 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow1 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o1 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
刚刚好ā2 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
yqcoder4 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。4 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js
天下代码客5 小时前
【vue】vue中.sync修饰符如何使用--详细代码对比
前端·javascript·vue.js
Domain-zhuo5 小时前
什么是JavaScript原型链?
开发语言·前端·javascript·jvm·ecmascript·原型模式
小丁爱养花5 小时前
前端三剑客(三):JavaScript
开发语言·前端·javascript