JS里的编程根源:产生数据,操作数据。

从js入门的编程世界。死记硬背,强行构建了指针的概念范畴,然后是堆栈的概念。
数据结构的概念构建,源于js中的对象。有数据又有获取数据和操作数据的方法。
但是跟数据结构还是没多大关系的。只是让我对对象这种既可以存储数据,又可以编辑数据这种设定很有设计感。
随着工作,业务,功能,需求,等等的研发加深。我越来越对编程的实质性行为有感觉了,就是生产数据,存储数据,读取数据,操作数据,删除数据。ui上的东西源于数据,响应式的用户交互,也是回归到数据。我一直都认为前端是面向用户开发的,而后端是面向数据开发的。但是我编程时,跑通所有的逻辑,却也是面向数据开发的,只不过表面上是面向用户的存在感更强。。。

面向数据编程的视野

然后我就对数据本身越来越重视,这让我在开发中越来越得心应手,事实证明,vue,react,redux等我接触的著名的工具们,都是回归到数据了!有一阵子,我崇尚忠于数据开发的。
数据形式上就是变量,实质上是个指针,值是内存地址。js语言比较面向用户,不像java,go,c之流,可以拿到变量的内存地址。
数据的构建就到这里了。变量,指针,内存地址,对应的内存区块存储的数据值。
数据的生命周期就是变量,声明,赋值,存储到内存,拿到对应的内存地址,然后可以通过内存地址,读取地址内的值,拿到值了就可以操作,或再存储或删除,,,
js可没那么大能量,如何?

从后端语言看到内存的机制

其实,一直到去年夏天,没玩go的时候,我都是那个拿来主义的指针,堆栈的概念世界观。
然后,学了点go的语法而已,才很直观地发现,数据>变量>指针(内存地址),这是前端的视野。在语言的运行平台上,数据要存于内存中,它才可以被获取,数据的内存地址是最根本的直接获取的方法。后端语言应该是可以直接拿到内存地址的。
js运行在浏览器,浏览器平台帮js执行这些。那浏览器是什么语言写的?c,c++?这种语言,可以直接操作内存的,这种语言可以存储数据,可以操作数据。如何更好更优更优秀地操作数据?管理学的经验,系统化,约定规则, 比如图书馆的检索系统。
这时候讲究效率了。如何更快地检索到对应的数据?如何更快地修改原数据?
就开始不仅仅是存上数据就好了。如何存储数据成了一个问题了。只是存储数据,然后返回内存地址,只能适用于单个数据的存储。批量操作,如何读取,操作,添加,删除,都是要想到最优的答案了。
为了解决这些问题,不得不设计一些规则:
存储一个数据,放到哪里?
存储好了,返回什么?
比如链表是规则!
面向数据的语言,可以有很多的数据结构。
数据结构源于内存机制!

JS与数据结构

而JS这种前端面向用户的语言,只能利用平台约定好的api们,去间接调用深层次的后端语言的命令,生成它的数据,间接调用约定好的api方法,操作数据。js的数据结构的感官很少的,表面上就是指针,赋值。
深层次的数据操作,还是用约定好的处理数据的方法。
这是对js的数据结构的认知了。JS对数据结构的考验,多是在开发中,遇到的各种需求,比如递归的层层嵌套。
js里,对数据结构的价值观的体现就是:

  1. 生成什么类型的数据?
  2. 这种类型的数据如何增删改查?
  3. 更方便更高效!

回归到数据结构这个概念构建,我建议从后端语音出发更深刻的。
如何存储数据,管理地址,操作数据,这是数据结构的源头了。

从数组来看数据结构的视角

js中的数组相当好操作,增删改查,一个或者多个,调用api就行了!
其他的面向内存低层的语言,对数组的操作可是很难的。
数组的好处就是,取值方便,查找方便,新增方便,修改方便。下标操作很舒服!效率高!
不好的是,扩容,插入,删除。因为数组的数据结构,决定了数组的数据在内存是前后紧挨着的。

我看js的数组,其实更像是数据结构中的数组跟链表的一种结合体。确实,js中的数组本就是特殊的对象而已。我的一个小猜想:数组本身是存放简单类型的数据的,复杂的数据类型,数据本身的内存地址存到数组中,而数据实体可以以链表的形式存储。