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) === ...
随机推荐
- web开发布局---传统布局篇
1.传统布局 盒状模型结合 display 属性.float 浮动以及 position 定位属性设计的各式传统布局形式. 2.说再多不如动手实践,下面举三个例子 html 部分代码: <sec ...
- vue v-for动画bug
因为是v-for 循环 出来的,:key = "index" 会出现问题,所以,需要把:key="XXX"换成其他属性就好了. 链接参考: https://se ...
- js当地天气调用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- selenium+python自动化测试系列---基础知识篇(1、HTML基础知识1)
1.什么是HTML HTML是一种描述网页的语言.HTML指超文本标记语言(Hyper Text Markup Language),它不是一种编程语言,而是一种标记语言(markup language ...
- SAP MM A工厂下的PR可以转成B工厂下的PO?
SAP MM A工厂下的PR可以转成B工厂下的PO? 答案是可能的,这也是SAP标准行为之一. 如下图采购申请单据, PR中的Plant是GENL.该PR 已经转成了PO,如上图. 看这个PO,工厂代 ...
- Windows Azure NotificationHub+Firebase Cloud Message 实现消息推动(付源码)
前期项目一直用的是Windows azure NotificationHub+Google Cloud Message 实现消息推送, 但是GCM google已经不再推荐使用,慢慢就不再维护了, 现 ...
- android 卡顿 Matrix TraceCanary
转载: 通过观察大盘整体的帧率及掉帧程度,来评估并监控一些重要场景的流畅性.通过一个闭环的流程,利用 Matrix-TraceCanary 模块从客户端对卡顿进行捕捉与分析上报,通过后台聚类问题堆栈及 ...
- 通过maven profile 打包指定环境配置
背景 最近换了个新公司接手了一个老项目,然后比较坑的是这个公司的项目都没有没有做多环境打包配置,每次发布一个环境都要手动的去修改配置文件.今天正好有空就来配置下. 解决这个问题的方式有很多,我这里挑选 ...
- Winserver-默认以管理员运行程序
打开secpol.msc 打开本地安全策略找到安全设置--本地策略--安全选项用户账户控制:以管理员批准模式运行所有管理员---改为禁用保存设置重启电脑
- Video clip 视频剪辑:入门级
作为一个对小说漫画电视剧电影的设计有着自己独特需求的人,一直对视频剪辑有着浓厚的兴趣,之前用爱剪辑这种通俗易上手的软件做过简单的小视频.但是这个毕竟满足不了我自己的需求而且属于完全门外汉级别.这次终于 ...