typeof函数的用法可能不用我多说,大家都知道怎么用。而constructor属性大家可能就陌生点。在《精通JavaScript》这本书中有提到construct的用法,但我用自己的几个浏览器(IE7.0 / Firefox1.9 / Opera9.50)测试的结果却和书上说的不一样。但是仍然是有办法通过constructor属性来检查变量类型的。
这里先补充一下,为什么明明有typeof函数可以很方便地用来检测类型,还要用constructor呢?
因为typeof会把所有的数组类型以及用户自定义类型判断为object,从而无法知道更确切的信息。而constructor却可以解决这个问题。
ok,明白了我们为什么要用constructor,现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧~
首先我们运行一下下面这段代码: var i;
alert(typeof(i));
alert(i.constructor);
这3行代码告诉你什么情况下可以用constructor。
你可以看到第2行返回了字符串'undefined',而第三行则发生了错误,原因是i变量还没有类型定义,自然也没有constructor的存在。
从这一点上看,typeof可以检查到变量是否有定义,而construct只能检查已定义变量的类型。 网管u家bitscn.net
再运行一下下面这段代码: var i = 2;
alert(typeof(i));
alert(i.constructor);
你会看到第2行返回了字符串'number’,第3行返回了一串类似函数定义的代码字符串(这就是跟《精通JavaScript》一书中介绍的不一样的地方)。
我们再用typeof检查一下constructor到底是个什么样类型的属性,第4行返回结果'function',也就是说,实际上constructor是一个函数,更确切地说是一个构造函数。这时你就可以知道,为什么constructor可以检查出各种类型了。
有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种,这里提供一种比较容易理解的方法。
其实想法很简单,就是把construcor转化为字符串,通过寻找匹配字符串(function名)来确定是否指定类型。如下例子: function user() {};
var i = new user();
alert((i.constructor+'').match(/user/) == null);
这仅仅是个简单的例子。如果返回true则变量i不是user类型,返回false则变量是user类型。 当然,这样检测是不够精确的,比如其实他是一个myuser类型的时候,同样会被认为是user类。所以你需要书写更精确的正则表达式去进行匹配。
可以这样简单改进你的正则表达式: /function user\(\)/
替换上面代码段中的/user/。当然,如果你的构造函数原型是user(a),那么应该这样书写你的正则表达式: /function user\(a\)/
到这里你应该知道怎样使用constructor类型去检查变量类型了吧?
ok,最后再提个醒,如果你要用基于constructor的方法去检查一些基本类型,如 Object / Array / Function / String / Number / Boolean
在你的正则表达式中,一定要将这些单词的首字母大写!!而如果该类型是自定义类型,则根据你定义的时候标识符的写法确定。
分享到:
相关推荐
Constructor 属性可以帮助我们解决 typeof 函数无法解决的问题,即无法确定变量的具体类型。typeof 函数只能告诉我们变量是对象、数组或函数,但是无法告诉我们变量的具体类型,这时 constructor 属性就可以发挥作用...
当一个子类继承自父类时,子类实例的`constructor`属性默认会指向父类的构造函数,除非显式地将其重新设置为子类的构造函数。因此,对于复杂的继承结构,直接使用`constructor`进行类型判断可能不够可靠。 ### 4. `...
可以直接使用VS打开直接运行,查看效果 1、typeof - 返回值有六种可能:"number," "string," "boolean," "object," "function," 和 ...2、所以,typeof函数不仅可以判断某一个变量的类型,还是可以判断一个变量是否存在
2.5.5 Unicode 字符转意字符序列... 51 3. 基本概念... 53 3.1 声明 53 3.2 成员 55 3.2.1 名称空间成员... 55 3.2.2 结构成员... 55 3.2.3 枚举成员... 55 3.2.4 类成员... 56 3.2.5 接口成员... 56 3.2.6 数组成员...
### JavaScript中的函数声明与函数表达式 在JavaScript中,函数是一种非常重要的编程构造,它可以被定义为函数声明或函数表达式。这两种定义方式各有特点,并且在不同的上下文中有着不同的行为。 #### 函数声明...
在JavaScript中,`typeof`和`instanceof`是两种常用的类型检查操作符,它们各自有着不同的用法和特点。理解这两者之间的差异对于编写健壮的JavaScript代码至关重要。 `typeof`操作符主要用于检测变量的数据类型。它...
当我们使用`typeof`操作符检查`Object`时,返回的结果是`"function"`,这是因为`Object`是一个构造函数。类似的,像`Array`这样的其他内置类型也是构造函数。 6. **学习资源** 深入理解JavaScript的构造函数和...
### JavaScript中的`typeof`运算符详解 #### 一、引言 在JavaScript中,了解变量的类型对于编写高质量代码至关重要。`typeof`运算符作为基本工具之一,可以帮助开发者快速识别变量的数据类型。本文将深入探讨`...
在JavaScript中,typeof操作符和constructor属性是两种检测数据类型的方法。它们各自有不同的使用场景和特点。下面详细介绍这两者的知识内容。 首先,typeof操作符用于检测变量的数据类型。它对不同类型的变量会...
5.typeof和数据类型转换.md
JS 中 typeof 与 instanceof 的区别 在 JavaScript 中,typeof 和 instanceof 是两个常用的运算符,用来判断一个变量是否为空,或者是什么类型的。但是,这两个运算符之间还是有区别的。 typeof 运算符是一个一元...
使用方法如下:object instanceof constructor,object 为实例对象,constructor 为构造函数。 例如: let Car = function() {} let benz = new Car() benz instanceof Car // true let car = new String('xxx') ...
在JavaScript中,数组是一种特殊的对象,但它们与传统的对象有着明显的区别。数组是用于存储一系列有序数据的数据结构,而对象则是用于存储键值对的数据结构。尽管数组在内部表示上与对象共享一些特性,但在遍历和...
2. **检查`constructor`属性**:每个对象都有一个`constructor`属性,指向创建它的构造函数。例如,`obj.constructor === Array`可以判断`obj`是否来自Array构造函数。但这种方法依赖于对象未被篡改其`constructor`...
10. **窗口和控件操作**:PB中的`SetProperty()`, `GetProperty()`, `Show()`, `Hide()`, `Refresh()`等函数允许开发者动态控制窗口和控件的属性和状态。 这个"pb常用函数手册.chm"文件作为PB开发者的必备参考,...
它的语法格式为:`typeof (表达式)`,其中`表达式`可以是变量、函数调用、数组索引、指针操作等。 typeof 运算符的用法 typeof 运算符的用法非常灵活,可以用来获取变量或表达式的数据类型。例如: ```c int x = 3...
在JavaScript编程中,有时会遇到需要根据函数名的字符串形式来动态执行对应函数的场景。这类技术能够提供一种灵活的方式来执行代码,尤其在进行插件化开发、事件驱动编程或实现钩子函数时非常有用。为了实现这一功能...
然而,由于其局限性,有时还需要结合其他检查方法,如`instanceof`或`constructor`属性,以获取更精确的类型信息。在实际编程中,了解这些细节可以帮助我们避免类型相关的错误,提高代码的可读性和可维护性。
当应用于函数时,`typeof`会返回`"function"`,这对于检测某个值是否为函数非常有用。例如: ```javascript typeof alert; // "function" ``` 对于对象,`typeof`的行为有些特殊。如果对象是数组或者日期等特殊...
PB9.0常用函数中文帮助文档 Dec() 功能将字符串或Blob值转换成Decimal类型的值。 语法Dec ( stringorblob ) 参数stringorblob:string类型变量或Blob类型变量。Blob类型变量时,把该变量第一个值转换为Decimal类型的...