开发者社区> zhanginzaghi> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JS编程建议——4:注意JavaScript数据类型的特殊性(3)

简介: 4:注意JavaScript数据类型的特殊性(3)
+关注继续查看

建议4:注意JavaScript数据类型的特殊性(3)
其中,object表示对象的通用类型,class表示对象的内部类型,内部类型的名称与该对象的构造函数名对应。例如,Array对象的class为“Array”,Function对象的class为“Function”,Date对象的class为“Date”,内部Math对象的class为“Math”,所有Error对象(包括各种Error子类的实例)的class为“Error”。
客户端JavaScript的对象和由JavaScript实现定义的其他所有对象都具有预定义的特定class值,如“Window”、“Document”和“Form”等。用户自定义对象的class值为“Object”。
class值提供的信息与对象的constructor属性值相似,但是class值是以字符串的形式提供这些信息的,而不是以构造函数的形式提供这些信息的,所以在特定的环境中是非常有用的。如果使用typeof运算符来检测,则所有对象的class值都为“Object”或“Function”,所以此时的class值不能够提供有效信息。
但是,要获取对象的class值的唯一方法是必须调用Object对象定义的默认toString()方法,因为不同对象都会预定义自己的toString()方法,所以不能直接调用对象的toString()方法。例如,下面对象的toString()方法返回的就是当前UTC时间字符串,而不是字符串“[object Date]”。

  1. var d = new Date();
  2. alert(d.toString()); //当前UTC时间字符串
    要调用Object对象定义的默认toString()方法,可以先调用Object.prototype.toString对象的默认toString()函数,再调用该函数的apply()方法在想要检测的对象上执行。结合上面的对象d,具体实现代码如下:
  3. var d = new Date();
  4. var m = Object.prototype.toString;
  5. alert(m.apply(d)); //" [object Date] "
    下面是一个比较完整的数据类型安全检测方法。
  6. // 安全检测JavaScript基本数据类型和内置对象
  7. // 参数:o表示检测的值
  8. /* 返回值:返回字符串"undefined"、"number"、"boolean"、
    "string"、"function"、"regexp"、"array"、"date"、"error"、"object"或"null" */
  9. function typeOf(o){
  10. var _toString = Object.prototype.toString;
  11. // 获取对象的toString()方法引用
  12. // 列举基本数据类型和内置对象类型,可以进一步补充该数组的检测数据类型范围
  13. var _type ={
  14. "undefined" : "undefined",
  15. "number" : "number",
  16. "boolean" : "boolean",
  17. "string" : "string",
  18. "[object Function]" : "function",
  19. "[object RegExp]" : "regexp",
  20. "[object Array]" : "array",
  21. "[object Date]" : "date",
  22. "[object Error]" : "error"
  23. }
  24. return _type[typeof o] || _type[_toString.call(o)] || (o ? "object" : "null");
  25. }
    应用示例:
  26. var a = Math.abs;
  27. alert(typeOf(a)); //"function"
    上述方法适用于JavaScript基本数据类型和内置对象,而对于自定义对象是无效的。这是因为自定义对象被转换为字符串后,返回的值是没有规律的,并且不同浏览器的返回值也是不同的。因此,要检测非内置对象,只能够使用constructor属性和instaceof运算符来实现。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
javascript挑战编程技能-第四题:谈个if讲点逻辑
javascript挑战编程技能-第四题:谈个if讲点逻辑
14 0
javascript挑战编程技能-第六题:检查密码强度
javascript挑战编程技能-第六题:检查密码强度
36 0
javascript挑战编程技能-第八题:99乘法表
javascript挑战编程技能-第八题:99乘法表
22 0
javascript挑战编程技能-第九题:数据结构
javascript挑战编程技能-第九题:数据结构
10 0
剑指Offer——II. 青蛙跳台阶问题(JS实现)
剑指Offer——II. 青蛙跳台阶问题(JS实现)
90 0
剑指Offer——数字序列中某一位的数字(JS实现)
剑指Offer——数字序列中某一位的数字(JS实现)
79 0
剑指Offer——二维数组中的查找(JS实现)
剑指Offer——二维数组中的查找(JS实现)
76 0
剑指Offer——正则表达式匹配(JS实现)
剑指Offer——正则表达式匹配(JS实现)
65 0
剑指Offer——I. 斐波那契数列(JS实现)
剑指Offer——I. 斐波那契数列(JS实现)
71 0
剑指Offer——顺时针打印矩阵(JS实现)
剑指Offer——顺时针打印矩阵(JS实现)
189 0
+关注
zhanginzaghi
IT菜鸟
90
文章
25
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载