论坛首页 Web前端技术论坛

JavaScript内核系列 第5章 数组

浏览 19245 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-04-26  
我觉得还是有必要更详细地解释下数组对象的下标属性与普通属性的区别,就像s79同志提到的,否则这个东西很容易让新手困惑。
还有,最好也提下JS中的各式“伪数组”,如arguments、与dom有关的childNodes等,这些对象虽然也有length属性,也可以通过数字下标索引元素,但它们不是Array对象。我觉得这点还是有必要提及的。
0 请登录后投票
   发表时间:2010-04-26  
寻找出路的苍蝇 写道
我觉得还是有必要更详细地解释下数组对象的下标属性与普通属性的区别,就像s79同志提到的,否则这个东西很容易让新手困惑。
还有,最好也提下JS中的各式“伪数组”,如arguments、与dom有关的childNodes等,这些对象虽然也有length属性,也可以通过数字下标索引元素,但它们不是Array对象。我觉得这点还是有必要提及的。


首先,谢谢你的建议!
JavaScript的数组只不过是一个内建的比较特殊的Object而已,其中包含了一些特殊的方法,从而使得它看起来像是数组,也就是说,它本身就是你所说的“伪数组”,这一点从多维数组上表现的就更清晰了。另外,关于arguments,最好在函数那一章里讨论比较适合,而DOM部分,则暂时不涉及,因为这个系列主要关注的是核心概念。如果可能,可以在后边专门讨论客户端的JavaScript。
0 请登录后投票
   发表时间:2010-04-26  
引用
另一个与其他语言的数组不同的是,字符串也可以作为数组的下标(事实上,在JavaScript的数组中,数字下标最终会被解释器转化为字符串,也就是说,所谓的数字下标只不过是看着像数字而实际上是字符的属性名),比如:


这个是Object最基本的特性,Array源于Object,自然有这个特性,这个不能说是javascript数组特殊的地方。

Array作为Object,接受key-value序列赋值时,只有当key可转为正整数,才有可能对length进行修改。
比如
var a=[];
a[0] = 0;
a["1"] = 1;
a[new Number(2)] = 2;
a[new String(3)] = 3;
a[new Object(4)] = 4;

var MyObj = function(value){
	this.value = value;
	this.toString = function(){
		return this.value;
	}
}
a[new MyObj(5)] = 5;


不知为什么,javascript的“数组”让我觉得一阵阵恶心。
0 请登录后投票
   发表时间:2010-04-26  
不错期待下一章节:对了Array.prototype.remove和Array.remove的区别是什么啊?期待回复!谢谢
0 请登录后投票
   发表时间:2010-04-26  
最期待的是函数式编程,LZ把这块讲好啊。
0 请登录后投票
   发表时间:2010-04-26  
weiqingfei 写道
引用
另一个与其他语言的数组不同的是,字符串也可以作为数组的下标(事实上,在JavaScript的数组中,数字下标最终会被解释器转化为字符串,也就是说,所谓的数字下标只不过是看着像数字而实际上是字符的属性名),比如:


这个是Object最基本的特性,Array源于Object,自然有这个特性,这个不能说是javascript数组特殊的地方。

你的意思我理解,我想表达的是,这个特性是JavaScript数组区别于其他语言的数组的,并不是JavaScrpt数组区别于JavaScript对象的。

Array作为Object,接受key-value序列赋值时,只有当key可转为正整数,才有可能对length进行修改。
比如
var a=[];
a[0] = 0;
a["1"] = 1;
a[new Number(2)] = 2;
a[new String(3)] = 3;
a[new Object(4)] = 4;

var MyObj = function(value){
	this.value = value;
	this.toString = function(){
		return this.value;
	}
}
a[new MyObj(5)] = 5;


不知道你用的是什么解释器?我使用的解释器器是Rhino,可以设置的,我试了下你的例子。
不知为什么,javascript的“数组”让我觉得一阵阵恶心。

0 请登录后投票
   发表时间:2010-04-26  
woainichenxueming 写道
不错期待下一章节:对了Array.prototype.remove和Array.remove的区别是什么啊?期待回复!谢谢


Array.prototype.remove是对原型链做修改,这样的话,以后所有声明的Array对象就会带上remove方法(隐式的),而Array.remove相当于Array的一个静态方法,这种形式不修改原型链。
0 请登录后投票
   发表时间:2010-04-26  
yudylaw 写道
最期待的是函数式编程,LZ把这块讲好啊。

呵呵,谢谢你的关注,快到了,我尽量做到最好。
0 请登录后投票
   发表时间:2010-04-26  
另外谢谢weiqingfei这位朋友的支持,希望你再接再厉,这样这个系列的质量才可以更好。
0 请登录后投票
   发表时间:2010-04-26  
abruzzi 写道
weiqingfei 写道
引用
另一个与其他语言的数组不同的是,字符串也可以作为数组的下标(事实上,在JavaScript的数组中,数字下标最终会被解释器转化为字符串,也就是说,所谓的数字下标只不过是看着像数字而实际上是字符的属性名),比如:


这个是Object最基本的特性,Array源于Object,自然有这个特性,这个不能说是javascript数组特殊的地方。

你的意思我理解,我想表达的是,这个特性是JavaScript数组区别于其他语言的数组的,并不是JavaScrpt数组区别于JavaScript对象的。

Array作为Object,接受key-value序列赋值时,只有当key可转为正整数,才有可能对length进行修改。
比如
var a=[];
a[0] = 0;
a["1"] = 1;
a[new Number(2)] = 2;
a[new String(3)] = 3;
a[new Object(4)] = 4;

var MyObj = function(value){
	this.value = value;
	this.toString = function(){
		return this.value;
	}
}
a[new MyObj(5)] = 5;


不知道你用的是什么解释器?我使用的解释器器是Rhino,可以设置的,我试了下你的例子。
不知为什么,javascript的“数组”让我觉得一阵阵恶心。



嗯,例子就是演示使用这样形式的下标,是可以给数组赋值并重新计算length的,
由此也可以大概猜想一下Array对象的内部实现。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics