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) === ...
随机推荐
- 使用 MSIX 打包 DotNetCore 3.0 客户端程序
如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...
- Nginx支持 React browser router
修改nginx配置文件,添加try_file配置如下,即可实现对 React browser router 的支持. location / { root /var/www/mysite; try_fi ...
- Go 反射
基本了解 在Go语言中,大多数时候值/类型/函数非常直接,要的话,定义一个.你想要个Struct type Foo struct { A int B string } 你想要一个值,你定义出来 var ...
- C# 内插字符串与字符串复合格式
var name = "Tom"; ; string aa = string.Format("name:{0},age:{1}", name, age);//字 ...
- Linux学习历程——Centos 7 账户管理命令(用户组篇)groupadd groupmod groupdel
一.命令介绍 groupadd:创建用户组 groupmod:修改用户组属性 groupdel:删除用户组 ---------------------------------------------- ...
- JS去除掉字符串前后空格
1. 推荐使用jquery已封装好的方法,非常简单 $.trim(str) jquery的内部实现如下, function trim(str){ return str.replace(/^(\s|\u ...
- ARTS打卡第三周
Algorithm 题目描述 Given an array of integers, find if the array contains any duplicates. Your function ...
- 数据结构学习之栈求解n皇后问题
数据结构学习之栈求解n皇后问题 0x1 目的 深入掌握栈应用的算法和设计 0x2 内容 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...
- eval、exec及元类、单例实现的5种方法
eval内置函数 # eval内置函数的使用场景:# 1.执行字符串会得到相应的执行结果# 2.一般用于类型转化,该函数执行完有返回值,得到dict.list.tuple等dic_str = ...
- 在Winform系统界面中对进展阶段的动态展示和处理
在我们做客户关系管理系统的Winform界面的时候,需要对进展阶段这个属性进行一个方便的动态切换和标记处理,如我们根据不同的进展阶段显示不同的相关信息,也可以随时保存当前的阶段信息.其实也是一个比较常 ...