JavaScript语言精粹章节节选

1.1为什么要使用JavaScript(Why JavaScript?)

JavaScript是一门重要的语言,因为它是web浏览器的语言.它与浏览器的结合使它成为世界上最流行的编程语言之一.同时,它也是世界上最被轻视的编程语言之一.浏览器的API和文档对象模型(DOM)相当糟糕,导致JavaScript遭到不公平的指责.在任何语言中处理DOM都是一件痛苦的事情,它的规范制定得很拙劣并且实现互补一致.本书很少涉及DOM,我认为一本关于DOM的精华的书就像执行一项不可能完成的任务.

JavaScript是最被轻视的语言,因为它不是所谓的主流语言(SOME OTHER LANGUAGE).如果你擅长某些主流语言,但却在一个只支持JavaScript的环境中编程,那么被迫使用JavaScript确实是相当令人厌烦的.在那种情形下,大多数人觉得没必要去先学好JavaScript,但结果他们会惊讶的发现,JavaScript跟他们宁愿使用的主流语言有很大不同,而且这些不同至为关键.

JavaScript令人惊异的事情是,在对这门语言没有太多了解,甚至对编程都没有太多了解的情况下,你也能用它来完成工作.它是一门拥有极强表达能力的语言.当你知道要做什么时,它甚至能表现得更好.编程是很困难的事情.绝不应该在对此一无所知时便开始你的工作.

1.2分析JavaScript(Analyzing JavaScript)

JavaScript建立在一些非常好的想法和少数非常坏的想法之上.

那些非常好的想法包括函数,弱类型,动态对象和一个富有表现力的对象字面量表示法.那些坏的想法包括基于全局变量的编程模式.

JavaScript的函数是(主要)基于词法作用域(lexical scoping)的顶级对象.JavaScript是第一个成为主流的lambda语言.实际上,相对Java而言,JavaScript与Lisp和Scheme有更多的共同点.它是披着C外衣的Lisp.这使得JavaScript成为一个非常强大的语言.

现今大部分变成语言中都流行要求强类型.其原理在于强类型允许编译器在编译时检测错误.我们能越早检测和修复错误,付出的代价就越小.JavaScript是一门弱类型的语言,所以JavaScript编译器不能检测出类型错误.这可能让从强类型语言转向JavaScript的开发人员感到恐慌.但事实证明,强类型并不会让你的测试工作轻松.并且我在工作中发现,强类型检查找到的那种错误并不是令我头疼的错误.另一方面,我发现弱类型是自有的.我无须建立复杂的类层次,我永远不用做强制造型,也不用疲于应付类型系统以得到想要的行为.

JavaScript有非常强大的对象字面量表示法.通过列出对象的组成部分,它们就能简单地被创建出来.这种表示法是促使我创立流行的数据交换格式__JSON的灵感.

原型继承是JavaScript中一个有争议的特征.JavaScript有一个无类别的(class-free)对象系统,在这个系统中,对象直接从其他对象继承属性.这真的很强大,但是对那些被训练使用类去创建对象的程序员们来说,原型继承是一个陌生的概念.如果你尝试对JavaScript直接应用基于类的设计模式,你将会遭受挫折.但是,如果你学习使用JavaScript的原型本质,那么你的努力将会有所回报.

JavaScript在关键思想的选择上饱受非议.虽然在大多数情况下,这些选择是合适的.但是有一个选择相当糟糕:JavaScript依赖于全局变量来进行连接.所有编译单元的所有顶级变量被撮合到一个被称为全局对象的公共命名空间中.这是一件糟糕的事情,因为全局变量是魔鬼,并且在JavaScript中它们是基础性的.幸好,我们接下来会看到,JavaScript也给我们提供了缓解这个问题的处理方法.

在少数情况下,我们不能忽略鸡肋的部分.另外还有一些不可避免的糟粕,当涉及这些部分时,我会将它们指出来.它们也被总结在附录A中.但是我们将成功地避免本书中提到的大多数鸡肋的部分,它们中的大部分被总结在附录B中.如果你想学习那些鸡肋的部分及如何拙劣的使用它们,请参阅任何其他的JavaScript书籍.

JavaScript是一门有许多差异的语言.它包含很多错误和尖锐的边角,所以你可能会疑惑:”为什么我要用JavaScript?”有两个答案.第一个是你没有选择.web已变成一个重要的应用开发平台,而JavaScript是惟一一门所有浏览器都可以识别的语言.很不幸,Java在浏览器环境中失败了,否则想用强类型语言的人来说就有其他选择了.但是Java确实失败了,而JavaScript仍蓬勃发展着,这恰恰说明JavaScript确有其过人之处.

另一个答案是,尽管JavaScript有缺陷,但是它真的很优秀.它即轻量级又富有表现力.并且一旦你熟练掌握了它,就会发现函数式编程是一件很有趣的事.

但是为了更好地使用这门语言,你必须知道它的局限.我将会无情的揭示它们.不要因此而气馁.这门语言的精华部分足以弥补它鸡肋的不足.

1.3一个简单地试验场

如果你有一个Web浏览器和任意一个文本编辑器,那么你就有了运行JavaScript程序所需要的一切.首先,请创建一个HTML文件,可以命名为index.html:

