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 的设计缺陷
- 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
- 全局变量难以控制 Javascript 的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
a = 1;
(function () {
b = 2;
alert(a);
})(); // 1
alert(b); //2
- 自动插入行尾分号 Javascript 的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
比如,下面这个函数根本无法达到预期的结果,返回值不是一个对象,而是 undefined。
function(){
return
{
i=1
};
}
原因是解释器自动在 return 语句后面加上了分号。
- NaN NaN 是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:
NaN === NaN; //false
NaN !== NaN; //true
alert(1 + NaN); // NaN
- == 和 === ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。
"" == "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
因此,推荐任何时候都使用"==="(精确判断)比较符。
- 基本类型的包装对象
Javascript 有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。
new Boolean(false);
new Number(1234);
new String("Hello World");
与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。
alert(typeof 1234); // number
alert(typeof new Number(1234)); // object