[TOC]
# 第3章JavaScript的本質
JavaScript的性質可以總結如下:
**它是動態的**
許多事情可以改變。例如,您可以在創建對象后自由添加和刪除對象的屬性(字段)。您可以直接創建對象,而不必先創建對象工廠(例如,類)。
**它是動態類型的**
變量和對象屬性可以始終保存任何類型的值。
**它的功能和面向對象**
JavaScript支持兩種編程語言范例:函數式編程(一等函數、閉包、
通過`bind()`、內置`map()`和`reduce()`等的部分應用程序數組等)和面向對象編程(可變狀態,對象,繼承等)。
**它默默地失敗**
在 ECMAScript 3 之前,JavaScript 沒有異常處理。這就解釋了為什么語言經常會靜默地自動轉換參數和操作數的值:它最初不能拋出異常。
**它被部署為源代碼**
JavaScript 始終作為源代碼部署,并由 JavaScript 引擎編譯。源代碼具有靈活的交付格式和抽象引擎之間的差異的好處。使用兩種技術來保持文件大小:壓縮(主要是gzip)和縮小(通過重命名變量,刪除注釋等,使源代碼更小;詳見第32章)。
**它是Web平臺的一部分**
JavaScript 是 Web 平臺(HTML5 API,DOM等)的重要部分,很容易忘記,前者也可以在沒有后者的情況下使用。然而,在非瀏覽器設置(如 Node.js)中使用的 JavaScript 越多,變得越明顯。
## 古怪和非官方特性
一方面,JavaScript有幾個怪癖和缺少的功能(例如,它沒有塊范圍的變量,沒有內置的模塊,并且不支持子類化)。因此,您在哪里學習其他語言的語言功能,您將學習 JavaScript 中的模式和解決方法。另一方面,JavaScript 包括非正統特征(如原型繼承和對象屬性)。這些也必須被學習,但是比 bug 更有特色。
請注意,JavaScript 引擎已經變得非常聰明,并修復了一些怪癖。例如:
* 規范性地,JavaScript 沒有整數,只有浮點數。在內部,大多數引擎盡可能地使用整數。
* 可以說,JavaScript 中的數組太靈活了:它們不是索引的元素序列,而是從數字到元素的映射。這樣的地圖可以有空格:數組中沒有關聯值的索引“inside”。再次,如果陣列沒有孔,引擎可以幫助使用優化的表示。
## 優雅部分
但JavaScript也有很多 優雅的部分。Brendan Eich的最愛是:[ 3 ]
* First-class functions (一等函數)
* Closures(閉包)
* Prototypes(原型)
* Object literals(對象字面量)
* Array literals(數組字面量)
最后兩個項目,對象文字和數組文字,讓您從對象開始,然后介紹抽象(如構造函數,JavaScript的類似于類)。他們還啟用JSON(參見[第22章](###))。
請注意,優雅的部分可以幫助您解決問題。例如,它們允許您實現塊級作用域,模塊和繼承API - 所有這些語言。
## 影響
JavaScript是受幾種編程語言的影響(如下圖所示):

* Java 是 JavaScript 語法的角色模型。它還導致 JavaScript 將值分割為基元和對象以及 Date 構造函數(它是一個端口java.util.Date)。
* AWK 啟發了JavaScript 的函數。其實關鍵字 function 來自 AWK。
* Scheme 是JavaScript具有一等函數的原因(它們被當作值對待,可以作為函數的參數傳遞)和閉包(參見[第16章](###))。
* Self 影響了JavaScript與眾不同的面向對象的風格; 它支持對象之間的原型繼承。
* Perl 和 Python 影響了 JavaScript 對字符串,數組和正則表達式的處理。
* 除了實際的語言之外,HyperTalk 還影響了JavaScript 是如何集成到web瀏覽器中的。它導致了具有事件處理屬性的 HTML 標記,例如 onclick。
***
[ 3 ] Brendan Eich,“JavaScript簡史”,2010年7月21日,http://bit.ly/1lKkI0M。
- 本書簡介
- 前言
- 關于這本書你需要知道些什么
- 如何閱讀本書
- 目錄
- I. JavaScript的快速入門
- 第1章 基礎的JavaScript
- II. 背景知識
- 第2章 為什么選擇JavaScript?
- 第3章 JavaScript的性質
- 第4章 JavaScript是如何創造出來的
- 第5章 標準化:ECMAScript
- 第6章 JavaScript的歷史里程碑
- III. 深入JavaScript
- 第7章 JavaScript語法
- 第8章 值
- 第9章 運算符
- 第10章 布爾值
- 第11章 數字
- 第12章 字符串
- 第13章 語句
- 第14章 異常捕獲
- 第15章 函數
- 第16章 變量:作用域、環境和閉包
- 第17章 對象和繼承
- 第18章 數組
- 第19章 正則表達式
- 第20章 Date
- 第21章 Math
- 第22章 JSON
- 第23章 標準全局變量
- 第24章 編碼和JavaScript
- 第25章 ECMAScript 5中的新功能
- IV. 技巧、工具和類庫
- 第26章 元代碼樣式指南
- 第27章 調試的語言機制
- 第28章 子類化內置構造函數
- 第29章 JSDoc:生成API文檔
- 第30章 類庫
- 第31章 模塊系統和包管理器
- 第32章 其他工具
- 第33章 接下來該做什么
- 著作權