《數(shù)據(jù)類型&&變量》筆記

數(shù)據(jù)類型&&變量

數(shù)據(jù)類型

JavaScript共有六種數(shù)據(jù)類型(ES6新增Symbol類型的值)

  • 數(shù)值(number)
  • 字符串(String)
  • 布爾類型(Boolean)
  • undefined:
  • null
  • 對(duì)象(Object)

原始數(shù)據(jù)類型(值類型)

他們是最基本的數(shù)據(jù)類型,不能再細(xì)分了。

  1. Number
  2. String
  3. Boolean
  4. Null
    • 表示一個(gè)空對(duì)象指針,使用typeof操作符檢測(cè)null時(shí)會(huì)返回object谬墙。
  5. 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è)子類

  1. Object(狹義的對(duì)象)
    • 對(duì)象是一組屬性與方法的集合达址。
  2. Array
    • 數(shù)組的每一項(xiàng)可以用來(lái)保存任何類型的數(shù)據(jù),數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的。
  3. Function
    • 函數(shù)都是Function類型的實(shí)例趁耗,而且都與其他引用類型一樣具有屬性和方法沉唠。 創(chuàng)建函數(shù)方式

數(shù)據(jù)類型檢測(cè)

  • typeof

    1. Number String Boolean undefined function 可以用typeof 運(yùn)算符檢測(cè)出來(lái)。
    2. {} [] 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)
  • 反斜杠

    1. \HHH

    反斜杠后面緊跟三個(gè)八進(jìn)制數(shù)(000到377)肃叶,代表一個(gè)字符。HHH對(duì)應(yīng)該字符的 Unicode 碼點(diǎn)十嘿,比如\251表示版權(quán)符號(hào)因惭。顯然,這種方法只能輸出256種字符绩衷。

    1. \xHH

    \x后面緊跟兩個(gè)十六進(jìn)制數(shù)(00到FF)蹦魔,代表一個(gè)字符激率。HH對(duì)應(yīng)該字符的 Unicode 碼點(diǎn),比如\xA9表示版權(quán)符號(hào)勿决。這種方法也只能輸出256種字符乒躺。

    1. \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)化程序的處理肉康。

  1. 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!"

  1. 不適合非 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ù)聲明

  1. 函數(shù)聲明
  2. 函數(shù)表達(dá)式
  3. 構(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)

  1. 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()
  1. 原始類型值
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

  1. 對(duì)象

Number({name: "zhang"}) // NaN
Number([1, 2, 3]) // NaN
Number([1]) // 1

轉(zhuǎn)換規(guī)則
  1. 調(diào)用對(duì)象自身的valueOf方法大年。如果返回原始類型的值换薄,則直接對(duì)該值使用Number函數(shù)。
  2. 如果valueOf方法返回的還是對(duì)象翔试,則改為調(diào)用對(duì)象自身的toString方法轻要。如果toString方法返回原始類型的值,則對(duì)該值使用Number函數(shù)垦缅。
  3. 如果toString方法返回的是對(duì)象伦腐,就報(bào)錯(cuò)。
String()
  1. 原始類型值
String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"

  1. 對(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ò)碑定。

  1. Boolean()
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false (+0 -0)都返回false
Boolean(NaN) // false
Boolean('') // false
// 其他全返回true  

自動(dòng)轉(zhuǎn)換

  1. 不同類型的數(shù)據(jù)互相運(yùn)算。
123 + 'abc' // "123abc"
  1. 對(duì)非布爾值類型的數(shù)據(jù)求布爾值
if ('a') {
  console.log('hello')
}  // "hello"


  1. 對(duì)非數(shù)值類型的值使用一元運(yùn)算符(即+和-)

+ {name: 'zhang'} // NaN
- [1, 2, 3] // NaN
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末又官,一起剝皮案震驚了整個(gè)濱河市延刘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌六敬,老刑警劉巖碘赖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異外构,居然都是意外死亡普泡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門审编,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撼班,“玉大人,你說(shuō)我怎么就攤上這事垒酬∨猷遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵勘究,是天一觀的道長(zhǎng)矮湘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)乱顾,這世上最難降的妖魔是什么板祝? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮走净,結(jié)果婚禮上券时,老公的妹妹穿的比我還像新娘。我一直安慰自己伏伯,他們只是感情好橘洞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著说搅,像睡著了一般炸枣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天适肠,我揣著相機(jī)與錄音霍衫,去河邊找鬼。 笑死侯养,一個(gè)胖子當(dāng)著我的面吹牛敦跌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逛揩,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼柠傍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了辩稽?” 一聲冷哼從身側(cè)響起惧笛,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逞泄,沒想到半個(gè)月后患整,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炭懊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年并级,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拂檩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侮腹。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稻励,靈堂內(nèi)的尸體忽然破棺而出父阻,到底是詐尸還是另有隱情,我是刑警寧澤望抽,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布加矛,位于F島的核電站,受9級(jí)特大地震影響煤篙,放射性物質(zhì)發(fā)生泄漏斟览。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一辑奈、第九天 我趴在偏房一處隱蔽的房頂上張望苛茂。 院中可真熱鬧,春花似錦鸠窗、人聲如沸妓羊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)躁绸。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間净刮,已是汗流浹背剥哑。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淹父,地道東北人星持。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弹灭,于是被迫代替她去往敵國(guó)和親督暂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容