JS中的类型检测总结

简介:

JS中的类型检测

typeof操作符

typeof对于每一种基本类型都有不同的返回值,但是对于所有的引用类型都只返回'object'

注意:对于Null类型返回'object',对于特殊的引用类型Function返回'function'

Undefined类型: 'undefined'

Boolean类型: 'boolean'

String类型: 'string'

Number类型: 'number'

引用类型/Null类型: 'object'

Function类型: 'function'

instanceof操作符

instanceof 操作符用来判断左表达式的原型链里有没有右表达式的原型。

因此在一定情况下可以用来作为引用类型的检测方法。

比如,对于某个regexp实例a,利用instanceof来检测:a._proto_为RegExp.prototype;RegExp.prototype为RegExp.prototype,两个值相等,返回true

Javascript instanceof 运算符源码

function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
 var O = R.prototype;// 取 R 的显示原型
 L = L.__proto__;// 取 L 的隐式原型
 while (true) { 
   if (L === null) 
     return false; 
   if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
     return true; 
   L = L.__proto__; 
 } 
}

在利用instanceof来进行类型检测时,左表达式为检测对象,右表达式为需要检测的引用类型的构造函数

Object
Array
Function
Date
RegExp
Function
Global
Math
//以下为基本类型的显示构造函数,这些构造函数的实例不是基本类型。
Boolean
Number
String

注:Global对象是兜底的对象,所有全局变量和全局函数都是Global对象的属性,Global对象的属性有各种原生的构造函数,还有三个特殊值NaN,undefined,Infinity。 window对象是Global对象的浏览器实现,但是window对象包含更多的原生属性。

instanceof类型检测的缺点

instanceof的左右表达式必须满足在同个全局作用域中,因为不同全局作用域的构造函数的prototype属性不是同一个对象,比如在frame1中的Array.prototype与frame2中的Array.prototype就不是一个对象。

安全的类型检测方法

Object.protptype.toString.call(value)

在任何值上调用Object.prototype.toString,都会返回一个[object NativeConstructorName]的字符串。

比如:

var a = []

console.log(Object.prototype.toString.call(a)); //'[object Array]'

对于上文提到的所有类型以及JSON类型,这个方法都会返回不同的字符串(NativeConstructorName以大写字母开头),所以这是一个类型检测的好方法。




原文发布时间为:2017/11/21
原文作者: 静默行
本文来源: 开源中国 如需转载请联系原作者
目录
相关文章
|
12天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
10 0
|
28天前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
31 0
|
8天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
14天前
|
JavaScript 前端开发
JavaScript 中如何检测一个变量是一个 String 类型?
JavaScript 中如何检测一个变量是一个 String 类型?
21 2
|
3月前
|
JSON JavaScript 前端开发
抓住异常,解救你的代码世界:你应该了解的 JavaScript 异常类型
抓住异常,解救你的代码世界:你应该了解的 JavaScript 异常类型
|
3月前
|
JavaScript 前端开发
JavaScript一种新的数据结构类型Map
JavaScript一种新的数据结构类型Map
|
1月前
|
Web App开发 iOS开发
编程笔记 html5&css&js 026 HTML输入类型(2/2)
编程笔记 html5&css&js 026 HTML输入类型(2/2)
|
1月前
|
移动开发 数据安全/隐私保护 HTML5
编程笔记 html5&css&js 025 HTML输入类型(1/2)
编程笔记 html5&css&js 025 HTML输入类型(1/2)
|
2月前
|
JavaScript 前端开发 开发者
JavaScript——周技能检测——菜单编辑——2022年11月22日(考完)
JavaScript——周技能检测——菜单编辑——2022年11月22日(考完)
24 0
|
3月前
|
JavaScript 前端开发 IDE
【TypeScript】带类型语法的JavaScript
【1月更文挑战第26天】【TypeScript】带类型语法的JavaScript