語句
JavaScript 程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行。
變量
變量是對“值”的具名引用。變量就是為“值”起名,然后引用這個名字,就等同于引用這個值。變量的名字就是變量名。
如果只是聲明變量而沒有賦值,則該變量的值是undefined。undefined是一個特殊的值,表示“無定義”。
JavaScript 是一種動態(tài)類型語言,也就是說,變量的類型沒有限制,變量可以隨時更改類型。
var a = 1;
a = 'hello';
如果使用var重新聲明一個已經(jīng)存在的變量,是無效的。
var x = 1;
var x;
x // 1
上面代碼中,變量x聲明了兩次,第二次聲明是無效的。
但是,如果第二次聲明的時候還進行了賦值,則會覆蓋掉前面的值。
var x = 1;
var x = 2;
// 等同于
var x = 1;
var x;
x = 2;
變量提升
JavaScript 引擎的工作方式是,先解析代碼,獲取所有被聲明的變量,然后再一行一行地運行。這造成的結(jié)果,就是所有的變量的聲明語句,都會被提升到代碼的頭部,這就叫做變量提升(hoisting)。
數(shù)據(jù)類型
JavaScript 語言的每一個值,都屬于某一種數(shù)據(jù)類型。JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值。)
- 數(shù)值(number):整數(shù)和小數(shù)(比如
1和3.14) - 字符串(string):文本(比如
Hello World)。 - 布爾值(boolean):表示真?zhèn)蔚膬蓚€特殊值,即
true(真)和false(假) -
undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值 -
null:表示空值,即此處的值為空。 - 對象(object):各種值組成的集合。
數(shù)值、字符串、布爾值這三種類型,合稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。
對象則稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。
至于undefined和null,一般將它們看成兩個特殊值。
對象是最復(fù)雜的數(shù)據(jù)類型,又可以分成三個子類型。
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
typeof 運算符
JavaScript 有三種方法,可以確定一個值到底是什么類型。
-
typeof運算符 -
instanceof運算符 -
Object.prototype.toString方法
typeof運算符可以返回一個值的數(shù)據(jù)類型。
數(shù)值、字符串、布爾值分別返回number、string、boolean。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
函數(shù)返回function。
function f() {}
typeof f
// "function"
undefined返回undefined。
typeof undefined
// "undefined"
利用這一點,typeof可以用來檢查一個沒有聲明的變量,而不報錯。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
上面代碼中,變量v沒有用var命令聲明,直接使用就會報錯。但是,放在typeof后面,就不報錯了,而是返回undefined。
實際編程中,這個特點通常用在判斷語句。
// 錯誤的寫法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正確的寫法
if (typeof v === "undefined") {
// ...
}
對象返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
上面代碼中,空數(shù)組([])的類型也是object,這表示在 JavaScript 內(nèi)部,數(shù)組本質(zhì)上只是一種特殊的對象。這里順便提一下,instanceof運算符可以區(qū)分?jǐn)?shù)組和對象。
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
null返回object。
typeof null // "object"
null的類型是object,這是由于歷史原因造成的。1995年的 JavaScript 語言第一版,只設(shè)計了五種數(shù)據(jù)類型(對象、整數(shù)、浮點數(shù)、字符串和布爾值),沒考慮null,只把它當(dāng)作object的一種特殊值。后來null獨立出來,作為一種單獨的數(shù)據(jù)類型,為了兼容以前的代碼,typeof null返回object就沒法改變了。