摘要:类型检查中有中基本数据类型,分别是还有一种复杂数据类型是松散类型的,所以使用以上种数据类型,就可以表示所有数据。从上面结果可以看到,使用在检查数组,对象,正则表达式时都会返回如此模糊的类型检查方法,应用场景也十分有限。
js 类型检查
js中有5中基本数据类型,分别是:
Undefined,Null,Boolean,Number,String
还有一种复杂数据类型:
Object
ECMAScript是松散类型的,所以使用以上6种数据类型,就可以表示所有数据。
那么,如何检测变量的数据类型呢。
下面就介绍几种在业务代码中,常用的几种常用类型检查方法
typeoftypeof操作符用以获取一个变量或者表达式的类型。
typeof一般只能返回如下几个结果:- "number", ------eg: typeof 2 - "boolean", ----- eg: typeof false - "string", -------- eg: typeof "123" - "function"(函数,),------ eg: typeof function(){} - "object"(null,数组,对象,正则表达式), --- typeof /s/ - "undefined"。 ------ typeof hehe
从上面结果可以看到, 使用typeof 在检查 null,数组,对象,正则表达式时都会返回"object"
如此模糊的类型检查方法,应用场景也十分有限。
如果想知道一个变量到底是什么类型的 “object”,就可以使用instanceof,
var pattern = /s/; var arr = [1,2,3]; var obj = new Object(); alert(pattern instanceof RegExp); // true alert(arr instanceof Array); //true alert(obj instanceof Object); //true alert(null instanceof Object); // false;
也可以用来检查自己创建的变量:
var a = new Array(); console.log(a instanceof Array) // 返回true。 console.log(a instanceof Object) // 返回 Array 是object 的子类。也会返回true.
但是这个操作符的问题在于它假定只存在一个全局的执行环境,存在多个框架的情景下,会存在两个不同的数组构造函数,这里就引入了另一个方法来判断数组
isArray()ECMAScript5 新增的Array.isArray() 方法,无论执行环境,只有一个目的,判断是不是数组
Object.prototype.toString.call()原生的toString() 方法,都会返回一个[object NativeConstructorName] 格式的字符串,
通过判断每个类在内部的[[Class]] 属性,来检查类型
var a = new Array() Object.prototype.toString.call(a) == "[object Array]"` // 使用这种方法不仅可以判断数组,还可以判断其他类型。 Object.prototype.toString.call(value) =="[object Function]" {}.prototype.toString.call(value) =="[object JSON]" //这种方法也可以 检查原生的JSON对象$.type
zeptov1.0+
具体用法可以查看 官网文档,用法如下
$.type(object) ⇒ string 获取JavaScript 对象的类型。可能的类型有: null undefined boolean number string function array date regexp object error。 alert($.type([])) // "array" alert($.type("11")) // "string" alert($.type({})) // "object"
然后,我们可以分析下,这个$.type 方法,使用的技巧是否不同于上面几种类型检查方法
查看 zepto@1.1.6 的源码,基本和上面的 toString.call() 方法类似
type 方法的部分如下
function type(obj) { return obj == null ? String(obj) : class2type[toString.call(obj)] || "object" }
代码的关键部分,就是这个class2type 对象里面存放了所有数据类型对应的字符串,使用type 方法是,直接取class2type 里面的键值对即可。
再往下看,就可以发现 使用each 方法 ,遍历所有可能的数据类型,为class2type赋值。
$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase() })
这里得到的 class2type 结果是:
{ [object Array]:"array" [object Boolean]:"boolean" [object Date]:"date" [object Error]:"error" [object Function]:"function" [object Number]:"number" [object Object]:"object" [object RegExp]:"regexp" [object String]:"string" }
当然,我们可以直接把class2type 对象拿来使用。
...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/87239.html
摘要:近日,微软在上开源了一个静态类型检查工具,引起了社区内的多方关注。在微软推出之前,主流的静态检查工具有三款官方的出的出的。微软的有个模式,应该是吸收了这点,而且更加好用因为不需要额外安装和其它依赖。 showImg(https://segmentfault.com/img/bVbqujh?w=5700&h=3601);近日,微软在 Github 上开源了一个 Python 静态类型检查...
摘要:原文链接翻译于今天我们兴奋的发布了的尝鲜版,一个新的静态类型检查器。为添加了静态类型检查,以提高开发效率和代码质量。这最终形成一个高度并行增量式的检查架构,类似。知道缩小类型范围时做动态检查的影响。 原文链接:https://code.facebook.com/posts/1505962329687926/flow-a-new-static-type-checker-for-java...
摘要:所有变量的类型在编译时已知在程序运行之前,因此编译器也可以推导出所有表达式的类型。像变量的类型一样,这些声明是重要的文档,对代码读者很有用,并由编译器进行静态检查。对象类型的值对象类型的值是由其类型标记的圆。 大纲 1.编程语言中的数据类型2.静态与动态数据类型3.类型检查4.易变性和不变性5.快照图6.复杂的数据类型:数组和集合7.有用的不可变类型8.空引用9.总结 编程语言中的数据...
摘要:一返回值调用外部方法获取的值需要对类型做判断,因为我们对方法返回的值是有期望值类型,但是却不能保证这个接口返回的值一直是同一个类型。 19年目标:消灭英语!我新开了一个公众号记录一个程序员学英语的历程 有提升英语诉求的小伙伴可以关注公众号:csenglish 程序员学英语,每天花10分钟交作业,跟我一起学英语吧 javascript作为一门动态类型语言,具有很高的动态灵活性,当定义函数...
摘要:扩展静态类型检查语言与系列等语言有一点很大的不同,就是语言是弱类型语言。但其实很多开发人员还是比较喜欢用来开发项目,所以开发出来帮助语言扩展静态类型检查功能,规避上面提到的问题。 js 扩展:静态类型检查(facebook flow) js 语言与 java、C 系列等语言有一点很大的不同,就是 js 语言是弱类型语言。js 语言的这个特性可能让大家觉得 js 很自由,没有强制性的约束...
摘要:进入主页使用文档是一个设计简单的运行时的数据类型检查工具,它可以帮助你的程序在使用某个组变量前,对变量的数据类型进行检查,防止在使用变量进行运算时由于数据类型不同导致报错。 showImg(https://segmentfault.com/img/bVbfW41?w=1380&h=500); 进入GitHub主页使用文档 HelloType是一个api设计简单的js运行时的数据类型检查...
阅读 2400·2021-09-22 15:15
阅读 644·2021-09-02 15:11
阅读 1787·2021-08-30 09:48
阅读 1887·2019-08-30 15:56
阅读 1492·2019-08-30 15:52
阅读 2048·2019-08-30 15:44
阅读 437·2019-08-29 16:29
阅读 1543·2019-08-29 11:06