JavaScript中数据类型判断
一、七大数据类型
Number(包括整型和浮点型)
String、
Boolean、
Symbol ES6 新增,能作为对象属性的标识符,具有唯一性
Undefined、(指变量创建后但没有赋值,变量的默认值是 undefined );规范指定类型为首字母大写Undefined;但是只有一个值,即 undefined (undefined可以被重写 有时候用void 0代替)
Null、 空对象指针;规范指定类型为首字母大写NUll;但是只有一个值,即null;null == undefined && null !== undefined
复合类型:值存储在堆( heap )中
Object
备注:数组( Array )日期( Date )、正则( RegExp )和 函数( Function )都是归属于对象类型
但是在使用 typeof 进行判断时候,数组等返回 object,函数作为特殊情况,返回 function(至于为啥返回 function,你得问设计者,也许是为了方便开发者判断呢···)
二、检测方法
let a_number = 1
let b_string = '1'
let c_boolean = true
let d_symbol = Symbol('1')
let e_undefined = undefined
let f_null = null let g_object = {}
let h_array = []
let i_function = function () {}
console.log('a_number: ', typeof a_number) // number
console.log('b_string: ', typeof b_string) // string
console.log('c_boolean: ', typeof c_boolean) // boolean
console.log('d_symbol: ', typeof d_symbol) // symbol
console.log('e_undefined: ',typeof e_undefined) // undefined
console.log('f_null: ', typeof f_null) // object
console.log('g_object: ', typeof g_object) // object
console.log('h_array: ', typeof h_array) // object
console.log('i_function: ', typeof i_function) // function
console.log('a_number: ', Object.prototype.toString.call(a_number)) // [object Number]
console.log('b_string: ', Object.prototype.toString.call(b_string)) // [object String]
console.log('c_boolean: ', Object.prototype.toString.call(c_boolean)) // [object Boolean]
console.log('d_symbol: ', Object.prototype.toString.call(d_symbol)) // [object Symbol]
console.log('e_undefined: ',Object.prototype.toString.call(e_undefined)) // [object Undefined]
console.log('f_null: ', Object.prototype.toString.call(f_null)) // [object Null]
console.log('g_object: ', Object.prototype.toString.call(g_object)) // [object Object]
console.log('h_array: ', Object.prototype.toString.call(h_array)) // [object Array]
console.log('i_function: ', Object.prototype.toString.call(i_function)) // [object Function]
function Type() {
let typeFn = {}
let typeList = ['Number', 'String', 'Boolean', 'Symbol', 'Undefined', 'Null', 'Object', 'Array', 'Function']
typeList.forEach(type => {
typeFn['is' + type] = obj => Object.prototype.toString.call(obj) === '[object ' + type + ']'
})
return typeFn
}
使用:
let TypeFn = Type()
console.log(TypeFn.isBoolean(false)) // true
console.log(a_number.constructor === Number) // true
console.log(b_string.constructor === String) // true
console.log(c_boolean.constructor === Boolean) // true
console.log(d_symbol.constructor === Symbol) // true
console.log(e_undefined.constructor === Undefined) // 报错 --- undefined 没有 constructor,也没有 Undefined 对象
console.log(f_null.constructor === Null) // 报错 --- null 没有 constructor,也没有 Null 对象
console.log(g_object.constructor === Object) // true
console.log(h_array.constructor === Array) // true
console.log(i_function.constructor === Function) // true
1、undefined 和 null 没有 constructor,不能判断
2、而且在 JavaScript 中,实例化一个构造函数 A 时候,得到的实例对象的 constructor 会指向该构造函数 A,然而该构造函数 A 可能并不是我们所希望的数据类型函数
例如:
function A() {}
let b = new A() // 此时 b 成为一个对象
b.constructor === A // true
b.constructor === Object // false -- 此时使用 constructor 并不能知道 b 是一个对象
例子:
正常情况:
构造函数:
function A() {}
对象:
let B = new A()
结果:
B instanceof A // true
伪造情况:
构造函数:
function A() {}
对象:
let B = {}
B.__proto__ = A.prototype
如果:
A.prototype === B.__proto__
则
console.log(B instanceof A) // true
[] instanceof Array // true
[] instanceof Object // true 因为原型链的最后都存在 Object.prototype
无法准确判断 [] 的类型
神奇之处:
'1'.__proto__ === String.prototype
但是
'1' instanceof String 却返回 false 正常情况:
new String(1).__proto__ === String.prototype
new String(1) instanceof String // 返回 true
神奇之处:
(1).__proto__ === Number.prototype
但是
1 instanceof Number 却返回false
正常情况:
new Number(1).__proto__ === String.prototype
new Number(1) instanceof Number // 返回 true
JavaScript中数据类型判断的更多相关文章
- javascript中怎么判断两个数据类型相等
在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "obj ...
- 【跟着子迟品 underscore】JavaScript 中如何判断两个元素是否 "相同"
Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...
- JavaScript中正则表达式判断匹配规则以及常用的方法
JavaScript中正则表达式判断匹配规则以及常用的方法: 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想 ...
- JavaScript中数据类型的转换规则
JavaScript中数据类型的转换规则 制作人:全心全意 JavaScript是一种无类型语言,也就是说,在声明变量时无须指定数据类型,这使得JavaScript更具有灵活性和简单性. 在代码执行过 ...
- 浅玩JavaScript的数据类型判断
前言 平常在需要进行类型判断时,随手拿起typeof就像手枪一样只管突突突...也没有仔细的去了解它的具体特性. 所以这里就利用空闲时间,来做一个较为详细的了解. 首先我们来全面看一遍typeof类型 ...
- JavaScript中如何判断两变量是否“相等”?
1 为什么要判断? 可能有些同学看到这个标题就会产生疑惑,为什么我们要判断JavaScript中的两个变量是否相等,JavaScript不是已经提供了双等号“==”以及三等号“===”给我们使用了吗? ...
- javascript中怎么判断对象{}为空
有时候通过AJAX方法调用返回的是一个JSON对象,而这个对象可能在开发过程中会没有数据是一个空{}. JavaScript判断object/json 是否为空,可以使用jQuery的isEmptyO ...
- JavaScript中如何判断数组类型
前言 JavaScript中关于数组的判定问题,一直都是一个必须要掌握的点,那么,运用知识,如何判断一个类型是数组,就需要有对JavaScript使用有着深入的了解. 判断方法 一.Array.isA ...
- javascript中如何判断数组是数组
if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === ...
随机推荐
- 学习笔记—JVM
JVM结构 JVM总体结构图 类加载子系统与方法区: 类加载子系统负责从文件系统和网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间. 除了类信息外,方法区中还可能会存放运行时常量池 ...
- video.js 一个页面同时播放多个视频
$(data).each(function(i, item) { // innerHTML += '<li type-id="'+item.id+'">'+ // '& ...
- 第二次上机,ASP内置对象的使用
3.新建Reg.asp文档,参照1中的Reg.html,通过VBScript服务器端脚本代码实现 ”班级” Select表单的自动生成,如下所示: 注:通过循环语句,采用Response.Write命 ...
- html 表单input录入内容校验
<p>文本框只能输入数字代码(小数点也不能输入)</p><input onkeyup="this.value=this.value.replace(/\D/g, ...
- 如何在Android studio上运行从github上下载的RN项目
想要编译别人的RN项目,还是要踩踩坑才能走上正轨啊,分享下我试过多种方法后最喜欢的方法(其实是因为我多次用VS Code编译都是以失败而告终,所以才选择的studio) 注意:这一步是你的开发环境都安 ...
- selenium-自动化用例(十一)
思路 将页面操作与用例case分别封装,编写case时就可以用同一个操作方法对应多个case 如下图: PageGUI:存放页面操作方法,每个页面写一个文件,每个文件中写同一个页面不同的操作,例如检索 ...
- SQLServer之多表联合查询
多表联合查询简介 定义:连接查询是关系型数据库最主要的查询,通过连接运算符可以实现多个表连接数据查询. 分类:内连接,外连接,全外连接. 内连接 定义 内联接使用比较运算符根据每个表的通用列中的值匹配 ...
- CynosDB技术详解——架构设计
本文由腾讯云数据库发表 前言 CynosDB是新一代分布式数据库,100%兼容MySQL和PostgreSQL,支持存储弹性扩展,一主多从共享数据,性能更是超越社区原生MySQL和PostgreSQL ...
- 基于Linux下catalog方式的 Oracle 备份策略(RMAN)
--********************************** -- 基于Linux下 Oracle 备份策略(RMAN) --******************************* ...
- Pyinstaller 打包exe
安装 pip insatll Pyinstaller 参数 pyinstaller -Fw main.py 参数 概述 -F,-onefile 打包一个单个文件,如果你的代码都写在一个.py文件的 ...