代碼是一組告訴計算機要執行什麼任務的特殊指令。一般保存在文本文件中,也能夠在瀏覽器的開發者控制檯中直接鍵入代碼。javascript
一組單詞,數字,和執行一種具體任務的操做符構成了一個語句。語句包含了變量、字面量、操做符。例如a = b * 2;
就是一個語句,而 a、b 是變量,2是字面量,=、* 是操做符。java
一個表達式是一個引用,指向變量或值,或者一組用操做符組合的變量和值。git
2 -> 字面量表達式
b -> 變量表達式
b * 2 -> 算數表達式
a = b * 2 -> 賦值表達式
alert(a) -> 函數表達式
複製代碼
JavaScript引擎實際上在即時地自上而下的編譯程序而後當即運行編譯好的代碼。es6
內建類型有:string,number,boolean,null,undefined,symbol,object。 一般咱們能夠用 typeof 來判斷類型,可是 JS 中存在一個 bug,就是 typeof null 爲 object,這個能夠經過 Object.prototype.toString.call(null) 來進行判斷。github
'', 0, -0, NaN, null, undefined, false 轉 Boolean 爲 false,其他都是true。編程
不許確的描述:== 檢查值的等價性而 === 檢查值和類型二者的等價性。 合理的描述: == 在容許強制轉化的條件下檢查值的等價性, === 是在不容許強制轉換的條件下檢查值的等價性。promise
function foo() {
console.log( this.bar );
}
var bar = "global";
var obj1 = {
bar: "obj1",
foo: foo
};
var obj2 = {
bar: "obj2"
};
// --------
foo(); // "global"
obj1.foo(); // "obj1"
foo.call( obj2 ); // "obj2"
new foo(); // undefined
複製代碼
它的最簡單的方法是使用稱爲Object.create(..)
的內建工具。瀏覽器
var foo = {
a: 42
};
// 建立 `bar` 並將它連接到 `foo`
var bar = Object.create( foo );
bar.b = "hello world";
bar.b; // "hello world"
bar.a; // 42 <-- 委託到 `foo`
複製代碼
有兩種主要的技術能夠將新的JavaScript特性「帶到」老版本的瀏覽器中:填補和轉譯。bash
ES6定義了一個稱爲Number.isNaN(..)的工具,來爲檢查NaN值提供一種準確無誤的方法babel
if (!Number.isNaN) {
Number.isNaN = function isNaN(x) {
return x !== x;
};
}
複製代碼
ES6增長了一個稱爲「默認參數值」的新特性。
function foo(a = 2) {
console.log( a );
}
foo(); // 2
foo( 42 ); // 42
複製代碼
轉譯器會將它轉換爲老版本語法
function foo() {
var a = arguments[0] !== (void 0) ? arguments[0] : 2;
console.log( a );
}
複製代碼
JS 是「解釋型語言」所以是不被編譯的,這是錯誤的。JS 引擎在你的代碼執行的前一刻(有時是在執行期間!)編譯它。 閉包的一個重要應用是模塊模式。
最大的謬誤之一是認爲 this 關鍵字指代它所出現的函數,這是錯誤的。 this 關鍵字是根據函數如何被執行而動態綁定的。
理解強制轉換,而不是杜絕它的存在。
Prmise 是一個「將來值」的一種與時間無關的包裝,它讓你推理並組合這些將來值而沒必要關心它們是否已經準備好。另外,它們經過將回調沿着一個可信賴和可組裝的 promise 機制傳遞,有效地解決了 IoC 信任問題。 Generator給JS函數引入了一種新的執行模式,generator能夠在yield點被暫停而稍後異步地被繼續。這種「暫停-繼續」的能力讓generator在幕後異步地被處理,使看起來同步,順序執行的代碼成爲可能。如此,咱們就解決了回調的非線性,非本地跳轉的困惑,並所以使咱們的異步代碼看起來是更容易推理的同步代碼。
不少值得一讀的激動人心的ES6特性:結構,參數默認值,symbol,簡潔方式,計算屬性,箭頭函數,塊兒做用域,promise,generator,iterator,模塊,代理,weakmap等。 JavaScript 的將來是光明的。