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 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
JQuery 学习笔记 选择器之一
Jul 23 Javascript
javascript禁用Tab键脚本实例
Nov 22 Javascript
基于JQuery制作可编辑的表格特效
Dec 23 Javascript
js实现鼠标感应图片展示的方法
Feb 27 Javascript
JS扩展方法实例分析
Apr 15 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
Jun 24 Javascript
JS打开摄像头并截图上传示例
Feb 18 Javascript
web前端页面生成exe可执行文件的方法
Feb 08 Javascript
layui实现table加载的示例代码
Aug 14 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
Dec 05 Javascript
JavaScript之解构赋值的理解
Jan 30 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
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
Python实现计算最小编辑距离
2016/03/17 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
python调用摄像头拍摄数据集
2019/06/01 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
利用pandas将非数值数据转换成数值的方式
2019/12/18 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
python Tornado框架的使用示例
2020/10/19 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
优秀管理者获奖感言
2014/02/17 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
介绍信的写法
2015/01/31 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
加强党性修养心得体会
2016/01/21 职场文书
Python如何加载模型并查看网络
2022/07/15 Python