JavaScript 的设计缺陷

1. JavaScript 为什么有设计缺陷?

这里有三个主要原因导致了 JavaScript 的设计不够完善。

1.1. 设计时间过短

相信大家都知道 JavaScript 诞生就只花了十天,虽然这让我们感到非常吃惊,感叹设计者的能力之强大。但是从另一个角度想,没有经过深思熟虑的东西一定就有没有考虑到的地方。相信大家在使用时也发现了 JavaScript 的一些缺陷。

我们程序猿一般都是给别人打工,很少是自己开发一个程序并且能够自给自足的,JavaScript 的设计者也是这样,也是为了给公司交差,本人并不想这样设计。

另外,JavaScript 的设计初衷是为了实现一些网页的简单互动(比如:检查用户名是否填写),并没有考虑到现今的复杂应用的开发。JavaScript 的设计者做梦也想不到 JavaScript 将来能写出如今这么极其庞大复杂的网页。

1.2. 过早的标准化

JavaScript 的发展太快了,甚至快到根本没有时间进行调整设计。

1995年5月,设计方案定稿;10月,解释器开发成功;12月,向市场推出,立刻被广泛接受,全世界的用户大量使用。Javascript缺乏一个从小到大、慢慢积累用户的过程,而是连续的爆炸式扩散增长。大量的既成网页和业余网页设计者的参与,使得调整语言规格困难重重。

更糟的是,Javascript的规格还没来及调整,就固化了。

1996年8月,微软公司强势介入,宣布推出自己的脚本语言Jscript;11月,为了压制微软,网景公司决定申请Javascript的国际标准;1997年6月,第一个国际标准ECMA-262正式颁布。

也就是说,Javascript推出一年半之后,国际标准就问世了。设计缺陷还没有充分暴露就成了标准。相比之下,C语言问世将近20年之后,国际标准才颁布。

1.3. 没有先例

JavaScript 很可能是第一个将函数式编程和面向对象编程结合的编程语言。而且到今天为止,JavaScript 仍然是世界上唯一使用 Prototype 继承模型的主要语言。这使得它没有先例可以参考。

2. JavaScript 的设计缺陷

2.1. null 和 undefined

我们在接触 JavaScript 时都会被告知 null 在设计时有一个 bug,就是 type null === "object"

null 属于对象的一种,意思为该对象为空;undefined则是一种数据类型,表示未定义。

js 复制代码
var obj;

foo == null; // true
foo == undefined; // true
foo === null; // false
foo === undefined; // true

2.2. 全局变量

Javascript的全局变量,在任何位置中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。

js 复制代码
function fn() {
    n = 1; // 这里会创建全局变量
}

fn();
n; // 1
window.n; // 1

并且不用声明变量就可以直接赋值。

js 复制代码
let obj = {};

obj.name = "李华"; // 直接赋值即可创建变量

2.3. 自动插入行尾分号

Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。

比如,下面这个函数根本无法达到预期的结果,返回值不是一个对象,而是 undefined。

js 复制代码
function() {
    return 
    {
        i: 1;  
    };
}

原因是解释器自动在 return 语句后买呢加上了分号。

js 复制代码
function(){
    return;
        {  
            i:1  
        };
}

2.4. NaN

NaN 是一个数字,表示超出了解释器的极限。它有一些奇怪的特性:

js 复制代码
NaN === NaN; // false

NaN !== NaN; // true

2.5. == 和 ===

== 用来判断两个值是否相等。当两个值类型不同时会发生自动转换,得到的结果不符合直觉。

js 复制代码
"" == "0"; // false

0 == ""; // true

0 == "0"; // true

false == "0"; // true

false == null; // false

false == undefined; // false

" \t\r\n" == 0; // true

因此推荐任何时候都使用 === 精确判断比较符。

2.6. 更多缺陷

更多缺陷请查看:wtfjs.com

3. 如何看待这些缺陷

JavaScript 既然有这么多缺陷,那它是不是会被淘汰?在七八年前我们可能会有这种担忧,但在现在我们已经看到了它的未来。它的能力很强大,既能编写前端,又能编写后端,既能编写桌面应用,也能编写移动端应用。甚至在任何角落我们都能看到它的身影。

JavaScript 的第三方库也非常庞大,再加上良好的编程规范,就能回避大部分的缺陷。

另外 JavaScript 是目前网页编程的唯一语言,只要互联网继续发展,它就必然发展。目前,许多新项目大大扩展了它的用途,node.js使得Javascript可以用于后端的服务器编程,coffeeScript使你可以用python和ruby的语法,撰写Javascript。

最后,只要发布新版本的语言标准(比如 ECMAscript 5),就可以弥补这些设计缺陷。当然,标准的发布和标准的实现是两回事,上述的很多缺陷也许会一直伴随到Javascript存在的最后一天。

相关推荐
weixin_382395237 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__7 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.8 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~9 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华9 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子12 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅12 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni12 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学14 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端