今天搞代码的时候,又碰到了一个烦人的问题。本来想着改点东西,优化一下之前的逻辑,结果浏览器那边死活跑不起来,打开控制台一看,好家伙,一串红字写着UNEXPECTED TOKEN。
看到这玩意儿,心里大概就有数了,八成又是哪里写错了什么符号,或者格式不对。这种错,说大不大,说小不小,但就是特别磨人,因为它不明着告诉你到底是哪个“token”不对劲,得自己一点点去找。
我的排查过程
第一步,我先是定位到报错提示的那一行代码。浏览器通常会给个大概的位置,我就先去瞅瞅那一行和它前后几行。
仔细看了看,好像没啥明显的语法错误。括号 вроде бы都配对了,分号也没少打,逗号看起来也都在该在的地方。我当时在改一个配置对象,里面嵌套了好几层,心想是不是哪个逗号放错了地方,比如数组或者对象多加了个逗号之类的,虽然现在很多环境都支持了,但有时候老环境或者某些工具链就是不行。
然后我就开始土方法了:
检查括号匹配: 把光标放在括号旁边,看看编辑器能不能正确高亮匹配的另一半。这个检查了一遍,没发现问题。
检查引号: 看看是不是哪里用了中文引号,或者单双引号混用了没配对上。这个也排查了,没问题。
检查特殊字符: 有时候从别的地方复制代码过来,可能会带一些看不见的特殊字符。我试着把报错那几行的代码删掉,然后手动重新敲了一遍,尽量保证字符干净。
搞了半天,还是不行,错误依旧。这就有点头疼了。我开始怀疑是不是引入了什么新的语法特性,但我的编译环境没配置对?比如 ES6 的箭头函数、解构赋值什么的。我又回头看了看我改动的部分,好像也没用什么特别新的东西。
没办法,只能把那块代码暂时注释掉一大块,然后一点点放开,看看是具体哪一小段引起的。这个方法虽然笨,但往往有效。果然,当我放开某一个对象属性的时候,问题复现了。
终于找到了!原来是在一个对象里面,我写了一个属性,但是属性名后面忘了加冒号 ,直接写了属性值。比如应该是 myKey: value
,我可能写成了 myKey value
或者类似的东西。真的是,眼睛看花了,这么个小地方愣是没注意到。
解决与反思
把那个漏掉的冒号加上去,保存,刷新页面。世界清净了,页面正常跑起来了,控制台的报错也消失了。
这回经历又一次提醒我,写代码,尤其是这种脚本语言,细节太重要了。一个符号的错误,就能让整个程序卡住。这种 “UNEXPECTED TOKEN” 错误,绝大部分时候,就是这种小细节没注意到导致的。
以后碰到类似问题,还是得沉下心来,仔细比对语法规则,实在不行就用最笨的排除法,一点点注释,一点点放开,总能找到问题所在。急躁是解决不了问题的,还得是耐心加细心。