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) === ...
随机推荐
- 使用 DotNet CLI 创建自定义的 WPF 项目模板
描述 当我们安装完 DotNetCore 3.0 版本的 SDK 后,我们就可以创建基于 DotNetCore 的 WPF 项目模板,通过如下 CLI 可以方便快捷的创建并运行我们的项目: dotne ...
- css控制元素 水平垂直居中
控制元素居中核心代码为 position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; css: /* 容器 */ .w ...
- 微信小程序 选择微信自带的地址 用户授权选择了拒绝
// 选择微信自带地址 addAddr:function () { wx.chooseAddress({ success: function (res) { self.setData({ addrIn ...
- python中os模块和sys模块的常见用法
OS模块的常见用法 os.remove() 删除文件 os.rename() 重命名文件 os.walk() 生成目录树下的所有文件名 os.chdir() 改变目录 os.mkd ...
- windows常用目录
启动目录位置 %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
- css之overflow应用
overflow应用的两个小例子: 1.单行文本出现省略号的情况 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...
- Redis和MongoDB的区别(面试受用)
项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB. 最近又想起为什么用MongoDB,就查阅一下,汇总汇总: 之前也用过redis ...
- python一直放弃到双数的day10
今天接着来说那个新的大知识点,函数,函数中是可以传递一个数值的,这个数值简称为参数,对于参数,他可以是任意个数和任意类型(数据类型).参数的其中一种有位置传参,函数中的参数有几个,那么就要传入几个,传 ...
- mongoTemplate查询大数据过慢
先上两段代码 代码一 Query query = new Query();queryAfter.addCriteria(Criteria.where("id").in(idList ...
- 使用RAP2和Mock.JS实现Web API接口的数据模拟和测试
最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...