从题目出发,是不完整的,因为我不打算讲一些东西,比如数组方法怎么用,因为你看的时候,下面这些对我来说都很重要,只讲数组对象本身。另外,因为我在Javascript方面的实际经验不多,可能有些事情没有涉及到,有些事情是错误的。发现问题请随时给学生提建议。
首先,Javascript(以下简称js)的数组定义不是重点。简单来说,下面两句话就是创建一个空数组:
var arr=[];var arr2=新数组();//不写新的。创建后,您可以随时向数组中添加元素。数组的大小不是固定的,可以像[0]=1一样随意添加。
然后进入正题,关于向数组添加元素。首先,您应该知道数组是一个对象,而对象是键值对的集合(类似于java中的map、python中的dict和c#中的Dictionary)。对象可以有属性。对象的函数称为方法,对象的属性或方法可以通过使用方括号或点来访问,其中括号被引用。只有当属性名是合法变量名时,即属性不是合法变量名时,才能使用Dots
var person={ };person.age=22person . say hi=function(){ console . log(' hi ');};人。年龄;//22人['年龄'];//22 person . say hi();//hi person[' say hi ']();//hi好了,这是对象,看起来也没什么特别的(除了取方括号内的值),不过先说点对象,再开始说数组就够了。
对于上面的,数组可以做到全部,也就是说下面的代码也可以正常运行(只有第一行与上面不同):
var person=[];person.age=22person . say hi=function(){ console . log(' hi ');};人。年龄;//22人['年龄'];//22 person . say hi();//hi person[' say hi ']();//hi因为数组是对象,所以不要将方括号中的字符串索引与这里常用的数字索引混淆。我们还没有开始讨论数字指数。
与普通对象不同,数组对象的元素有数字索引或特殊键(如前所述,对象是键值对),这与我们在java和c#等其他语言中看到的数组是一样的。在js中,这个键有一些特殊的要求。可以是数字,也可以是可以转换成数字的字符串,合理的数字需要是0到4294967295(2 ^ 32-1)范围内的整数(实际上,这个索引在词法分析中是作为字符串使用的。js将该字符串转换为32位整数,然后将32位整数转换为字符串。举个简单的例子:
a=[1,3,5,7];console . log(a[0]);//1 console . log(a[' 0 ']);//1a[' 2 ']=12;console . log(a[2]);//12以上代码可以在浏览器中运行,注释为输出值。这似乎与我们在其他语言中看到的数组没有什么不同。这是一个[' 2 ']=12;因为‘2’先转换成整数再转换成字符串,所以还是‘2’,所以和a[2]一样。但是在其他语言中,我们用数组来定义一个固定大小的数组,对吗?好像不在这里,还说数组的索引范围。那么,为什么?简单的答案是,这里的数组是一个对象,这是js中的一个对象。这与其他语言(除了python和其他函数式语言)不同。我没有深入研究,也没有说清楚。我理解当c/java和其他语言定义数组时,它们在内存中划分一个固定大小的区域,一个指针存储这个区域的第一个地址。然而,js似乎不是这样。如前所述,数组是对象和键值对,所以我认为js中的数组将元素存储在hash中,元素之间的内存不一定是连续的。但是现在找不到检查js变量内存地址的方法,所以不能确定。然而,这不是本文的重点。
我们把重点放在指数上。前面我们讲过指数的范围,但可能有同学尝试过,即A[-1]=2;或a[4294967296]=10;这个说法没有问题。是的,这不是错误,这是正常的说法,当然不会有问题。但问题是,我们不是说索引必须是0到4294967295的整数吗?是的,是的,没错。那么问题在哪里呢?
首先发布火狐控制台的两个截图:
有没有发现什么问题?当我们使用正常索引添加元素时,在打印array时会打印添加的元素,但是当使用异常索引添加元素时,打印的数组中没有添加的元素,但是如果您查看右侧的Array对象,会发现添加的元素相当多。再看另一张图片,这次多加几个元素,然后给array添加一个属性(注意右边Array对象的元素索引):
我不知道你有没有注意到。右边上面是数字索引,打印数组时可以打印,下面是属性,打印数组时不能打印!也就是说,a[-2]=2;在这个语句中,-2是属性的键,不是特殊数值索引的键。-2在强制转换为正整数时被视为字符串,所以-2和4294967296和' name '一样,都是数组的一个属性的键!所以上面提到的负索引或者超范围索引(属性的键)是合法的,都是普通的字符串键。
这里的一个问题是,由于-2是一个普通的属性键,有些人可能会说为什么用-2或a.'-2 '访问-2的值会报告错误,而[-2]不会报告错误。是的,为什么?说到对象,有一句话很大胆:对象的属性或者方法可以用方括号或者点来访问,其中方括号是引用的。只有当属性名是合法变量名时,即属性不包含任何空格连字符且不以数字开头时,才能使用点。因此-2键的属性不能用点来访问!
还有一个小问题,就是方括号。当我们想要访问一个数组的name属性时,我们需要这样:一个['name'],即name用引号括起来,而-2是与name相同属性的键。为什么-2可以不用引号包装?实际上,方括号中的所有字符都将被视为一个表达式,简单的数字-2是合法的表达式。但是,如果name没有定义为变量名,那么name就不是合法的表达式,x^bc也不合法,因为它会被看作是由变量x、b、c组成的表达式,但是x、b、c是否是变量是不确定的,里面的符号也不一定被js支持。如果不容易理解,可以把名字想成x y,当X和Y没有定义为变量的时候,X Y这个表达式肯定有问题,对吧?那么a[x y]就会有问题,对吗?而一个['x y']是没有问题的,因为' x y '是一个字符串。
稍后,在js中,变量名可以任意与数字、字母和下划线组合,数字不能放在开头位置。但是对象属性键的命名要宽松一些,合法的可以不用引号包装,非法的可以用引号包装。
好了,够了。总结:文章首先简单介绍了以下对象,然后说数组也是对象,最后说明了一些问题,然后进行总结。
写这篇文章的原因是昨天在微博看了一篇js教程,对数组的解释有疑问,然后评论数超过了140条,所以查了数据,单独写了。目的是让自己明白,帮助学习js的同学。数组范围和索引转换参考《Speaking Javascript》,其他地方是自己的理解和看法。
最后感谢观看,因为写了两遍,可能句子有点乱,有些地方不乱但上下文完整,有些上下文完整但废话太多,就这样吧。下次见。