<html>
    <body>
        <pre>
            <script src="./index.js"></script>
        </pre>
    </body>
</html>

接下来,在同一个文件夹内,创建一个脚本文件,可以命名为index.js:

document.write('hello,world!');
 ```
> 下一步,用你的浏览器打开你的HTML文件查看结果.本书贯彻使用都会用到一个method方法去定义新方法.下面是它的定义:
```javascript
Function.prototype.method = function(name,func) {
  this.prototype[name] = func;
  return this;
};




<div class="se-preview-section-delimiter"></div>

2.1空白

空白可能表现为格式化字符或注释的形式.空白通常没有意义,但是偶尔需要用它来分隔字符序列,否则它们就会被合并成一个单一的符号.例如,对如下代码来说:

var that = this;




<div class="se-preview-section-delimiter"></div>

var和that之间的空格是不能被移除的,但是其他的空格都可以被移除.

JavaScript提供两种注释形式,一种是用/* */包围的块注释,另一种是以//为开头的行注释.注释应该被充分地用来提高程序的可读性.必须注意的是,注释一定要精确地描述代码.没有用的注释比没有注释更糟糕.

用/* */包围的块注释形式来自于一门叫PL/I的语言.PL/I选择那些不常见的 ‘符号对’ 作为注释的符号标志,因为它们除了可能出现字符串的字面上之外,大不可能在这门语言的程序中出现.在JavaScript中,那些字符对也可能出现在正则表达式字面上,所以块注释对于被注释的代码块来说是不安全的.例如:

/*
    var rm_a = /a*/.match(s);
*/

导致了一个语法错误.所以,我建议避免使用/* */,而用//注释代替它.在本书中,将只会使用//注释.

2.2标识符(Names)

标识符由一个字母开头,其后可以选择性地加上一个或多个字母,数字或下划线.标识符不能使用下面这些保留字:

  abstract boolean break byte case catch
  char class const continue debugger default
  delete do double else enum export extends
  false final finally float for function
  goto if implements import in instanceof
  int interface long native new null package
  private protected public return short
  static super switch synchronized this
  throw throws transient true try typeof
  var volatile void while with

在这个列表中的大部分保留字尚未用在这门语言中.这个列表不包括一些本应该被保留而没有保留的字,诸如undefined,NaN和Infinity.JavaScript不允许使用保留字来命名变量或参数.更糟糕的是,JavaScript不允许在对象字面量中,或者在一个属性存取表达式的点号之后,使用保留字作为对象的属性名.

2.3数字(Number)

JavaScript只有一个单一的数字类型.它在内部被表示为64位的浮点数,和Java的double一样.不像大多数其他的编程语言,它没有分离出整数类型,所以1和1.0是相同的值.这提供了很大的方便,因为它完全避免了短整数的溢出问题,并且你需要知道的关于数字的一切就是它的一种数字.这样就避免了一打类因数字类型导致的错误.

值NaN是一个数值,它表示一个不能产生正常结果的运算结果.NaN不等于任何值,包括它自己.你可以用函数isNaN(number)检测NaN.

值Infinity表示所有大于1.79769313486231570e+308的值.

数字拥有方法.JavaScript有一个对象Math,它包含一套作用于数字的方法.例如,可以用Math.floor(number)方法讲一个数字转换成一个整数.

2.4字符串(String)

字符串字面量可以被包围在单引号或双引号中,它可能包含0个或多个字符.(反斜线符号)是转义字符.JavaScript在被创建的时候,Unicode是一个16位的字符集,所以JavaScript中的所有字符都是16位的.

JavaScript没有字符类型.要表示一个字符,只需创建仅包含一个字符的字符串即可.

转义字符允许把那些正常情况下不被允许的字符插入到字符串中,比如反斜杠,引号和控制字符.

字符串有一个length属性.例如”seven”.length是5.

字符串是不可变的.一旦字符串被创建,就永远无法改变它.但通过+运算符去连接其他的字符串从而得到一个新字符串是很容易的.两个包含着完全相同的字符且字符顺序也相同的字符串被人为是相同的字符串.所以:

'c' + 'a' + 't' ==='cat'

是true.

2.5语句

一个编译单元包含一组可执行的语句.在web浏览器中,每个script标签都提供一个被编译且立即执行的编译单元.因为缺少链接器,JavaScript把它们一起抛入一个公共的全局名字空间中.

当var语句被用在函数内部时,它定义了这个函数的私有变量.

switch,while,for和do语句允许有一个可选的前置标签(label),它配合break语句来使用.

语句往往按照从上到下的顺序被执行.JavaScript可以通过条件语句(if和switch),循环语句(while,for和do),强制跳转语句(break,return和throw)和函数调用来改变这个执行序列.

代码块是包在一对花括号中的一组语句.不像许多其他的语言,JavaScript中的代码块不会创建一个新的作用域,因此变量应该被定义在函数的顶端,而不是在代码块中.

if语句根据表达式的值改变程序的控制流程.如果表达式的值为真,那么执行then代码块,否则,执行可选的else分支.

下面列出的值被当做假(false):
- false
- null
- undefined
- 空字符串’ ’
- 数字0
- 数字NaN

其他所有的值都被当作真,包括true,字符串”false”,以及所有的对象.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值