获取对象具体类型的功能函数

HTML5学堂:JavaScript当中,时常会使用到typeof来进行数据类型的检测,但是我们觉得typeof不能够满足我们的需求,对于数组、函数、时间对象等,使用typeof返回的都是“object”,如果我们希望更进一步的检测要怎么办呢?一起来看吧~

toString方法

在JavaScript当中,想要判断一个对象值属于哪种内置对象,最靠谱的方法就是使用toString

先上代码

var str = 'HTML5学堂';
var arr = ['独行冰海', '梦幻雪冰'];
var obj = {editor : '其其'};
var judge = true;
console.log(Object.prototype.toString.call(str));
console.log(Object.prototype.toString.call(arr));
console.log(Object.prototype.toString.call(obj));
console.log(Object.prototype.toString.call(judge));

打印结果

为何要用call方法?为何返回的是[object xxxx],别急,听我慢慢道来~

关于toString

ECMAScript5.0当中,对toString的原理是如此描述的

1 如果传入的对象值为undefined,则返回[object Undefined]

2 如果传入的对象值为null,则返回[object Null]

3 针对传入的对象执行ECMAScript引擎中的方法ToObject。将原始值类型转换成包装类型。

4 获取传入对象的[[Class]]属性值

5 计算出"[object 传入对象的[[Class]]属性值]"

6 返回这个计算结果

[[Class]]是个神马玩意

[[Class]]是一个内部属性,所有的对象都拥有这个属性,它是一个字符串值,表明该对象的类型。

[[Class]]属性在ECMAScript6.0当中,被内部属性[[NativeBrand]]取而代之,该属性的值对应一个标志值,可以用来区分原生对象的类型。

[[NativeBrand]]返回的内容和[[Class]]并不相同。那么我们是不是不能使用toString了呢?

不要紧,虽然[[NativeBrand]]这个内部属性与[[Class]]规则不完全一样,但是toString方法也进行了相应的修改与调整,返回的也依旧是利利下面提到的这几个返回值。

toString的返回值有哪几种

Null; Undefined; String; Number; Boolean; Object

Arguments; Array; Date; Error; Function; JSON; Math; RegExp

简单的总结一下

通过Object.prototype.toString方法能够实现类型的检测

这种方法在调用的时候,首先会将要处理的对象转换为包装类型(而不是值类型) —— 这个操作是内部进行的

之后,再内部调用,找到当前对象的[[Class]]值

返回[object 具体类型];

使用call的主要原因?——当然是改变this的指向了,Object.prototype.toString()当中toString方法是Object的,不是当前要调用的对象的,我们希望针对相应对象调用toString方法,自然要改变this指向了~

利用toString封装的功能函数

呵呵呵,实现类型检测功能,这才是我琢磨toString的目的~!!!

<script>
    function checkType(ele) {
        return Object.prototype.toString.call(ele).replace(/[\[\]]/g, '').split(' ')[1].toLowerCase();
    }
    var arr = ['HTML5学堂', '利利-独行冰海', '堡堡-梦幻雪冰', '其其'];
    console.log(checkType(arr));
</script>

本测试返回的结果是"array"~~~吼吼吼,这样,一个检测对象类型的功能函数就封装完毕啦。

HTML5小编-利利&其其 耗时2.5h

本文中的toString方法参考了网络上的相关资料——《紫云飞的博客园》,感谢博主的付出~

原文发布于微信公众号 - HTML5学堂(h5course-com)

原文发表时间:2016-04-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

Effective Java通俗理解(上)

  这篇博客是Java经典书籍《Effective Java(第二版)》的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗...

2177
来自专栏代码世界

装饰器进阶

装饰带参数函数 def foo(func): # 接收的参数是一个函数名 def bar(x, y): # 这里需要定义和被装饰函数相同的参数 ...

33310
来自专栏java达人

Java中只有按值传递,没有按引用传递!

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“...

1909
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础19(01)总结IO流,异常try…catch,throws,File类

1:异常(理解) (1)程序出现的不正常的情况。 (2)异常的体系 Throwable |--Error 严重问题,我们不处理。 |--Excepti...

3507
来自专栏一个会写诗的程序员的博客

Kotlin 简单优雅的高阶函数Kotlin 简单优雅的高阶函数《Kotlin极简教程》正式上架:1 . Kotlin 函数式编程: 函数的组合。一切皆是函数。2. 简单好用的 Kotlin 类型别名

函数代表一种关系 f 的蕴涵逻辑流。这种蕴涵逻辑流,其实就是映射(Mapping)。

763
来自专栏blackheart的专栏

[C#2] 2-匿名方法

1.匿名方法应用和机制 先看一段代码(C#1.0): 1 //这里加了参数<为了说明delegate关键字后面的参数列表> 2 public delegat...

1946
来自专栏java学习

重要通知!小编出新的Java练习题已经公布答案了!!!

一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是(D)。 A. import classpackage ...

3398
来自专栏我是攻城师

使用JAVA反射的利与弊

3664
来自专栏机器学习入门

POJ 刷题系列:1573. Robot Motion

题意: 一张地图包含N,S,W,E的指令,从指定起点[1, p]出发,是否有一条路径能够走到地图边缘,有则输出路径数,无说明走入了死循环,输出走入循环前和循环...

19110
来自专栏老马说编程

(35) 泛型 (上) - 基本概念和原理 / 计算机程序的思维逻辑

之前章节中我们多次提到过泛型这个概念,从本节开始,我们就来详细讨论Java中的泛型,虽然泛型的基本思维和概念是比较简单的,但它有一些非常令人费解的语法、细节、以...

1808

扫描关注云+社区