重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
var objmoList1=new Array();//数组var objmo=new Object();//对象objmo.s="11";//对象里面的属性objmo.t="22";objmoList1.push(objmo);alert(objmoList1[0].s);
创新互联公司网站建设由有经验的网站设计师、开发人员和项目经理组成的专业建站团队,负责网站视觉设计、用户体验优化、交互设计和前端开发等方面的工作,以确保网站外观精美、成都网站设计、成都网站制作、外贸网站建设易于使用并且具有良好的响应性。
typeof都返回object
在JavaScript中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用typeof搞不定,因为它全都返回object
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
document.write(
'
o
typeof
is
'
+
typeof
o);
document.write(
'
br
/');
document.write(
'
a
typeof
is
'
+
typeof
a);
执行:
复制代码
代码如下:
o
typeof
is
object
a
typeof
is
object
因此,我们只能放弃这种方法,要判断是数组or对象有两种方法
第一,使用typeof加length属性
数组有length属性,object没有,而typeof数组与对象都返回object,所以我们可以这么判断
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
var
getDataType
=
function(o){
if(typeof
o
==
'object'){
if(
typeof
o.length
==
'number'
){
return
'Array';
}else{
return
'Object';
}
}else{
return
'param
is
no
object
type';
}
};
alert(
getDataType(o)
);
//
Object
alert(
getDataType(a)
);
//
Array
alert(
getDataType(1)
);
//
param
is
no
object
type
alert(
getDataType(true)
);
//
param
is
no
object
type
alert(
getDataType('a')
);
//
param
is
no
object
type
第二,使用instanceof
使用instanceof可以判断一个变量是不是数组,如:
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
alert(
a
instanceof
Array
);
//
true
alert(
o
instanceof
Array
);
//
false
也可以判断是不是属于object
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
alert(
a
instanceof
Object
);
//
true
alert(
o
instanceof
Object
);
//
true
但数组也是属于object,所以以上两个都是true,因此我们要利用instanceof判断数据类型是对象还是数组时应该优先判断array,最后判断object
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
var
getDataType
=
function(o){
if(o
instanceof
Array){
return
'Array'
}else
if(
o
instanceof
Object
){
return
'Object';
}else{
return
'param
is
no
object
type';
}
};
alert(
getDataType(o)
);
//
Object
alert(
getDataType(a)
);
//
Array
alert(
getDataType(1)
);
//
param
is
no
object
type
alert(
getDataType(true)
);
//
param
is
no
object
type
alert(
getDataType('a')
);
//
param
is
no
object
type
如果你不优先判断Array,比如:
复制代码
代码如下:
var
o
=
{
'name':'lee'
};
var
a
=
['reg','blue'];
var
getDataType
=
function(o){
if(o
instanceof
Object){
return
'Object'
}else
if(
o
instanceof
Array
){
return
'Array';
}else{
return
'param
is
no
object
type';
}
};
alert(
getDataType(o)
);
//
Object
alert(
getDataType(a)
);
//
Object
alert(
getDataType(1)
);
//
param
is
no
object
type
alert(
getDataType(true)
);
//
param
is
no
object
type
alert(
getDataType('a')
);
//
param
is
no
object
type
那么数组也会被判断为object。
很早以前我就知道可以把
arguments
转化为数组:[].slice.call(arguments),因为
arguments
是个类数组对象,所以才可以这么用。但是我一直不清楚什么叫做类数组对象(
array-like
objects)
今天看
Effective
JavaScript
就有一节是专门讲这个的,感觉真是太拽了。
先看我写的一些示例代码:
复制代码
代码如下:
a
=
"hello"
[].map.call(a,
(e)
-
e.toUpperCase())
#
=
[
'H',
'E',
'L',
'L',
'O'
]
[].reduceRight.call(a,
(acc,
e)
-
acc
+
e)
#
=
'olleh'
b
=
{1:
"a",
2:
"b",
4:
"c",
length:
6}
[].reduce.call(b,
(acc,
e)
-
acc
+
e)
#
=
'abc'
前面那几个是操作字符串的,嗯,字符串也可以看成类数组对象。但是后面那个
b
对象居然
也是类数组对象。
看书上的解释:
复制代码
代码如下:
So
what
exactly
makes
an
object
“array-like”?
The
basic
contract
of
an
array
object
amounts
to
two
simple
rules.
It
has
an
integer
length
property
in
the
range
0...2^32
–
1.
The
length
property
is
greater
than
the
largest
index
of
the
object.
An
index
is
an
integer
in
the
range
0...2^32
–
2
whose
string
representation
is
the
key
of
a
property
of
the
object.
居然只有这两条简单的规则。
所以为什么
arguments,
字符串,和上面那个
b
对象可以看作类数组对象呢?
它们都有一个合法的
length
属性(0
到
2**32
-
1
之间的正整数)。
length
属性的值大于它们的最大索引(index)。
再举个例子:
复制代码
代码如下:
b
=
{1:
"a",
2:
"b",
4:
"c",
length:
3}
[].reduce.call(b,
(acc,
e)
-
acc
+
e)
#
=
'ab'
嗯,就不对了,成了'ab'
了,因为违反了规则2:length
属性是3,
最大索引值是4要比
length
属性大了。所以表现的不正常了。
太强大了,好像只是定义了一个接口,只要符合这个接口,就可以利用数组的所有方法。
其实不是可以利用所有方法,Array.prototype.concat
是不能用的,因为它是把两个数组连接起来,你不是数组肯定是没法用它的。
还有一个小问题是,字符串创建以后是不可变的(immutable),所以你怎么折腾它都是不可变的。
但是这本书根本就没有解释为什么是符合这两个条件就可以看成类数组对象,另外这本书的作者
是那个什么
ECMAScript
委员会的成员,所以基本还是可信的。至于为什么符合这两个条件就可以看成是类数组对象,我也不知道,谷歌搜了半天也没看到什么合理的解释。
以上所述就是本文的全部内容了,希望大家能够喜欢。