学习JS数组有感

Spring Wu 796 2021-03-24

缘起

前几天开始,我在w3school上面开始学习js,妄图补回以前忘掉的知识,因为本身就是Java程序员,在上学的时候也学过js,所以在学习js的时候也比较轻松快乐,当我学到JS数组后,发现有这么一段

关联数组
很多编程元素支持命名索引的数组。
具有命名索引的数组被称为关联数组(或散列)。
JavaScript 不支持命名索引的数组。
在 JavaScript 中,数组只能使用数字索引。
实例:

var person = [];
person[0] = "Bill";
person[1] = "Gates";
person[2] = 62;
var x = person.length;          // person.length 返回 3
var y = person[0];              // person[0] 返回 "Bill"

警告!
假如您使用命名索引,JavaScript 会把数组重定义为标准对象。
之后,所有数组的方法和属性将产生非正确结果。
实例:

var person = [];
person["firstName"] = "Bill";
person["lastName"] = "Gates";
person["age"] = 62;
var x = person.length;         // person.length 将返回 0
var y = person[0];              // person[0] 将返回 undefined

我这里有点懵,因为我是Java程序员,看到这段后。

思考

我在思考,这是个什么玩意儿,再仔细看到”具有命名索引的数组被称为关联数组(或散列)“后,我发现散列?这玩意儿不就是Hash吗?在Java中没有关联数组这一说法,唯一相通的点可能就是在Java中有个HashMap,HashMap是通过散列+链表+数组实现的。此时我在想,是不是js也有map这个数据类型,然后我就去搜了一下,果真有!那我来猜一下js的map应该也和Java的实现方式差不多,首先key,value进来后,hash(key)得到一个索引坐标,如果得到的索引坐标已经被使用(该索引位置已存在值),如果key相等,那么就将value覆盖,如果key不相等,则将value放在链表尾部或头部(Java1.8之前放头部,之后放的尾部,解决死循环问题。),可能再高级点,就和Java一样,升级为红黑树,提升访问效率。

另外,我实在不明白教程这里提到关联数组,有什么意义

  • 第一:js本来就不支持这种方式,因为在我看来这个教程是面向新手的,特别是那种没有编程基础的新手,如果看到这里,ta绝壁很懵逼。
  • 第二:从这里看,js数组的索引居然还能随便设置字符串,按照我从Java先入为主的角度来说,这样实不可取的,增加了学习成本,对于js数组这块来说,是不安全的。因为如果有人不知道,看到这里还能这么设置,有可能就会这么去设置,最后却出现问题,我估计ta会怀疑人生。。。(貌似我好像理解了教程这里为什么要单独写一块内容了)。
  • 第三:js弱类型学起来确实很友好,很方便,但对于安全编程这一块确实是需要经验的。

总结

目前看来学习js确实比学习Java要简单,但是作为一门不是那么”严谨“的语言,对于之后做项目这些还是要有经验才行,不然就会踩到一些坑。看来我还是小看了js,一句话就是入门很容易,但是不要轻视它,它可能会让你的代码不安全。