一种判断Javascript变量类型的方法

一种判断Javascript变量类型的方法
在Javascript中,有5种基本的数据类型和1种复杂的数据类型,基本数据类型:定义、空、布尔值、数字和字符串;复杂数据类型是对象,对象也分很多具体的类型,如:数组、函数日期等。今天我们要讨论用什么方法来确定一个变量的类型。

在解释各种方法之前,我们首先定义几个测试变量,看看下面的方法是如何分析变量类型的。下面的变量包含了我们实际编码中常用的几乎所有类型。
var = 123;
var str = 'abcdef;
var bool =真;
var arr = { 1, 2, 3,4 };
var json = {姓名:'wenzi,年龄:25 };
VAR函数=函数(){ console.log(这是功能');}
var =未定义;
无功空=空;
日期=新日期();
VaR reg = / ^ { } { } a-za-z 5美元/;
var错误=新错误();
1。使用类型的检测

最常见的事,我们通常使用的是使用类型检测的变量类型。这一次,我们还使用typeof检测变量的类型:
Console.log(
Typeof num,
Typeof STR,
Typeof bool,
Typeof arr,
类型的JSON,
类型的函数,
Typeof und,
Typeof nul,
Typeof date,
Typeof reg,
类型错误
);
数串布尔objectobject函数定义和类对象
从输出,ARR,JSON,NUL,日期,注册的结果,和错误都是检测的对象类型,和其他变量可以正确地检测到。类型时可以使用的变量数,字符串,布尔值,函数,定义,和JSON。其他变量没有被评为型,包括空。

另外,类不能区分阵列和JSON类型之间的类型。当使用数组的类型和JSON输出对象。

2。使用实例检测

在Javascript中,判断一个变量的类型将尝试使用typeof运算符。使用typeof运算符时,会有与引用类型存储值的问题。不管是什么类型的对象引用,它将返回到了另一个object.ecmascript java操作,实例,来解决这个问题。instanceof运算符类似typeof运算符和用于识别处理的对象的类型。不同类型的方法,这是方法需要开发商明确这个对象是一个特定的类型,例如:

功能人(){

}
Var Tom =新人();
console.log(Tom instanceof人); / /真的

让我们来看看下面的例子。
功能人(){

}
函数学生(){

}
student.prototype =新的人();
新学生();
console.log(John instanceof的学生); / /真的
console.log(约翰instancdof人); / /真的

实例也可以检测多重继承的关系。

好吧,让我们用实例来检测上述变量:
Console.log(
Num实例数,
STR是字符串,
布尔是布尔,
数组是数组,
JSON是对象,
函数是函数,
和实例对象,
空实例对象,
Date instanceof Date,
Reg instanceof RegExp,
错误是错误

编号:/ false
STR
布尔: / /假
ARR: / /真的
JSON
函数/真的
和/ false
字符: / /假
日期: /真
注册表项:
错误: /真
从上面的运行结果,我们可以看到,民,发现他的型STR和bool没有,但我们创造了民的方式如下:我们可以检测类型。
新数字(123);
var str =新的字符串('abcdef);
var =新布尔(true);
同时,我们也要看到,和空是真实的,是由对象类型检测,因为没有这样的全球型的定义和空的JS。他们和空属于对象类型,所以他们出口的真实。

三.使用构造函数的检测

当使用instanceof检测变量的类型,我们没有发现数的类型,字符、布尔。因此,我们需要改变的方式来解决这个问题。

构造函数最初是原型对象上的一个属性,指向构造函数,但是我们可以根据实例对象找到属性的顺序。如果实例对象上没有实例属性或方法,我们将在原型链中查找它。因此,实例对象也可以使用构造函数属性。

让我们用num.constructor内容开始,这是一个数字类型的变量构造函数看起来像:

函数编号(){本地代码}

我们可以看到,它指向的构造函数,所以我们可以利用num.constructor = =数确定num是数字类型,和其他变量也类似。
功能人(){

}
Var Tom =新人();

未定义的空构造函数属性
Console.log(
汤姆,构造函数=人,
num.constructor = =数,
str.constructor = =字符串,
构造函数= =布尔布尔,
arr.constructor = =阵列,
JSON =构造函数= =对象,
构造函数=函数,
日期=构造函数=日期,
构造函数= = regexp注册,
错误=构造函数=错误
);
所有结果都是真的。
从输出结果中,我们可以看到,除了未定义的和空的,其他类型的变量都可以使用构造函数来确定类型。

但是,构造函数的使用并不安全,因为可以修改构造函数属性并导致不正确的结果,例如:
功能人(){

}
功能学生(){

}
student.prototype =新的人();
新学生();
console.log(约翰。构造函数= =学生); / /假
console.log(约翰。构造函数= =人); / /真的
在上面的示例中,学生原型中的构造函数被修改为指向人,导致真正的构造函数不检测实例对象约翰。

同时,利用instaceof和construcor,判定数组必须在当前页的声明!例如,一个网页(父页面)有框架,框架是页面(页面),在子页面的一个数组的声明,并将其分配到父页面的变量,确定变量、数组= = object.constructor;return false;原因

1、数组是一种引用类型的数据,在传递过程中,只传送引用的地址

2、每个页面的本地数组对象引用的地址不一样,在子页面语句数组中,对应的构造函数是子页面数组对象;父页面判断,数组的使用不等于子页面数组;记住,否则很难跟踪问题!

4。使用object.prototype.tostring.call

让我们先看看他如何检测变量的类型,而不管它是什么。
Console.log(
object.prototype.tostring.call(NUM),
object.prototype.tostring.call(STR),
object.prototype.tostring.call(布尔),
object.prototype.tostring.call(ARR),
object.prototype.tostring.call(JSON),
object.prototype.tostring.call(功能),
object.prototype.tostring.call(UND),
object.prototype.tostring.call(NUL),
object.prototype.tostring.call(日期),
object.prototype.tostring.call(REG),
object.prototype.tostring.call(错误)
);
{对象编号}对象字符串}对象布尔} 对象数组}{对象对象}
{ }{目标函数对象定义} {零}对象/{ }{对象对象日期表达式}{ }的对象错误
从object.prototype.tostring.call输出(变量),输出的是一个字符串,字符串数组,第一个参数是对象类型,第二个参数是变量,所有变量的类型进行检测,我们只需要删除的第二个参数。或者你可以用object.prototype.tostring.call(ARR)= = 对象数组检测变量arr不是数组。

现在让我们看看如何object.prototype.tostring.call ECMA定义。

复制代码代码如下所示:

object.prototype.tostring()当toString方法,采取以下步骤

1。获取此对象的{ } }属性。

2。通过连接三弦{对象计算一个字符串值,结果(1),和}。

三.返回结果(2)
上述规范定义了object.prototype.tostring行为:第一,内部属性{ } } {类对象,然后在该属性的基础上返回的字符串数组{ }相似的对象作为一个结果(阅读ECMA标准应该都知道,{ { } }来表示语言,不能直接访问外部属性,称为内部属性)。用这种方法,用电话,我们可以得到任何对象的内部属性{ {类} },然后变换式检测的字符串来实现我们的目标的比较。

5中$类型的实现。jQuery

在jQuery中,提供了一个$类型的接口,让我们检测变量的类型:
Console.log(
$类型(数字),
$类型(STR),
美元。类型(布尔),
式(ARR)美元,
$类型(JSON),
$类型(函数),
$类型(和),
式(NUL)美元,
$类型(日期),
$类型(注册表),
$类型(错误)
);
数串布尔数组目标函数/未定义的无效日期正则表达式错误
当你看到输出时,你有一种熟悉的感觉吗是的,他是第二个参数,使用的object.prototype.tostring.call结果(输出变量)。

在这里,我们首先检测比较所有这些结果,水平检测方法,每个变量是垂直的:
类型的判断
类型
实例
构造函数
tostring.call
美元。型
号码


真正的
{对象号}

STR
字符串

真正的
{对象字符串}
字符串
布尔
布尔

真正的
{对象布尔}
布尔
ARR
对象
真正的
真正的
{对象数组}
阵列
JSON
对象
真正的
真正的
{对象对象}
对象
功能
功能
真正的
真正的
{对象函数}
功能

未定义


{对象未定义}
未定义

对象


{对象null }
无效的
日期
对象
真正的
真正的
{对象日期}
日期
规则
对象
真正的
真正的
{对象表达式}
正则表达式
误差
对象
真正的
真正的
{对象错误}
误差
优势
使用方便,直接输出结果。
可以检测复杂类型
基本上,所有类型都可以被检测到。
检测所有类型

缺点
检测到的类型太少。
基本类型是没有检测不能越过iframe
不能跨iframe,施工容易修改
在IE6,定义,空对象

相反,你可以看到各种方法之间的差异,结果的object.prototype.tostring.call元式输出是非常相似的。让我们看看如何jQuery(2.1.2版)实现了美元。类型的方法。
对象可以直接使用原型链方法。
无功class2type = { };
VaR方法= class2type.tostring;

省略代码的一部分…

类型:功能(obj){
如果(obj = = null){
+ 返回对象;
}
< 4 / / Android,iOS支持:<6(functionish regexp)
返回(typeof obj =对象类型| | obj =函数)
(class2type { tostring.call(obj)} | |对象):
Typeof obj;
},

省略代码的一部分…

的class2type地图 / /填充
jquery.each(布尔数字符串函数数组日期RegExp对象错误。分裂()。
class2type {{对象+姓名+}} = name.tolowercase();
});
让我们先看看这部分jquery.each:
的class2type地图 / /填充
jquery.each(布尔数字符串函数数组日期RegExp对象错误。分裂()。
class2type {{对象+姓名+}} = name.tolowercase();
});

