JavaScript一直被人诟病,它起源于1995年Netscape10天创造,没有什么是10天就完美的,但是有些特性一旦有了发布后,错误或缺陷很快就会成为基本功能,并且几乎无法更改。Javascript发展如此之快以至于根本没有时间调整设计。引入一年半后,国际标准发布。设计缺陷尚未完全暴露成为标准。常见的历史设计缺陷等历史遗留问题:null和undefined很容易混淆==类型转换问题var声明创建全局变量并自动在行尾插入分号加号可以表示数字的总和和字符的拼接NaN奇怪Morefeatures...我们可以添加eslint来避免Javascript的很多不精确的特性。例如,禁用var和==已成为大多数人编写代码的必备条件。现在/未来今天CSS、DOM、HTML规范由W3C制定,JavaScript规范由TC39制定。那些历史上的不足也已成为过去,只是现在有些不尽如人意的规范。CSS变量声明变量时,必须在变量名前加两个连字符--body{--foo:#7f583f;--bar:#f7efd2;}var()函数用于读取变量。a{color:var(--foo);text-decoration-color:var(--bar,#7f583f);}为什么选择两条连字符(--)来表示变量?因为$是Sass用的,@用的比较少用完。_,-,与IE和chrome兼容。CSS中没有字符可以代替变量声明。为了不引起冲突,官方的CSS变量使用了两行连字符。作为正式的标准规范,它时刻影响着背后产业的发展。令人惊讶的是,它可以被第三方插件所左右。有开发者抱怨:微软的架构师也很没用。许多应用程序现在正在放弃Sass,转而拥抱PostCSS。面向组件的编程不使用Sass中的一些复杂函数,也很少使用。那么——繁琐的两个字符就会成为开发者永远的痛。类的私有属性(proposal-class-fields)JavaScript中的类大家并不陌生,它和Java的类如出一辙。基本用法:classBaseClass{msg='helloworld';basePublicMethod(){returnthis.msg;}}继承:classSubClassextendsBaseClass{subPublicMethod(){returnsuper.basePublicMethod();}}静态属性:classClassWithStaticField{staticbaseStaticMethod(){return'basestaticmethodoutput';}}异步方法classClassWithFancyMethods{*generatorMethod(){}asyncasyncMethod(){}async*asyncGeneratorMethod(){}}而类私有属性的提案已经进入标准,它使用#关键字前缀来修饰类的属性。classClassWithPrivateField{#privateField;constructor(){this.#privateField=42;}}你没看错,不是typescript中的private关键字。classBaseClass{readonlymsg='helloworld';privatebasePrivateMethod(){returnthis.msg;}}然而,#语法本身的丑陋在社区中引起了争议:“类字段提案提供了极具争议的私有字段访问语法——并成功唯一做对的事情就是让社区将所有争议集中在这个语法上。”TS投降主义被迫实现。没有动态访问,没有解构对我来说是一个交易破坏者我们制作了一个eslint插件no-private-class-fields并使用下载计数来说明社区的反对意见,即“#”作为名称的一部分会引起混淆,因为this.#x!==this['#x']太奇怪了。前端架构师、TC39成员何士君也在知乎上发了几篇文章,吐槽类字段。关于private的这边不妨看看:https://johnhax.net/2017/js-private/slide?qcon#0提案地址:https://github.com/tc39/proposal-class-fieldsglobalThis在不同的JavaScript环境中需要不同的语句来获取全局对象。在Web中可以通过window和self获取全局对象,而在WebWorkers中只能使用self。在Node.js中,必须使用global。在非严格模式下,可以在获取全局对象的函数中返回this,否则会返回undefined,所以出现了一个叫global的提议。主要是用global变量来统一上面的行为,但是兜兜转转改成globalThis后引起了热议。名称globalThis会使事情变得更加复杂。这一直是程序员困惑的话题,尤其是JavaScript的新手,关于它的博客文章源源不断ES6通过告诉人们更喜欢箭头函数并且只在现代JS(模块)中使用这种内部方法定义来使事情??变得更容易,没有真正的全局this,所以globalThis甚至不引用现有概念。现在说这些都是徒劳,因为已经进入第4阶段了。提案地址:https://github.com/tc39/proposal-globalSummaryJavaScript还剩这么多。现在受这些糟粕的影响,很多新的提案不得不妥协。将来,它将变得极其复杂。也许有一天,没有历史包袱的JavaScript子集会取而代之。
