JavaScript中的每一個數(shù)據(jù)桃熄,都有它的類型。JS中一共有7種數(shù)據(jù)類型(包括ES6新增的symbol)恨锚。每一種數(shù)據(jù)類型所對應的數(shù)據(jù)分別是:
- number:整數(shù)跟小數(shù)(如
1
和1.23
)宇驾。 - string:文本(如
hello world
)。 - boolean:表示兩個狀態(tài)猴伶,真(
true
)與假(false
)课舍。 - null:表示空值,及此處的值為空他挎。
- undefinde:表示未定義或不存在布卡。
- object:對象屬于復雜數(shù)據(jù)類型」透牵可以細分為:
--狹義的對象(object
)
--數(shù)組(array
)
--函數(shù)(function
) - symbol:表示獨一無二的值忿等。
number
JavaScript 內(nèi)部,所有數(shù)字都是以64位浮點數(shù)形式儲存崔挖,即使整數(shù)也是如此贸街。容易造成混淆的是,某些運算只有整數(shù)才能完成狸相,此時 JavaScript 會自動把64位浮點數(shù)薛匪,轉(zhuǎn)成32位整數(shù),然后再進行運算脓鹃。
一個數(shù)在JS內(nèi)部的保存形式為:
(-1)^符號位 * 1.xx...xx(小數(shù)部分) * 2^指數(shù)部分
第1位:
- 0表示正數(shù)逸尖,1表示負數(shù)
第2-12位:
- 指數(shù)部分。指數(shù)部分共11位瘸右,意味著指數(shù)部分的最大值是2047娇跟。分出一半表示負數(shù),JavaScript 能夠表示的數(shù)值范圍為2的1024次方到2的-1023次方(開區(qū)間)太颤。
第13-64位:
- 小數(shù)部分(有效數(shù)字)苞俘。其中1不保存在JS之中,所以JS的有效數(shù)字長度位53位龄章。這意味著吃谣,絕對值小于2的53次方的整數(shù)乞封,都可以精確表示。
string
字符串就是零個或多個排在一起的字符岗憋,放在單引號或雙引號之中肃晚。
- 在字符串中是用單引號,可以使用
\
轉(zhuǎn)義字符 - 將字符串分為多行書寫仔戈,直接換行會報錯陷揪。可以使用
1 在行末加\
2 使用+
連接多個字符串 - JavaScript 使用 Unicode 字符集杂穷。JavaScript 引擎內(nèi)部悍缠,所有字符都用 Unicode 表示。
- 每個字符在 JavaScript 內(nèi)部都是以16位(即2個字節(jié))的 UTF-16 格式儲存耐量。但JavaScript 對 UTF-16 的支持是不完整的飞蚓,對于碼點在U+10000到U+10FFFF之間的字符,JavaScript 總是認為它們是兩個字符(length屬性為2)廊蜒。
boolean
boolean表示真與假兩個狀態(tài)趴拧,真用true表示,假用false表示山叮。
除了以下了六個falsy值的boolean值是false以外著榴,其余的值在JS中都被視為true。
-null
-undefined
-NaN
//(Not a Number)
-0
-''
或""
//空字符串屁倔,需要注意空數(shù)組[]
或空對象{}
是true
-false
null和undefined
null
與undefined
都可以表示“沒有”脑又,含義非常相似。在實際使用中也幾乎沒有區(qū)別锐借。
null表示空值问麸,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時钞翔,某個參數(shù)未設(shè)置任何值严卖,這時就可以傳入null,表示該參數(shù)為空布轿。比如哮笆,某個函數(shù)接受引擎拋出的錯誤作為參數(shù),如果運行過程中未出錯汰扭,那么這個參數(shù)就會傳入null稠肘,表示未發(fā)生錯誤。undefined表示“未定義”东且。
- 在if語句中
null
跟undefined
都會轉(zhuǎn)換成false -
null
轉(zhuǎn)化為數(shù)字時启具,會變成0本讥;undefined
轉(zhuǎn)為數(shù)字時珊泳,會變成NaN
object
簡單說鲁冯,對象就是一組“鍵值對”(key-value)的集合,是一種無序的復合數(shù)據(jù)集合色查。
1. 狹義的對象
- 對象的所有鍵名都是字符串薯演,加不加引號都可以。如果不加引號秧了,則鍵名必須符合標識符的規(guī)范跨扮。
- 對象的每一個鍵名又稱為“屬性”(property),它的“鍵值”可以是任何數(shù)據(jù)類型验毡。如果一個屬性的值為函數(shù)衡创,通常把這個屬性稱為“方法”。
- 如果遇到如下這種情況晶通,無法確定是對象還是代碼塊璃氢,一律解釋為代碼塊。
{ foo: 123 }
{ console.log(123) } // 123 JS認為第一行是代碼庫
//如果需要解釋位對象狮辽,可以加上圓括號
({ foo: 123 })
({ console.log(123) }) // 報錯 JS認為第一行是對象
- 讀取與賦值對象的屬性一也,有兩種方法,一種是使用點運算符喉脖,還有一種是使用方括號運算符椰苟。
- 如果使用方括號運算符,鍵名必須放在引號里面树叽,否則會被當作變量處理舆蝴。數(shù)值鍵名只能使用方括號運算符。
- 查看一個對象本身的所有屬性题诵,可以使用
Object.keys
方法须误。 -
delete
命令用于刪除對象的屬性,刪除成功后返回true
仇轻。注意京痢,即使刪除的屬性不存在,也會返回true
篷店。只有當屬性 存在但不能刪除時才會返回false
祭椰。
2. 數(shù)組
數(shù)組(array)是按次序排列的一組值。每個值的位置都有編號(從0開始)疲陕,整個數(shù)組用方括號表示方淤。
-
length
屬性的值就是等于最大的數(shù)字鍵加1。不是數(shù)字的鍵值對對length沒有影響蹄殃。 -
for...in
不僅會遍歷數(shù)組所有的數(shù)字鍵携茂,還會遍歷非數(shù)字鍵。
3. 函數(shù)
函數(shù)是一段可以反復調(diào)用的代碼塊诅岩。函數(shù)還能接受輸入的參數(shù)讳苦,不同的參數(shù)會返回不同的值带膜。typeof
會返回function
.
- JavaScript 有三種聲明函數(shù)的方法。
1 function 命令
function print(s) {
console.log(s);
}
2 函數(shù)表達式
var print = function(s) {
console.log(s);
};
//此時S作為函數(shù)名只能在函數(shù)內(nèi)部使用
//結(jié)尾要加鸳谜;
3 Function 構(gòu)造函數(shù)
var add = new Function(
'x',
'y',
'return x + y'
);
// 等同于
function add(x, y) {
return x + y;
}
// 最后一個參數(shù)才會被當作函數(shù)體膝藕,前面的都是參數(shù)。只有一個參數(shù)咐扭,該參數(shù)就是函數(shù)體芭挽。
- 如果同一個函數(shù)被多次聲明,后面的聲明就會覆蓋前面的聲明蝗肪。
- JavaScript 語言將函數(shù)看作一種值袜爪,與其它值(數(shù)值、字符串薛闪、布爾值等等)地位相同饿敲。由于函數(shù)與其他數(shù)據(jù)類型地位平等,所以在 JavaScript 語言中又稱函數(shù)為第一等公民逛绵。
- 函數(shù)執(zhí)行時所在的作用域怀各,是定義時的作用域,而不是調(diào)用時所在的作用域术浪。
- 沒有辦法只省略靠前的參數(shù)瓢对,而保留靠后的參數(shù)。如果一定要省略靠前的參數(shù)胰苏,只有顯式傳入undefined硕蛹。
- 如果有同名的參數(shù),則取最后出現(xiàn)的那個值硕并。
- 在有多個參數(shù)的情況下法焰,如果要獲得第一個參數(shù)的值,可以使用
arguments
對象倔毙。arguments[0]
就是第一個參數(shù)埃仪,arguments[1]
就是第二個參數(shù),以此類推陕赃。 - 閉包就是函數(shù)卵蛉,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。
- 閉包的最大用處有兩個么库,一個是可以讀取函數(shù)內(nèi)部的變量傻丝,另一個就是讓這些變量始終保持在內(nèi)存中,即閉包可以使得它誕生環(huán)境一直存在诉儒。
- JavaScript 引擎規(guī)定葡缰,如果function關(guān)鍵字出現(xiàn)在行首,一律解釋成語句。如果要立即調(diào)用匿名函數(shù)泛释,應該加上圓括號:
// 語句
function f() {}
// 表達式
var f = function f() {}
---------------------------------
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();