Web开发

首页 » 常识 » 预防 » 这些都能成为Web语法规范,强迫症看不下
TUhjnbcbe - 2023/3/29 20:17:00

作者:旋律来源:星辰

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:

1
查看完整版本: 这些都能成为Web语法规范,强迫症看不下