作者:旋律来源:星辰
JavaScript一直是饱受诟病,源于网景公司在年用了10天的时间创造。没有什么能用10天创造就是完美的,可是某些特性一旦发布,错误或不完善的地方迅速成为必不可少的特色,并且是几乎不可能改变。
Javascript发展非常快,根本没有时间调整设计。在推出一年半之后,国际标准就问世了。设计缺陷还没有充分暴露就成了标准。
历史遗留
比如常见的历史设计缺陷:
null和undefined两者非常容易混淆
==类型转换的问题
var声明创建全局变量
自动插入行尾分号
加号可以表示数字之和,也可以表示字符的连接
NaN奇怪的特性
更多...
Javascript很多不严谨的特性我们可以添加eslint来规避。比如禁用var和==成了大多数人写代码的必备条件。
现在/未来
如今CSS、DOM、HTML规范由W3C来制定,JavaScript规范由TC39制定。那些历史缺陷也成为了过去,但是现在也出现了一些不尽人意的规范。
CSS变量
声明变量的时候,变量名前面要加两根连词线--
body{--foo:#7ff;--bar:#f7efd2;}
var()函数用于读取变量。
a{color:var(--foo);text-decoration-color:var(--bar,#7ff);}
为什么选择两根线(--)表示变量?因为$被Sass用掉,
被Less用掉。_、-,用作为IE、chrome兼容写法。CSS已经找不出来字符可以代替变量声明了。为了不产生冲突,官方的CSS变量就改用两根线。作为一个官方的标准规范,时刻后面的行业发展。竟然能被第三方的插件所左右,令人大跌眼镜。有开发者吐槽:微软的架构师也是够。
现在很多应用都了Sass和less,转向了PostCSS的怀抱。面向组件编程,根本用不到Sass和less里面的一些复杂功能。那么--两个字符的繁琐将成为开发者永远的痛。
类私有属性(proposal-class-fields)
JavaScript中的class大家已经不陌生了,简直跟Java的class一模一样。
基本用法:
classBaseClass{msg=helloworld;basePublicMethod(){returnthis.msg;}}
继承:
classSubClassextendsBaseClass{subPublicMethod(){returnsuper.basePublicMethod();}}
静态属性:
classClassWithStaticField{staticbaseStaticMethod(){returnbasestaticmethodoutput;}}
异步方法
classClassWithFancyMethods{*generatorMethod(){}asyncasyncMethod(){}async*asyncGeneratorMethod(){}}
类属性的提案目前已经进入标准,它用了#关键字前缀来修饰一个类的属性。
classClassWithPrivateField{#privateField;constructor(){this.#privateField=42;}
你没看错,不是typescript中的private关键字。
classBaseClass{readonlymsg=helloworld;privatebasePrivateMethod(){returnthis.msg;}}
然而#的语法丑陋本身引起了社区的争议:
「classfields提案提供了一个极具争议的私有字段访问语法——并成功地做对了唯一一件事情,让社区把全部的争议焦点放在了这个语法上」。
TS投降主义已经被迫实现了。
Nodynamicaccess,nodestructuringisadealbreakerforme
我们制作一个eslint插件no-private-class-fields并下载计数来说明社区反对
#作为名称的一部分会导致混淆,因为this.#x!==this[#x]太奇怪了
前端架构师、TC39成员贺师俊也在知乎连发好几篇文章吐槽classfields
不妨大家看看关于private的side: