js 数据类型判断的方法


Posted in Javascript onDecember 03, 2020

typeof

一般用于判断基本数据类型,用于判断引用数据类型和null时会发生意外的错误

typeof 1 // number
typeof '1' // string
typeof true // boolean
typeof Symbol('1') // symbol
typeof undefined // undefined

typeof function(){} // function
typeof { a: 1 } // object
typeof [1, 2, 3] // object 这里会判断异常,建议使用Array.isArray区分数组和对象

//以下也会判断异常
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';

//最后来看null
typeof null // object

来看下typeof的原理:不同的对象在底层都表示为二进制,在js里二进制前三位都为0的会 被判断为object类型,null的二进制表示全0(对应机器码的null指针,一般为全0),所以会被判断成object类型。

instanceof

它的主要作用是用来判断一个实例是否属于某种类型,用于判断对象很合适

语法:object instanceof constructor 
object 某个实例对象 constructor 某个构造函数

'abc' instanceof String //false 检查原型链会返回undefined
new String('abc') instanceof String //true
new Boolean(true) instanceof Boolean // true 
new Number(1) instanceof Number // true

顺便做一下简单实现
function new_instance_of(leftVaule, rightVaule) { 
		let leftProto = leftVaule.__proto__; // 取左表达式的__proto__值
  let rightPrototype = rightVaule.prototype; // 取右表达式的 prototype 值
  
  while (true) {
  	if (leftProto === null) {
      return false;	
    }
    if (rightPrototype === rightProto) {
      return true;	
    } 
    leftProto = leftProto.__proto__ 
  }
}

constructor

根据数据类型的构造函数返回类型,但是由于null和undefined没有构造函数故无法判断

''.constructor == String  //true 
new Number(1).constructor == Number  //true 
new Function().constructor == Function //true 
true.constructor == Boolean  //true
new Date().constructor == Date //true

Object.prototype.toString.call()

可以通过 toString() 来获取每个对象的类型。为了每个对象都能通过Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数。

var toString = Object.prototype.toString;

toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]

toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]

lodash.getTag和lodash.baseGetTag

baseGetTag使用Object.prototype.toString.call和Symbol.toStringTag来判断属性的类型Symbol.toStringTag只适合做特定的类型判断

js 数据类型判断的方法

//lodash.baseGetTag部分重要源码

//如果值是undefined和null返回对应tag
   if (value == null) {
    return value === undefined ? 
 				'[object Undefined]' 
 				: 
 				'[object Null]'
   }
   // 如果不支持Symbol或者value值上面没有Symbol.toStringTag属性,
		 //直接返回Object.prototype.toString调用后的值  
   if (!(symToStringTag && symToStringTag in Object(value))) {
    return toString.call(value)
   }

以上就是js 数据类型判断的方法的详细内容,更多关于js 数据类型判断的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
Sep 26 Javascript
鼠标经过的文本框textbox变色
May 21 Javascript
juqery 学习之三 选择器 层级 基本
Nov 25 Javascript
javascript中的一些注意事项 更新中
Dec 06 Javascript
javascript 闭包疑问
Dec 30 Javascript
jQuery判断checkbox是否选中的3种方法
Aug 12 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
使用canvas及js简单生成验证码方法
Apr 02 Javascript
node.js中使用Export和Import的方法
Sep 18 Javascript
Vue 中获取当前时间并实时刷新的实现代码
May 12 Javascript
用vue设计一个日历表
Dec 03 #Vue.js
JS闭包原理及其使用场景解析
Dec 03 #Javascript
实用的 vue tags 创建缓存导航的过程实现
Dec 03 #Vue.js
Javascript节流函数throttle和防抖函数debounce
Dec 03 #Javascript
如何实现vue的tree组件
Dec 03 #Vue.js
Vue实现图书管理小案例
Dec 03 #Vue.js
基于ajax实现上传图片代码示例解析
Dec 03 #Javascript
You might like
古巴咖啡 Cubita琥爵咖啡 独特的加勒比海风味咖啡
2021/03/06 新手入门
JS window.opener返回父页面的应用
2009/10/24 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
15条JavaScript最佳实践小结
2013/08/09 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
js动态引入的四种方法
2018/05/05 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
JS如何寻找数组中心索引过程解析
2020/06/01 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
python脚本内运行linux命令的方法
2015/07/02 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python装饰器原理与用法深入详解
2019/12/19 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
阿迪达斯芬兰官方网站:adidas芬兰
2017/01/30 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
高中军训感言500字
2014/02/24 职场文书
干部下基层实施方案
2014/03/14 职场文书
工作目标责任书
2014/07/23 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
开会通知
2015/04/20 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers