资讯专栏INFORMATION COLUMN

细说 Javascript 类型篇(二) : typeof 操作符

PAMPANG / 1226人阅读

摘要:操作符还有可能是设计中最大缺陷,因为它几乎是完全破损的。由于用法与调用函数的语法相似,因此常被误以为是函数调用,实际上并不存在名为的函数,只是一个操作符而已。而列则表示对象内部的属性。属性文档中明确地给出了获得属性的途径,就是使用。

typeof 操作符(还有 instanceof)可能是 Javascript 设计中最大缺陷,因为它几乎是完全破损的。由于 typeof 用法与调用函数的语法相似,因此常被误以为是函数调用,实际上并不存在名为 typeof 的函数,typeof 只是一个操作符而已。
尽管 instanceof 仍然还有少数的应用场景,typeof 则只有一个实际的用途,但这个用途不能用来检测对象的类型。

类型表格
Value               Class      Type
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object (function in Nitro/V8)
new RegExp("meow")  RegExp     object (function in Nitro/V8)
{}                  Object     object
new Object()        Object     object

在上述表格中,Type 列表示 typeof 操作符的结果。而 Class 列则表示对象内部的 [[Class]] 属性。
为了获得 [[Class]] 属性,我们需要使用 Object.prototypetoString 方法。

Class 属性

文档中明确地给出了获得 [[Class]] 属性的途径,就是使用 Object.prototype.toString

function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is("String", "test"); // true
is("String", new String("test")); // true

上例中,Object.prototype.toString 被调用,this 被设置指向需要获取其 [[Class]] 属性值的对象。

  

文档定义: [[Class]] 属性的值只可能是下列字符串: Arguments, Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String
nullundefined 调用 Object.prototype.toString 方法时, 其返回值将由 Object 变成了 NullUndefined

测试变量是否定义
typeof foo !== "undefined"

上述语句将会测试变量 foo 已定义与否,如果未定义而引用 foo 将会抛出 ReferenceError 错误,这实际上是 typeof 用处最大的地方。

总结

为了检测一个对象的类型,最可靠的方法就是使用 Object.prototype.toString,正如第一个表格上的内容,typeof 操作符并不能返回确切的对象类型,但是我们可以使用 typeof 操作符经常会被用来判断变量是否定义。
其实 typeof 操作符还可以被用来测试变量是否为函数,@humphry 前辈的回答进一步丰富了 typeof 的用途:

  

《如何正确判断js数据类型》

参考

http://bonsaiden.github.io/JavaScript-Garden/#types.typeof

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

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

相关文章

  • 细说 Javascript 类型(三) : instanceof 作符

    摘要:的操作符可以用来比较两个操作数的构造函数。这是因为它们的构造函数不可能会是同一个对象。总结综上所述,我们知道操作符最合适的使用坏境是比较两个相同上下文背景下的自定义对象的构造函数,正如上篇介绍的操作符,其他坏境下使用作用不大。 Javascript 的 instanceof 操作符可以用来比较两个操作数的构造函数 constructor。但这个只有在比较自定义对象才有意义。当用来比较 ...

    tylin 评论0 收藏0
  • 细说 Javascript 对象) : 原型对象

    摘要:并没有类继承模型,而是使用原型对象进行原型式继承。我们举例说明原型链查找机制当访问一个对象的属性时,会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。原始类型有以下五种型。此外,试图查找一个不存在属性时将会遍历整个原型链。 Javascript 并没有类继承模型,而是使用原型对象 prototype 进行原型式继承。 尽管人们经常将此看做是 Javascript 的一个缺点,然...

    lansheng228 评论0 收藏0
  • 细说 Javascript 数组) : 数组的构造函数和常见操作

    摘要:数组的构造函数由于数组的构造函数在处理参数时的不确定性,因此强烈建议使用符号来创建一个新数组。总结综上所述,我们应该尽量使用来创建新函数,而不是数组的构造函数,这样代码将有更好的可读性。 数组的构造函数 由于数组的构造函数在处理参数时的不确定性,因此强烈建议使用 [] 符号来创建一个新数组。 [1, 2, 3]; // Result: [1, 2, 3] new Array(1, ...

    kaka 评论0 收藏0
  • 听飞狐聊JavaScript设计模式系列01

    摘要:前言大家好,小弟飞狐,爱学习,爱装逼,乐于分享,初来乍到,请多多关照。特别注意一下,函数在中是对象,不是一种数据类型,这可是世界的一等公民。和,和的关系又很暧昧,后面细说,要不然会晕菜。基本数据类型,,,,,这五种基本数据类型是按值访问的。 前言 大家好,小弟飞狐,爱学习,爱装逼,乐于分享,初来乍到,请多多关照(~ o ~)~zZ。出道几年,对JavaScript情有独钟,聊技术之前,...

    CHENGKANG 评论0 收藏0
  • 细说 Javascript 类型(四) : 类型转换

    摘要:因为是弱类型语言,所以它会在任何可能的情形下对变量进行强制类型转换。内置类型的构造函数调用内置类型的构造函数时,是否使用关键字将表现得大不相同。传递字面值或非对象值也会造成强制类型转换的现象。最好的方法就是显示地将值转换为,或三种类型之一。 因为 Javascript 是弱类型语言,所以它会在任何可能的情形下对变量进行强制类型转换。 // These are true new Num...

    chengtao1633 评论0 收藏0

发表评论

0条评论

PAMPANG

|高级讲师

TA的文章

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