资讯专栏INFORMATION COLUMN

关于js的类型检测

Cheriselalala / 487人阅读

摘要:原始类型又有种引用类型有而检测这些类型的变量有种办法,,。而关于引用类型,还可以尝试下操作符。总而言之,如果指定则保存的实际上就是的值,是一个基本类型。

javascript的变量类型分为原始类型和引用类型。

原始类型又有5种:

number

string

boolean

null

undefined

引用类型有:

Function

Array

Date

Object

RegExp

而检测这些类型的变量有3种办法:typeofinstanceofObject.prototype.toString.call。让我来一一例举,废话不多说,上代码。

</>复制代码

  1. //首先是typeof
  2. var obj = 1;
  3. typeof obj; //"number"
  4. obj = "abc"
  5. typeof obj; //"string"
  6. obj = false
  7. typeof obj; //"boolean"
  8. obj = undefined;
  9. typeof obj; //"undefined"
  10. obj = null;
  11. typeof obj; //"object",WTF,其实这是js的一个bug,人艰不拆 T_T
  12. obj = function(){};
  13. typeof obj; //"function"
  14. obj = [];
  15. typeof obj; //"object"
  16. obj = {};
  17. typeof obj; //"object"
  18. obj = /w/g;
  19. typeof obj //"object"

从上面我们可以得出type能检测原始类型number,string,boolean,undefined,引用类型的function。这里容我邪恶的笑一笑。
而关于引用类型,还可以尝试下instanceof操作符。

</>复制代码

  1. var obj = function(){};
  2. obj instanceof Function; //true
  3. obj = [];
  4. obj instanceof Array; //true
  5. obj = {};
  6. obj instanceof Object; //true
  7. obj = new Date()
  8. obj instanceof Date; //true
  9. obj = /w/g;
  10. obj instanceof RegExp; //true
  11. //....桥豆麻袋, 事情其实还没完呢
  12. obj = [];
  13. obj instanceof Object; //true 草草嗒,所有引用类型其实都是继承自Object对象的,所以你懂的。

incetanceof 操作符能鉴别引用类型,可惜有个缺憾是,如果想鉴别一个变量object类型而不是其他的functionarraydate什么的,仍然需要花一番力气。
这里我们是不是漏了什么,如果..

</>复制代码

  1. var obj = new String("abc");
  2. typeof obj; //"object"
  3. obj instanceof String; //true 。

天了个撸,不能愉快玩耍了。要解释这个, 就得解释js里变量的赋值规则。

原始类型的变量直接保存原始值,而不是一个只想对象的指针。如果一个变量赋值给另一个变量,那么每个变量都它自己的一份数据拷贝,并不会相互影响。

引用类型的变量保存的是一个指向内存中实际对象所在的指针(或者说引用)。因此当你将一个对象赋值给变量时,实际是赋值给这个变量一个指针。意味着将一个变量赋值给另一个变量时,两个变量指向的是内存中同一个对象。

</>复制代码

  1. var obj = "abc";
  2. obj.something = 1;
  3. var firstChar = obj.charAt(0); //"a"
  4. console.log(obj.something); //undefined
  5. //实际上js做了这样的处理
  6. var obj = "abc";
  7. var temp = new String(obj);
  8. var firstChar = temp.charAt(0); //"a"
  9. temp.something = 1;
  10. temp = null;
  11. console.log(obj.something); //undefined

创建了一个临时的引用类型变量去访问属性,修改属性,然后就被释放了。阿咧,扯远了,这和我们这片的内容啥关系。。
总而言之,如果指定obj = "abc"则obj保存的实际上就是abc的值,是一个基本类型。而如果指定obj = new String("abc")那么obj实际上保存的是一个指向字符串对象的指针。所以就不难理解两者对于typeofinstanceof的差别了
额,读者:“说了这么多,你有没有一种万全的手段哇”。好吧, 我们来一个简单又粗暴的鉴别手段。

</>复制代码

  1. var obj = 1;
  2. Object.prototype.toString.call(obj) === "[object Number]"; //true
  3. obj = new Number(1);
  4. Object.prototype.toString.call(obj) === "[object Number]"; //true
  5. obj = [];
  6. Object.prototype.toString.call(obj) === "[object Array]"; //true
  7. obj = new Array();
  8. Object.prototype.toString.call(obj) === "[object Array]"; //true
  9. Object.prototype.toString.call(obj) === "[object Object]"; //false

这个方法是不是很好用呢, 哇哈哈哈哈。
总结归纳了下,我列举了一些校验函数:

</>复制代码

  1. //低版本ie中undefined变量可以被修改,所以使用void 0 获取真实的undefined值,
  2. var isUndefined = function(obj) {
  3. //or: return typeof obj === "undefined";
  4. return obj === void 0;
  5. };
  6. //typeof null 的结果是"object"
  7. var isNull = function(obj) {
  8. return obj === null;
  9. };
  10. // boolean值,number值和string值需要考虑两种情况,值为字面量时使用typeof和Object.prototype.toString能检测;
  11. // 值为构造函数构建的时候需要使用Object.prototype.toString或者instanceof检测
  12. var isBoolean = function(obj) {
  13. return Object.prototype.toString.call(obj) == "[object Boolean]";
  14. };
  15. var isNumber = function(obj) {
  16. return Object.prototype.toString.call(obj) == "[object Number]";
  17. };
  18. var isString = function(obj) {
  19. return Object.prototype.toString.call(obj) == "[object String]";
  20. };
  21. var isNaN = function(obj) {
  22. return obj !== obj;
  23. };
  24. //typeof 操作符在引用类型的变量里能对function有效。
  25. var isFunction = function(obj) {
  26. //or: return Object.prototype.toString.call(obj) == "[object Function]";
  27. return typeof obj === "function";
  28. };
  29. var isDate = function(obj) {
  30. return Object.prototype.toString.call(obj) == "[object Date]";
  31. }
  32. var isArray = function(obj) {
  33. return Object.prototype.toString.call(obj) == "[object Array]";
  34. }
  35. var isObject = function(obj) {
  36. //or: return obj === Object(obj);
  37. return Object.prototype.toString.call(obj) == "[object Object]";
  38. }
  39. var isRegExp = function(obj) {
  40. //or: return obj === Object(obj);
  41. return Object.prototype.toString.call(obj) == "[object RegExp]";
  42. }
  43. var has = function(obj, key) {
  44. return Object.prototype.hasOwnProperty.call(obj, key);
  45. };
  46. //判断数组,字符串,对象是否为空
  47. var isEmpty = function(obj) {
  48. if (obj == null) return true;
  49. if (isArray(obj) || isString(obj)) return obj.length === 0;
  50. for (var key in obj) if (has(obj, key)) return false;
  51. return true;
  52. };

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85920.html

相关文章

  • 你不知道js技巧

    摘要:所谓的高级,其实就是讲了一些我们平常用不到或许用了不知道,但是非常实在的东西。比如如果你想检测里面的属性值的话,基本上是不可能的。要知道,我们是有情怀的淫。 JS进阶 说起这个应该算是老生常谈了吧。所谓的高级,其实就是讲了一些我们平常用不到(或许用了不知道),但是非常实在的东西。算是熟练掌握js的一个必经road吧。 检测函数类型 其实检测函数的类型应该算是js的一个痛点,因为js是一...

    edagarli 评论0 收藏0
  • 《编写可维护 JavaScript》读书笔记

    摘要:最近阅读了编写可维护的,在这里记录一下读书笔记。禁止使用,,,的字符串形式。避免使用级事件处理函数。让事件处理程序成为接触到对象的唯一函数。检测函数是检测检测函数的最佳选择。为特定浏览器的特性进行测试,并仅当特性存在时即可应用特性检测。 最近阅读了《编写可维护的 JavaScript》,在这里记录一下读书笔记。书中主要基于三个方向来讲解怎么增加代码的可维护性:编程风格、编程实践、自动化...

    tuniutech 评论0 收藏0
  • JavaScript数据类型及其检测

    摘要:值的比较只进行值的比较会进行数据类型的转换。只要在当前实例的原型链上,我们用其检测出来的结果都是。但检测与不一样,还可以处理基本数据类型的检测。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有几种类型的值? Javascript有两种数据类型,分别是基本数据类型和引用数据类型。其中...

    starsfun 评论0 收藏0
  • JavaScript数据类型及其检测

    摘要:值的比较只进行值的比较会进行数据类型的转换。只要在当前实例的原型链上,我们用其检测出来的结果都是。但检测与不一样,还可以处理基本数据类型的检测。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有几种类型的值? Javascript有两种数据类型,分别是基本数据类型和引用数据类型。其中...

    dingding199389 评论0 收藏0
  • JavaScript数据类型及其检测

    摘要:值的比较只进行值的比较会进行数据类型的转换。只要在当前实例的原型链上,我们用其检测出来的结果都是。但检测与不一样,还可以处理基本数据类型的检测。 showImg(https://segmentfault.com/img/remote/1460000016733921); 一、JavaScript有几种类型的值? Javascript有两种数据类型,分别是基本数据类型和引用数据类型。其中...

    Moxmi 评论0 收藏0

发表评论

0条评论

Cheriselalala

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<