node不认识类型?多半是没用上这几段代码

那么众所周知啊,js当中的类型主要分为以下两大类:

  • 基本类型(原始类型) string.number.boolean.undefined.null.bigInt.Symbol

  • 引用类型(复杂类型) Array.Object.Function.Date

我们可以一看看出类型,但是node却不行,那么我们怎么能让node也可以分辨类型呢?可以试试以下几个代码:

typeof

js 复制代码
typeof "John"                // 返回 string 
typeof 3.14                  // 返回 number
typeof false                 // 返回 boolean
typeof [1,2,3,4]             // 返回 object
typeof {name:'John', age:34} // 返回 object
typeof 132456n               // 返回 bigint
typeof null                // 返回 object
typeof undefined           // 返回 undefined

typeof []                 // 返回 object
typeof {}                 // 返回 object
typeof function(){}       // 返回 function

结果就是:

  1. typeof可以判断null以外所有的原始类型

  2. typeof眼里所有的引用类型都是object,除了function

这是因为在执行时,typeof是将值转化为二进制来判断类型的,二进制前三位是000说明是引用类型,所有的引用类型二进制前三位都是000,除了function;而null转化为二进制是一串0,所以null的类型被看作是object

instanceof

这一个代码比较特殊,他只能判断引用类型的函数

js 复制代码
let s = 'hello'
let num = 123
let f = true
let u = undefined
let n = null
let sy = Symbol(1)
let big = 12343242n

let arr = []
let obj = {}
let fn = function(){}

console.log(obj instanceof Object);//true
console.log(fn instanceof Function);//true
console.log(arr instanceof Array);//true

console.log(s instanceof String);//false
console.log(num instanceof Number);//false
console.log(f instanceof Boolean);//false
console.log(n instanceof Null);//报错
console.log(big instanceof BigInt);//false

要注意的是,当这串代码执行数组的时候,也会把数组认定为是对象

js 复制代码
let arr = []
console.log(arr instanceof Object)//true

因为这个代码的原理是来通过隐式原型链来查找的,当判断arr是不是对象的时候,js的执行逻辑是这样的

js 复制代码
arr.__proto__ === Array.prototype//√
arr.__proto__.__proto__ === Object.prototype//√

Array.isArray

这串代码只能判断是否为数组

js 复制代码
const arr = []

console.log(Array.isArray(arr)); //true
console.log(Array.isArray('[]'));  //false

Object.prototype.toString(x)

上面三个代码都不能完整地分辨出数据类型,但是接下来这一个是重量级的,可以判断所有类型

js 复制代码
let s = 'hello'
let num = 123
let f = true
let u = undefined
let n = null
let sy = Symbol(1)
let big = 12343242n

let arr = []
let obj = {}
let fn = function(){}
console.log(Object.prototype.toString.call(s))
console.log(Object.prototype.toString.call(num))
console.log(Object.prototype.toString.call(f))
console.log(Object.prototype.toString.call(u))
console.log(Object.prototype.toString.call(n))
console.log(Object.prototype.toString.call(sy))
console.log(Object.prototype.toString.call(big)) 
console.log(Object.prototype.toString.call(arr))
console.log(Object.prototype.toString.call(obj))
console.log(Object.prototype.toString.call(fn))

可以看出来,这串代码被很好的辨别出来了,但是有个中括号和object,觉得碍事的话,可以在后面加个.slice(8, -1)),这样的话,最后的输出结果只有想要的数据类型

js 复制代码
let s = 'hello'
console.log(Object.prototype.toString.call(s).slice(8,-1))//String

若有不对,欢迎大佬指出

参考文献

相关推荐
福兮说6 分钟前
纯前端把图片压缩到指定体积:canvas.toBlob 配合二分查找
前端·javascript·canvas·图片处理
志尊宝20 分钟前
Vue3 零基础每日笔记(018):按键与鼠标修饰符——回车搜索、Ctrl+S 保存这样写
javascript·vue.js·笔记
可乐鸡翅yeah_1 小时前
HLS流媒体首屏起播慢深度优化,从分片、索引、播放器全链路调优
开发语言·javascript·ecmascript·m3u8·m3u8在线
开开心心就好2 小时前
低年级识字练笔顺工具,电脑和安卓端都能用
前端·javascript·网络·安全·scala·erlang·语音识别
杨利杰YJlio2 小时前
ITSK PE 26U5 测试版解读:组件完善、VMD 修复与服务器支持边界
前端·javascript·后端
夏幻灵2 小时前
Vue / React 列表渲染中的 key:为什么没有 key,Checkbox 可能“对号跑错”?
前端·javascript·vue.js
YWL2 小时前
vue-time-axis-plus进阶:双进度条+跨空白续播+播放指针,打造专业级监控回放体验
前端·javascript·vue·时间轴
岁岁种桃花儿2 小时前
Vue组件第六篇:Vue单文件组件
开发语言·前端·javascript·vue.js
yivifu2 小时前
创建支持交叉链接且鼠标悬停显示注释框的HTML文件
前端·javascript·html
雪芽蓝域zzs15 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js