JavaScript进阶(三十六):如何拆解一个表达式(一)

这篇博客,我们继续。

首先,别的我们不管,在这个组件第一次刚刚创建出来的时候,我们要不要做一个初始的渲染?肯定是要的。

所以,我们需要一开始的时候,就来调用一次 render,代表初始渲染:

然后接下来,我们的问题就变成了,这个 render 具体需要怎么去做?

那么我们可以先从一个简单的开刀,比如,VText 需要怎么去做?

事实上来说,这个 VText 我们要做的是什么?

是不是需要把原始的文本 this._text 里面的 {{ }} 给编译掉?

如果 this._text = "a={{a}}",那么我们是不是要把这个 {{a}} 找出来,并且编译掉,这个我们前面的博客已经做过了。

然后反过来,我们可不可以这么做?

this._dom 对应于我们那个真正的节点。

我要让它的 data,就等于我现在的这个模板的文本,然后让它去做一个编译的过程。

这个编译的过程也很简单,就是 replace:

当然顺便一说,我们一定得用 {{ }} 吗?不一定,愿意用什么都行。

既然想要跟 vue 有所区分,以便于向大家证明,这个用什么都行,那么我希望在这个库里,我们以 [[ ]] 为标准:

那么这种情况下,VText 里面也要跟着改:

那么它里面会有东西呢?

其实什么都有可能:

但就是不太可能出现右方括号 ]。

但是事实真的如此吗?

并不是的,我们有没有可能加上 arr[0]:

所以这时候,不能说只要碰到这个 ] 就结束,那我们得怎么办呢?所以,我们就要搞的严格一点。

我们要涉及到一个问题,这个东西什么时候就算结束呢?什么时候碰到 2 个右方括号为止 ]]。

但是这样真的精确吗?

 

在我们平常真正写代码的过程当中,有没有可能碰到两个方括号?

比方说,我们 data 里面有 2 个这样的数据:

那么我可不可以这么写?

所以,在我们这,正常写代码的过程当中,有没有可能碰到2个括号?

是有可能的,我们不能因为碰到两个右方括号,就提前结束了,那是不行的。

 

所以说这种情况下,我们应该怎么办呢,这个就很麻烦。

可能有人说,那你还是换回花括号 {{ }} 吧,它就没那问题。

其实正常写代码,2 个右花括号 }} 也有可能出现,比如:

所以,这个不是我们换不换符号的问题,其实无论我们换成什么符号,它理论上都应该有这种可能出现的情况。

比如就算我们换成 %%,这个应该没人用吧?那么如果我们加个字符串,也是一样的:

理论上任何符号你都跑不掉,总要碰到问题的。

所以我们解决问题的办法,并不是逃避,我们必须得想办法必须把它给办了,那怎么办呢?

这个时候,我们用正则就已经不能发挥作用了。

当然,正则理论上写一大堆可以解决这个问题,但是我们可以用更好的方法。

 

首先,它一定是以 2 个左方括号 [[ 开头的,这个你不能否认,绝对是。

其次,方括号是不是必须得成对出现?

那如果是这种写法呢  arr0] ?这是错的,就不能这么写。

正确的写法当中,方括号一定是成对出现的  arr[0] 。

 

那么这时候问题来了,既然是成对出现,我怎么样判断它结束了?

首先,当我碰见 2 个左方括号 [[ 的时候,我标记为起点:

相当于现在我手里有一个 count,并且它的数量为 2。

这个 count,代表左方括号 [ 出现过的次数是 2 次。

 

接下来,我们就从这里往后走,然后到这,我们碰到一个:

怎么办?count + 1。

所以现在 count = 3。

 

然后我们继续往下走,又碰到一个:

再 + 1,count = 4。

再往下,碰到一个反的,右方括号 ],怎么办?

减一,count = 3。

再走,又碰到一个反的:

继续减一,count = 2。

再走,又碰到一个正的:

加一,count = 3。

再走,又碰到一个反的:

减一,count = 2。

然后最后 2 个反的:

减二,count = 0。

这时候,是不是我们要的东西就出来了。

说白了,碰到 2 个左方括号 [[ 开始,我就开始计数。

什么时候这个数消耗完了等于 0,什么时候我就认为到头了。

 

那有人要说了,如果我就是想加个字符串方括号连接进来呢?比如这样:

那么这时候,我们可不可以把上面的方法外延一下:

我们可以搞个 count2,它是用来计算我们碰到单引号的次数。

那如果用双引号呢?那我们就在搞个 count3,用来计算碰到双引号的次数。

 

那么我们就直接从单引号这里开始:

当我们碰到单引号的时候,那么 count2 就有一个了,count2 = 1。

然后继续往下走,但是注意,在这个 count2 减成 0 之前,你出现什么我都不认。

为什么?因为你是字符串啊,字符串里面放什么东西,关我啥事啊。

那么当我又碰到了一个单引号的时候:

我们的 count2 就减成 0 了。

那么这时候,我才恢复到继续识别方括号的状态下。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章