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 相关文章推荐
图片完美缩放
Sep 07 Javascript
JavaScript 变量作用域分析
Jul 04 Javascript
前后台交互过程中json格式如何解析以及如何生成
Dec 26 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
js实现类似新浪微博首页内容渐显效果的方法
Apr 10 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
jQuery插件formValidator实现表单验证
May 23 Javascript
在JavaScript中调用Java类和接口的方法
Sep 07 Javascript
JS判断一个数是否是水仙花数
Jun 11 Javascript
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
Vue中axios拦截器如何单独配置token
Dec 27 Javascript
Vue如何基于es6导入外部js文件
May 15 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
微信小程序云开发之新手环境配置
2019/05/16 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
javaScript代码飘红报错看不懂?读完这篇文章再试试
2020/08/19 Javascript
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python闭包实现计数器的方法
2015/05/05 Python
python实现的简单抽奖系统实例
2015/05/22 Python
python获取文件扩展名的方法
2015/07/06 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
python可以用哪些数据库
2020/06/22 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
python如何设置静态变量
2020/09/07 Python
通过代码实例了解Python异常本质
2020/09/16 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
写给女朋友的检讨书
2014/01/28 职场文书
实习报告评语
2014/04/26 职场文书
建筑安全责任书范本
2014/07/24 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
应用最多的公文《通知》如何写?
2019/04/02 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python