JavaScript检测类型的方法:typeof,instanceof运算符,对象的constructor属性,跨原型链调用toString()方法。
1.typeof方法
可判断“string”,“number”,“object”,“function”,“boolean”,“undefined”(可用于判断变量是否存在),可是其能力有限的,对于于数组,日期,正则类型只能返回object。
2.instanceof运算符
其要求左边的左边的运算数是一个对象,右边的运算数是是对象类的名字或是构造函数 。如果左边对象是其对象类或是构造函数的实例,则返回true,若不是,则返回false。
[
]
instanceof
Array
;
// true
new
date
instanceof
Date
;
//true
[
]
instanceof
RegExp
;
//false
3.对象的constructor属性
每一个对象都有一个construtor属性,这个属性引用了初始化该类型的构造函数,常用于判断位置对象的类型(前提是该类型需是对象),用typeog方法判断该类型是否是对象,然后利用constructor方法。
// 判断对象是否是数组类型
founction
isArray
(
arr
)
{
return
typeof
arr
==
"object"
&&
arr
.
constructor
==
Array
;
}
// 判断对象是否是数组类型
function
isArray
(
arr
)
{
return
Object
.
protoytpe
.
toString
.
call
(
arr
)
===
"[object Array]"
;
}
编写arraysSimilar函数,实现判断传入的两个数组是否相似。具体需求:
1. 数组中的成员类型相同,顺序可以不同。例如[1, true] 与 [false, 2]是相似的。
2. 数组的长度一致。
3. 类型的判断范围,需要区分:String, Boolean, Number, undefined, null, 函数,日期, window.
// 判断是否为相似数组
function
arraysSimilar
(
arr1
,
arr2
)
{
// 判断是否都为数组
if
(
!
(
arr1
instanceof
Array
)
||
!
(
arr2
instanceof
Array
))
{
return
false
;
}
// 判断数组长度是否相同
if
(
arr1
.
length
!=
arr2
.
length
)
{
return
false
;
}
// 创建函数判断数组元素类型
function
type_element
(
ele
)
{
if
(
ele
===
null
)
{
return
"null"
;
}
else
if
(
ele
===
window
)
{
return
"window"
;
}
else
if
(
ele
instanceof
Date
)
{
return
"Date"
;
}
else
if
(
ele
instanceof
Array
)
{
return
"Array"
;
}
else
return
typeof
(
ele
)
;
}
var
e_arr1
=
[
]
;
var
e_arr2
=
[
]
;
for
(
var
i
=
0
;
i
<
arr1
.
length
;
i
++
)
{
e_arr1
.
push
(
type_element
(
arr1
[
i
]))
;
e_arr2
.
push
(
type_element
(
arr2
[
i
]))
;
}
var
a1
=
e_arr1
.
sort
(
)
;
var
a2
=
e_arr2
.
sort
(
)
;
for
(
var
i
=
0
;
i
<
arr1
.
length
;
i
++
)
{
if
(
a1
[
i
]
!=
a2
[
i
])
{
return
false
;
}
}
return
true
;
}