數(shù)據(jù)類型&&變量
數(shù)據(jù)類型
JavaScript共有六種數(shù)據(jù)類型(ES6新增Symbol類型的值)
- 數(shù)值(number)
- 字符串(String)
- 布爾類型(Boolean)
- undefined:
- null
- 對(duì)象(Object)
原始數(shù)據(jù)類型(值類型)
他們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。
- Number
- String
- Boolean
- Null
- 表示一個(gè)空對(duì)象指針,使用typeof操作符檢測(cè)null時(shí)會(huì)返回object谬墙。
- Undefined
- 表示一個(gè)未聲明的變量坐儿,或已聲明但沒有賦值的變量衰齐,或一個(gè)并不存在的對(duì)象屬性杏头,函數(shù)沒有返回值時(shí),默認(rèn)返回undefined楚里。
合成數(shù)據(jù)類型(引用類型)
對(duì)象是合成類型的統(tǒng)稱,一個(gè)對(duì)象有多個(gè)原始類型的值合成猎贴,可以看做是一個(gè)存放各種值的容器班缎。undefined和null是兩個(gè)特殊的值。對(duì)象是最復(fù)雜的數(shù)據(jù)類型她渴,可以分為三個(gè)子類
- Object(狹義的對(duì)象)
- 對(duì)象是一組屬性與方法的集合达址。
- Array
- 數(shù)組的每一項(xiàng)可以用來(lái)保存任何類型的數(shù)據(jù),數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的。
- Function
- 函數(shù)都是Function類型的實(shí)例趁耗,而且都與其他引用類型一樣具有屬性和方法沉唠。 創(chuàng)建函數(shù)方式
數(shù)據(jù)類型檢測(cè)
-
typeof
- Number String Boolean undefined function 可以用typeof 運(yùn)算符檢測(cè)出來(lái)。
- {} [] window null 則會(huì)返回object;
-
instanceof
該運(yùn)算符可以區(qū)分對(duì)象和數(shù)組
null&&undefined
null是一個(gè)表示“空”的對(duì)象苛败,轉(zhuǎn)為數(shù)值時(shí)為0右冻;undefined是一個(gè)表示”此處無(wú)定義”的原始值,轉(zhuǎn)為數(shù)值時(shí)為NaN
變量
函數(shù)及變量的聲明都將被提升到函數(shù)的最頂部著拭。變量可以在使用后聲明纱扭,也就是變量可以先使用再聲明。
變量計(jì)算
- 字符串拼接
- ==運(yùn)算符
- if語(yǔ)句
- 邏輯運(yùn)算
//字符串拼接
var a = 100 + 10 // 110
var b = 100 + '10' // '10010'
//==運(yùn)算符
100 == '100' // true (把數(shù)字100轉(zhuǎn)化為字符串‘100’進(jìn)行比較)
0 == '' // true (把數(shù)字0轉(zhuǎn)化為false儡遮, 把空字符串轉(zhuǎn)化為false 進(jìn)行比較)
null == undefined // true (null乳蛾、undefined轉(zhuǎn)化為false相比)
//if語(yǔ)句
var a = true
if(a){
// 可以進(jìn)入if語(yǔ)句
}
var b = 100
if(b){
// 可以進(jìn)入if語(yǔ)句, b=100轉(zhuǎn)化為了true
}
var c = ''
if(c){
// 無(wú)法進(jìn)入if語(yǔ)句鄙币, 因?yàn)閏=''轉(zhuǎn)化為了false
}
//邏輯運(yùn)算
console.log(10 && 0) //0
console.log('' || 'abc') //'abc'
console.log(!window.abc) //true
var a = 100
console.log(!!a) // true
字符串
- 字符串轉(zhuǎn)義
一個(gè)普通標(biāo)題 | 一個(gè)普通標(biāo)題 |
---|---|
\0 | null(\u0000) |
\b | 后退鍵(\u0008) |
\b | 后退鍵(\u0008) |
\f | 換頁(yè)符(\u000C) |
\n | 換行符(\u000A) |
\r | 回車鍵(\u000D) |
\t | 制表符(\u0009) |
\v | 垂直制表符(\u000B) |
' | 單引號(hào)(\u0027) |
" | 雙引號(hào)(\u0022) |
\ | 反斜杠(\u005C) |
-
反斜杠
- \HHH
反斜杠后面緊跟三個(gè)八進(jìn)制數(shù)(000到377)肃叶,代表一個(gè)字符。HHH對(duì)應(yīng)該字符的 Unicode 碼點(diǎn)十嘿,比如\251表示版權(quán)符號(hào)因惭。顯然,這種方法只能輸出256種字符绩衷。
- \xHH
\x后面緊跟兩個(gè)十六進(jìn)制數(shù)(00到FF)蹦魔,代表一個(gè)字符激率。HH對(duì)應(yīng)該字符的 Unicode 碼點(diǎn),比如\xA9表示版權(quán)符號(hào)勿决。這種方法也只能輸出256種字符乒躺。
- \uXXXX
\u后面緊跟四個(gè)十六進(jìn)制數(shù)(0000到FFFF),代表一個(gè)字符低缩。XXXX對(duì)應(yīng)該字符的 Unicode 碼點(diǎn)嘉冒,比如\u00A9表示版權(quán)符號(hào)。
字符串與數(shù)組
字符串可以被視為字符數(shù)組,可以使用數(shù)組的方括號(hào)運(yùn)算符咆繁,用來(lái)返回某個(gè)位置的字符(位置編號(hào)從0開始)
- 字符集
JavaScript 使用Unicode字符集讳推。JavaScript 引擎內(nèi)部,所有字符都用 Unicode 表示玩般。JavaScript 不僅以 Unicode 儲(chǔ)存字符娜遵,還允許直接在程序中使用 Unicode 碼點(diǎn)表示字符,即將字符寫成\uxxxx的形式壤短,其中xxxx代表該字符的 Unicode 碼點(diǎn)设拟。比如,\u00A9代表版權(quán)符號(hào)久脯。每個(gè)字符在 JavaScript 內(nèi)部都是以16位(即2個(gè)字節(jié))的 UTF-16 格式儲(chǔ)存纳胧。也就是說(shuō),JavaScript 的單位字符長(zhǎng)度固定為16位長(zhǎng)度帘撰,即2個(gè)字節(jié)跑慕。
但是,UTF-16 有兩種長(zhǎng)度:對(duì)于碼點(diǎn)在U+0000到U+FFFF之間的字符摧找,長(zhǎng)度為16位(即2個(gè)字節(jié))核行;對(duì)于碼點(diǎn)在U+10000到U+10FFFF之間的字符,長(zhǎng)度為32位(即4個(gè)字節(jié))蹬耘,而且前兩個(gè)字節(jié)在0xD800到0xDBFF之間芝雪,后兩個(gè)字節(jié)在0xDC00到0xDFFF之間。舉例來(lái)說(shuō)综苔,碼點(diǎn)U+1D306對(duì)應(yīng)的字符為??惩系,它寫成 UTF-16 就是0xD834 0xDF06。
- Base64 轉(zhuǎn)碼
文本里面包含一些不可打印的符號(hào)如筛,比如 ASCII 碼0到31的符號(hào)都無(wú)法打印出來(lái)堡牡,這時(shí)可以使用 Base64 編碼,將它們轉(zhuǎn)成可以打印的字符杨刨。另一個(gè)場(chǎng)景是晤柄,有時(shí)需要以文本格式傳遞二進(jìn)制數(shù)據(jù),那么也可以使用 Base64 編碼妖胀。所謂 Base64 就是一種編碼方法芥颈,可以將任意值轉(zhuǎn)成 0~9惠勒、A~Z、a-z浇借、+和/這64個(gè)字符組成的可打印字符。使用它的主要目的怕品,不是為了加密妇垢,而是為了不出現(xiàn)特殊字符,簡(jiǎn)化程序的處理肉康。
- JavaScript 原生提供兩個(gè) Base64 相關(guān)的方法闯估。
// btoa():任意值轉(zhuǎn)為 Base64 編碼
// atob():Base64 編碼轉(zhuǎn)為原來(lái)的值
let text = 'Hello World!';
btoa(text) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
- 不適合非 ASCII 碼的字符(中文),中文需要特殊處理
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
數(shù)值
JavaScript 內(nèi)部吼和,所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存涨薪,即使整數(shù)也是如此。所以炫乓,1與1.0是相同的刚夺,是同一個(gè)數(shù)。
-
數(shù)值范圍
根據(jù)標(biāo)準(zhǔn)末捣,64位浮點(diǎn)數(shù)的指數(shù)部分的長(zhǎng)度是11個(gè)二進(jìn)制位侠姑,意味著指數(shù)部分的最大值是2047(2的11次方減1)。也就是說(shuō)箩做,64位浮點(diǎn)數(shù)的指數(shù)部分的值最大為2047莽红,分出一半表示負(fù)數(shù),則 JavaScript 能夠表示的數(shù)值范圍為21024到2-1023(開區(qū)間)邦邦,超出這個(gè)范圍的數(shù)無(wú)法表示安吁。如果一個(gè)數(shù)大于等于2的1024次方,那么就會(huì)發(fā)生“正向溢出”燃辖,即 JavaScript 無(wú)法表示這么大的數(shù)鬼店,這時(shí)就會(huì)返回Infinity。
Math.pow(2, 1024) // Infinity
如果一個(gè)數(shù)小于等于2的-1075次方(指數(shù)部分最小值-1023黔龟,再加上小數(shù)部分的52位)薪韩,那么就會(huì)發(fā)生為“負(fù)向溢出”,即 JavaScript 無(wú)法表示這么小的數(shù)捌锭,這時(shí)會(huì)直接返回0俘陷。
Math.pow(2, -1075) // 0
JavaScript 提供Number對(duì)象的MAX_VALUE和MIN_VALUE屬性,返回可以表示的具體的最大值和最小值观谦。
Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
-
數(shù)值的表示法
可以用字面形式直接表示拉盾,比如35(十進(jìn)制)和0xFF(十六進(jìn)制)。
-
數(shù)值的進(jìn)制
使用字面量(literal)直接表示一個(gè)數(shù)值時(shí)豁状,JavaScript 對(duì)整數(shù)提供四種進(jìn)制的表示方法:十進(jìn)制捉偏、十六進(jìn)制倒得、八進(jìn)制、二進(jìn)制夭禽。
| 進(jìn)制 | 解釋 |
| ------ | ------ | ------ |
| 十進(jìn)制:| 沒有前導(dǎo)0的數(shù)值霞掺。|
| 八進(jìn)制:| 有前綴0o或0O的數(shù)值,或者有前導(dǎo)0讹躯、且只用到0-7的八個(gè)阿拉伯?dāng)?shù)字的數(shù)值菩彬。|
| 十六進(jìn)制:| 有前綴0x或0X的數(shù)值。|
| 二進(jìn)制:| 有前綴0b或0B的數(shù)值潮梯。|
對(duì)象
對(duì)象就是“鍵值對(duì)”(key-value)的集合骗灶,是一種無(wú)序的復(fù)合數(shù)據(jù)集合。
對(duì)象的引用
不同的變量名指向同一個(gè)對(duì)象秉馏,那么它們都是這個(gè)對(duì)象的引用耙旦,也就是說(shuō)指向同一個(gè)內(nèi)存地址。修改其中一個(gè)變量萝究,會(huì)影響到其他所有變量免都。
- 淺拷貝
- 深拷貝
http://www.reibang.com/p/f0a53b76ffbd
對(duì)象的操作
- 枚舉自身屬性(鍵)返回?cái)?shù)組
Object.keys(obj)
- 刪除對(duì)象屬性 返回 true||fasle
delete obj.a
delete命令只能刪除對(duì)象本身的屬性,無(wú)法刪除繼承的屬性;
- in 運(yùn)算符
in運(yùn)算符用于檢查對(duì)象是否包含某個(gè)屬性(注意帆竹,檢查的是鍵名琴昆,不是鍵值),如果包含就返回true馆揉,否則返回false业舍。不能識(shí)別哪些屬性是對(duì)象自身的,哪些屬性是繼承的升酣。
- for…in 循環(huán)
遍歷一個(gè)對(duì)象的全部屬性舷暮。
它遍歷的是對(duì)象所有可遍歷(enumerable)的屬性,會(huì)跳過(guò)不可遍歷的屬性噩茄。
它不僅遍歷對(duì)象自身的屬性下面,還遍歷繼承的屬性。(前提是繼承屬性默認(rèn)是否允許遍歷)
//hasOwnProperty() 判斷屬性是來(lái)自自身還是原型
var obj = { Id: '12313' };
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key);
}
}
函數(shù)
函數(shù)聲明
- 函數(shù)聲明
- 函數(shù)表達(dá)式
- 構(gòu)造函數(shù)
函數(shù)屬性和方法
name 返回函數(shù)名字 函數(shù)表達(dá)式則返回變量名
length 返回函數(shù)預(yù)期傳入的參數(shù)個(gè)數(shù)绩聘。
// length屬性提供了一種機(jī)制沥割,判斷定義時(shí)和調(diào)用時(shí)參數(shù)的差異,以便實(shí)現(xiàn)面向?qū)ο缶幊痰摹狈椒ㄖ剌d“(overload)凿菩。
tostring 返回一個(gè)字符串 內(nèi)容是函數(shù)源碼
函數(shù)作用域
作用域(scope)指的是變量存在的范圍机杜。在 ES5 的規(guī)范中,Javascript 只有兩種作用域:一種是全局作用域衅谷,變量在整個(gè)程序中一直存在椒拗,所有地方都可以讀取;另一種是函數(shù)作用域蚀苛,變量只在函數(shù)內(nèi)部存在在验。ES6 又新增了塊級(jí)作用域.
函數(shù)執(zhí)行時(shí)所在的作用域,是定義時(shí)的作用域堵未,而不是調(diào)用時(shí)所在的作用域腋舌。函數(shù)體內(nèi)部聲明的函數(shù),作用域綁定函數(shù)體內(nèi)部渗蟹。所以引入閉包块饺,閉包就是通過(guò)函數(shù)外部可訪問(wèn)函數(shù)內(nèi)部變量
arguments對(duì)象
arguments對(duì)象是一個(gè)偽數(shù)組,可以通過(guò)下標(biāo)訪問(wèn)拙徽,但是不能使用數(shù)組方法刨沦,需要使用call apply方法進(jìn)行綁定才能繼承數(shù)組的方法诗宣。
Array.prototype.slice.call(arguments)
- callee 屬性
返回他所對(duì)應(yīng)的原函數(shù)
閉包
作用:1. 一個(gè)是可以讀取函數(shù)內(nèi)部的變量
2.封裝對(duì)象的私有屬性和私有方法
http://www.cnblogs.com/wangfupeng1988/p/3994065.html
自執(zhí)行函數(shù)
JavaScript 引擎規(guī)定膘怕,如果function關(guān)鍵字出現(xiàn)在行首,一律解釋成語(yǔ)句召庞。因此岛心,JavaScript引擎看到行首是function關(guān)鍵字之后,認(rèn)為這一段都是函數(shù)的定義篮灼。不要讓function出現(xiàn)在行首忘古,讓引擎將其理解成一個(gè)表達(dá)式。最簡(jiǎn)單的處理诅诱,就是將其放在一個(gè)圓括號(hào)里面髓堪。
(function(){ /* code */ }())
(function(){ /* code */ }())
eval 命令
eval命令的作用是,將字符串當(dāng)作語(yǔ)句執(zhí)行娘荡。
數(shù)據(jù)類型轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換
強(qiáng)制轉(zhuǎn)換主要指使用Number干旁、String和Boolean三個(gè)函數(shù),手動(dòng)將各種類型的值炮沐,分布轉(zhuǎn)換成數(shù)字争群、字符串或者布爾值。
Number()
- 原始類型值
Number(123) 123
Number('123') // 123
Number('123a') // NaN
Number('') // 0
Number(true) // 1
Number(false) // 0
Number(undefined) // NaN
Number(null) // 0
parseInt&& Number
parseInt('123a') // 123
Number('123a') // NaN
- 對(duì)象
Number({name: "zhang"}) // NaN
Number([1, 2, 3]) // NaN
Number([1]) // 1
轉(zhuǎn)換規(guī)則
- 調(diào)用對(duì)象自身的valueOf方法大年。如果返回原始類型的值换薄,則直接對(duì)該值使用Number函數(shù)。
- 如果valueOf方法返回的還是對(duì)象翔试,則改為調(diào)用對(duì)象自身的toString方法轻要。如果toString方法返回原始類型的值,則對(duì)該值使用Number函數(shù)垦缅。
- 如果toString方法返回的是對(duì)象伦腐,就報(bào)錯(cuò)。
String()
- 原始類型值
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"
- 對(duì)象
String({name: "zhang"}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
先調(diào)用對(duì)象自身的toString方法失都。如果返回原始類型的值柏蘑,則對(duì)該值使用String函數(shù)幸冻。
如果toString方法返回的是對(duì)象,再調(diào)用原對(duì)象的valueOf方法咳焚。如果valueOf方法返回原始類型的值洽损,則對(duì)該值使用String函數(shù)。
如果valueOf方法返回的是對(duì)象革半,報(bào)錯(cuò)碑定。
- Boolean()
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false (+0 -0)都返回false
Boolean(NaN) // false
Boolean('') // false
// 其他全返回true
自動(dòng)轉(zhuǎn)換
- 不同類型的數(shù)據(jù)互相運(yùn)算。
123 + 'abc' // "123abc"
- 對(duì)非布爾值類型的數(shù)據(jù)求布爾值
if ('a') {
console.log('hello')
} // "hello"
- 對(duì)非數(shù)值類型的值使用一元運(yùn)算符(即+和-)
+ {name: 'zhang'} // NaN
- [1, 2, 3] // NaN