/ /周期,价值` class2type `是:
class2type = { {
{ }:'boolean对象布尔,
{ }:若干的对象编号,
{ }'String'对象的字符串,
{ }:'function的目标函数,
{ }:'array的对象数组,
{ }:'date对象的日期,
{ }:'regexp的正则表达式对象,
{ }:'object对象,
{ }:错误的对象错误
}
再次查看类型方法。
类型的实现
类型:功能(obj){
如果输入的是null或未定义的,则字符串直接返回对象。
如果传入的对象obj /未定义,返回未定义
如果(obj = = null){
+ 返回对象;
}
< 4 / / Android,iOS支持:<6(functionish regexp)
/ /低版本的正则表达式的返回类型函数;版本已修改,返回类型对象
If the use of the detection of typeof / obj type is object or function, it returns the value of class2type type, otherwise it returns typeof detection
返回(typeof obj =对象类型| | obj =函数)
(class2type { tostring.call(obj)} | |对象):
Typeof obj;
}
当类对象=对象类型| | obj = 功能来这里,我们应该明白为什么object.prototype.tostring.call美元。型是这样的。事实上,jQuery实现的object.prototype.tostring.call,转向{ }into'boolean布尔型对象并返回它。如果class2type不存储该变量的类型,然后返回对象。

除了对象和函数类型,其他类型的检测使用typeof,数字,字符串,布尔型变量,使用类型。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部