JavaScript 的那些事以及缺陷

212 阅读3分钟

JavaScript 诞生

前言: js 的能力要求 逻辑能力,质疑自己的能力,抽象能力。 硬性要求足够多的代码量,足够多的概念,足够多的踩坑经验。



ie6 神奇的 bug 下面的代码会直接让 IE6 崩溃,所以业界流传这么一个传说星号通配符性能低效,但是现如今统配符不会有任何负面影响。

<style>
*{position:relative}
</style>
<table>
<input>
</table>

java 和 javascript 一般认为,当时 Netscape 之所以将 LiveScript 命名为 JavaScript,是因为 Java 是当时最流行的编程语言,带有 "Java" 的名字有助于这门新生语言的传播。 下面是 js 当时设计的思路,只用了十天的时间

1)借鉴C语言的基本语法;

  (2)借鉴Java语言的数据类型和内存管理;

  (3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;

  (4)借鉴Self语言,使用基于原型(prototype)的继承机制。

所以,Javascript 语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。这是由 Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

JavaScript 与 Java 在名字或语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript 的语言设计主要受到了 Self(一种基于原型的编程语言)和 Scheme(一门函数式编程语言)的影响。在语法结构上它又与 C 语言有很多相似(例如 if 条件语句、switch 语句、while 循环、do-while 循环等)。
中国前端的发展 2010 左右,中国才有专门的前端岗位。一开始前端非常缺人,一部分的人员来自自学的后端人员,他们把 Java 的思想代入 Javascript,面向对象成了 JS 的主流思想 ,一部分来自设计师,他们开始学习 CSS,并独创了 重构工程师(现在已经没了)

Javascript 的设计缺陷

  1. null 和 undefined

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

typeof null; // object

typeof undefined; // undefined

var foo;

alert(foo == null); // true

alert(foo == undefined); // true

alert(foo === null); // false

alert(foo === undefined); // true
  1. 全局变量难以控制 Javascript 的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
a = 1;

(function () {
  b = 2;

  alert(a);
})(); // 1

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

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

function(){

    return
      {
        i=1
      };

  }

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

  1. NaN NaN 是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:
NaN === NaN; //false

NaN !== NaN; //true

alert(1 + NaN); // NaN
  1. == 和 === ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。
"" == "0"; // false

0 == ""; // true

0 == "0"; // true

false == "false"; // false

false == "0"; // true

false == undefined; // false

false == null; // false

null == undefined; // true

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

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

  1. 基本类型的包装对象

Javascript 有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。

new Boolean(false);

new Number(1234);

new String("Hello World");

与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。

alert(typeof 1234); // number

alert(typeof new Number(1234)); // object