javascript typeof 操作符

typeof 操作符
typeof 操作符(和 instanceof 一起)或许是 JavaScript 中最大的设计缺陷,
因为几乎不可能从它们那里得到想要的结果。
尽管 instanceof 还有一些极少数的应用场景,typeof 只有一个实际的应用(译者注:这个实际应用是用来检测一个对象是否已经定义或者是否已经赋值),
而这个应用却不是用来检查对象的类型。
    注意: 由于 typeof 也可以像函数的语法被调用,比如 typeof(obj),但这并是一个函数调用。
    那两个小括号只是用来计算一个表达式的值,这个返回值会作为 typeof 操作符的一个操作数。
    实际上不存在名为 typeof 的函数。
JavaScript 类型表格
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 操作符的运算结果。可以看到,这个值在大多数情况下都返回 "object"。
Class 一列表示对象的内部属性 [[Class]] 的值。
    JavaScript 标准文档中定义: [[Class]] 的值只可能是下面字符串中的一个:
    Arguments, Array, Boolean, Date, Error,
    Function, JSON, Math, Number, Object, RegExp, String.
为了获取对象的 [[Class]],我们需要使用定义在 Object.prototype 上的方法 toString。
对象的类定义
JavaScript 标准文档只给出了一种获取 [[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]]值的对象。
Object.prototype.toString 返回一种标准格式字符串,所以上例可以通过 slice截取指定位置的字符串,如下所示:
Object.prototype.toString.call([])  // "[object Array]"
Object.prototype.toString.call({})  // "[object Object]"
Object.prototype.toString.call(2)   // "[object Number]"
    ES5 提示: 在 ECMAScript 5 中,为了方便,对 null 和 undefined 调用Object.prototype.toString 方法,
    其返回值由 Object 变成了 Null 和 Undefined。
译者注:这种变化可以从 IE8 和 Firefox 4 中看出区别,如下所示:
// IE8
Object.prototype.toString.call(null)    // "[object Object]"
Object.prototype.toString.call(undefined)   // "[object Object]"
// Firefox 4
Object.prototype.toString.call(null)    // "[object Null]"
Object.prototype.toString.call(undefined)   // "[object Undefined]"
测试为定义变量
typeof foo !== 'undefined'
上面代码会检测 foo 是否已经定义;如果没有定义而直接使用会导致 ReferenceError 的异常。
这是 typeof 唯一有用的地方。
结论
为了检测一个对象的类型,强烈推荐使用 Object.prototype.toString 方法;
因为这是唯一一个可依赖的方式。正如上面表格所示,typeof 的一些返回值在标准文档中并未定义,
因此不同的引擎实现可能不同。
除非为了检测一个变量是否已经定义,我们应尽量避免使用 typeof 操作符。

时间: 2024-10-29 18:47:41

javascript typeof 操作符的相关文章

javascript中typeof操作符和constucor属性检测

这篇文章主要介绍了javascript中typeof操作符和constucor属性检测的相关资料,需要的朋友可以参考下 *#type.js 代码如下: function Person(name, age) { this.name = name; this.age = age; } var d = {an: 'object'}; var a = ['apple', 'banana']; var f = function() {}; var s = 'David'; var n = 33; var

JavaScript中的typeof操作符用法实例

 在Web前端开发中,我们经常需要判断变量的数据类型.鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型--typeof就是负责提供这方便信息的操作符. 对一个值使用typeof操作符可能返回下列某个字符串: "undefined"--如果这个值未定义 "boolean"--如果这个值是布尔值 "string"--如果这个值是字符串 "number"--如果这个值是数值 "object&

javascript实例教程:typeof操作符

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型--typeof就是负责提供这方便信息的操作符.对一个值使用typeof操作符可能返回下列某个字符串: "undefined"--如果这个值未定义 "boolean"--如果这个值是布尔值 "string"--如果这个值是字符串 "number"--如果这个值是数值 "object"--如果这个是对象或null "fu

《JavaScript启示录》——1.16 typeof操作符

1.16 typeof操作符 typeof操作符用于返回正在使用值的类型.但它返回的值并不一致,或者说,逻辑上不一致.下面的代码展示了使用typeof操作符所返回的值. <!DOCTYPE html><html lang="en"><body><script> // 原始值 var myNull = null; var myUndefined = undefined; var primitiveString1 = "string

javascript中typeof操作符和constucor属性检测_javascript技巧

*#type.js 复制代码 代码如下: function Person(name, age) {  this.name = name;  this.age = age; } var d = {an: 'object'}; var a = ['apple', 'banana']; var f = function() {}; var s = 'David'; var n = 33; var b = true; var o = new Object(); var person = new Pers

JavaScript instanceof 操作符

JavaScript instanceof 操作符 instanceof 操作符用来比较两个操作数的构造函数.只有在比较自定义的对象时才有意义. 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大. 比较自定义对象 function Foo() {} function Bar() {} Bar.prototype = new Foo(); new Bar() instanceof Bar; // true new Bar() instanceof Foo; // true // 如

C#的typeof操作符

typeof操作符用于获得系统原型对象的类型 例如: 程序清单7-9: using System; class Test { static void Main(){ Console.WriteLine(typeof(int)); Console.WriteLine(typeof(System.Int32)); Console.WriteLine(typeof(string)); Console.WriteLine(typeof(double[])); }; } 产生如下输出. Int32 Int

typeof操作符

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型--typeof就是负责提供这方便信息的操作符.对一个值使用typeof操作符可能返回下列某个字符串: "undefined"--如果这个值未定义 "boolean"--如果这个值是布尔值 "string"--如果这个值是字符串 "number"--如果这个值是数值 "object"--如果这个是对象或null "fu

从头开始学JavaScript (四)——操作符

原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: 1 <script type="text/javascript"> 2 var a, b,i= 1,j=1; 3 a=i++; 4 b=++j; 5 alert("a="+a+",i="+i+",b="+b+",j="+j);