1、基本概念(1)(JS高級筆記)

一采郎、語法

1.1 區(qū)分大小寫

JS中一切(變量、函數(shù)名和操作符)都是區(qū)分大小寫的狂魔。

1.2 標(biāo)識符

標(biāo)識符可以是按照下列格式規(guī)則組合起來的一個(gè)或多個(gè)字符:

  • 第一個(gè)字符必須是一個(gè)字母蒜埋、下劃線或一個(gè)美元符號
  • 其他字符可以是字母、下劃線最楷、美元符號或數(shù)字整份。

二待错、變量

定義變量時(shí)要使用var操作符:

var message;

這里定義了一個(gè)變量,該變量可以保存任何值(像這樣未經(jīng)過初始化的變量烈评,會(huì)保存一個(gè)特殊的值——undefined)火俄,在定義的時(shí)候如果不使用var操作符,那么定義的新變量將是全局變量讲冠。

三瓜客、數(shù)據(jù)類型

ECMAScript中有五種簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Null竿开、Boolean谱仪、NumberString。還有一種復(fù)雜的數(shù)據(jù)類型——Object否彩,其本質(zhì)上是由一組無序的名值對組成的疯攒。

3.1 typeof操作符

這里typeof是用于檢測數(shù)據(jù)類型,對一個(gè)值使用typeof操作符可能返回下列某個(gè)字符串:

  • undefined”——如果這個(gè)值未定義
  • boolean”——如果這個(gè)值是布爾值
  • string”——如果這個(gè)值是字符串
  • number”——如果這個(gè)值是數(shù)值
  • object”——如果這個(gè)值是對象或null
  • function”——如果這個(gè)值是函數(shù)

3.2 Undefined類型

Undefined類型只有一個(gè)值列荔,即特殊的 undefined敬尺,使用var聲明變量但未對其加以初始化時(shí),這個(gè)變量的值就是undefined肌毅。

包含undefined值的變量與尚未定義的變量是不一樣的:

var message;
//下面這個(gè)變量并沒有聲明
//var age;

console.log(message);//undefined
console.log(age);//產(chǎn)生錯(cuò)誤

注意:對未初始化的變量執(zhí)行typeof操作符會(huì)返回undefined值筷转,而對未聲明的變量執(zhí)行typeof操作符同樣會(huì)返回undefined值。

3.3 Null類型

Null類型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型悬而,這個(gè)特殊的值就是null呜舒。使用typeof操作符檢測null會(huì)返回“object”。如果定義的變量準(zhǔn)備在將來用于保存對象笨奠,那么最好將該變量初始化為null袭蝗,而不是其他值。這樣般婆,只要檢查null值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對象的引用到腥。

if(car != null){
  //對car對象執(zhí)行某些操作
}

實(shí)際上,undefined值是派生自null值的蔚袍,所以它們是相等的:

alert(null == undefined);//true

3.4 Boolean類型

該類型有兩個(gè)字面值:truefalse(不等同于1乡范、0)。雖然此類型的字面值只有兩個(gè)啤咽,但ECMAScript中所有類型的值都有與這兩個(gè)值等價(jià)的值晋辆,要將一個(gè)值轉(zhuǎn)換為其對應(yīng)的Boolean值,可以調(diào)用轉(zhuǎn)型函數(shù)Boolean()

var message = "Hello";
var messageAsBoolean = Boolean(message);

下表給出了各種數(shù)據(jù)類型及其對應(yīng)的轉(zhuǎn)換規(guī)則:

數(shù)據(jù)類型 轉(zhuǎn)換為true的值 轉(zhuǎn)換為false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零數(shù)字值 0NaN
Object 任何對象 null
Undefined 不適用 undefined

這些轉(zhuǎn)換規(guī)則對理解流控制語句(如if語句)自動(dòng)執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換非常重要:

var message = "Hello";
if(message){//自動(dòng)轉(zhuǎn)型
  alert("Value if true");
}

3.5 Number類型

var intNum = 10;//整數(shù)

var octalNum1 = 070;//八進(jìn)制的56
var octalNum2 = 079;//無效八進(jìn)制——解析為79
var octalNum3 = 08;//無效八進(jìn)制——解析為8

var hexNum1 = 0xA;//十六進(jìn)制的10
var hexNum2 = 0x1f;//十六進(jìn)制的31

3.5.1浮點(diǎn)值

所謂浮點(diǎn)值宇整,就是該數(shù)值中必須包含一個(gè)小數(shù)點(diǎn)瓶佳,并且小數(shù)點(diǎn)后面必須至少有一位數(shù)字。雖然小數(shù)點(diǎn)前面可以沒有整數(shù)鳞青,但不推薦這種寫法霸饲。

var floatNum1 = 1.1;
var floatNum2 = 01;
var floatNum3 = .1;//不推薦

由于保存浮點(diǎn)值需要的內(nèi)存空間是保存整數(shù)值的兩倍为朋,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)值轉(zhuǎn)換為整數(shù)值:

var floatNum1 = 1.;//小數(shù)點(diǎn)后面沒有數(shù)字——解析為1
var floatNum2 = 10.0;//整數(shù)——解析為10

浮點(diǎn)值的最高精度是17位小數(shù),但在進(jìn)行算術(shù)時(shí)其精度遠(yuǎn)遠(yuǎn)不如整數(shù)厚脉,如0.10.2的結(jié)果不是0.3习寸,而是0.30000000004

if(a + b == 0.3){
  //不要這樣做
}

3.5.2 數(shù)值范圍

由于內(nèi)存限制器仗,ECMAScript能夠表示的最小數(shù)值保存在Number.MIN_VALUE中融涣,能表示的最大值保存在Number.MAX_VALUE中。如果某次計(jì)算的結(jié)果得到了一個(gè)超出JS數(shù)值范圍的值精钮,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)成特殊的Infinity值威鹿。具體來說,如果這個(gè)數(shù)值是負(fù)數(shù)轨香,則會(huì)被轉(zhuǎn)換成-Infinity(負(fù)無窮)忽你,否則將被轉(zhuǎn)換成Infinity(正無窮)。

如果某個(gè)值是Infinity(正或負(fù))臂容,那么該值將無法繼續(xù)參與下一次計(jì)算科雳。可以使用isFinite()函數(shù)來判斷某個(gè)值是否是有窮的(如果是有窮則返回true)脓杉。訪問Number.NEGATIVE_INFINITYNumber.POSITIVE_INFINITY也可以得到負(fù)和正Infinity的值糟秘。

3.5.3 NaN

  • 這個(gè)值是一個(gè)非數(shù)值,是一個(gè)特殊的數(shù)值球散,這個(gè)數(shù)值用于一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況尿赚。零除以零返回NaN,整數(shù)除以零返回Infinity蕉堰,負(fù)數(shù)除以零返回-Infinity凌净。

  • NaN本身有兩個(gè)特點(diǎn):首先,任何涉及NaN的操作都會(huì)返回NaN屋讶,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問題冰寻。其次,NaN與任何值都不相等皿渗,包括NaN本身斩芭。這里可以使用isNaN()函數(shù)幫助我們確定這個(gè)參數(shù)是否“不是數(shù)值”。此函數(shù)在接收到一個(gè)數(shù)值之后乐疆,會(huì)嘗試將這個(gè)值轉(zhuǎn)換為數(shù)值划乖。某些不是數(shù)值的值會(huì)直接轉(zhuǎn)換為數(shù)值,如字符串或布爾值诀拭。而任何不能被轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致這個(gè)函數(shù)返回true迁筛。

alert(isNaN(NaN));//true
alert(isNaN(10));//false(10是一個(gè)數(shù)值)
alert(isNaN("10"));//false(可以被轉(zhuǎn)換成10)
alert(isNaN("blue"));//true(不能轉(zhuǎn)換成數(shù)值)
alert(isNaN(true));//false(可以被轉(zhuǎn)換成1)
alert(isNaN(false));//false(可以被轉(zhuǎn)換成0)

說明:此方法確實(shí)也適用于對象煤蚌,在后面進(jìn)行說明耕挨。

3.5.4 數(shù)值轉(zhuǎn)換

有三個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()细卧、parseInt()、parseFloat()筒占。第一個(gè)函數(shù)贪庙,即轉(zhuǎn)型函數(shù)Number()可以用于任何數(shù)據(jù)類型,而另兩個(gè)函數(shù)則專門用于把字符串轉(zhuǎn)換成數(shù)值翰苫。三個(gè)函數(shù)對于同樣的輸入會(huì)有不同的結(jié)果止邮。

1、Number()函數(shù)的轉(zhuǎn)換規(guī)則

  • 如果是Boolean值奏窑,truefalse分別被轉(zhuǎn)換為10
  • 如果是數(shù)字值导披,只是簡單的傳入和返回
  • 如果是null值,返回0
  • 如果是undefined埃唯,返回NaN
  • 如果是字符串撩匕,遵循下列規(guī)則
    • 如果字符串中只包含數(shù)字(包括帶正號或負(fù)號的情況),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值墨叛。如“123”轉(zhuǎn)換為123止毕,“011”轉(zhuǎn)換為11(前導(dǎo)零被忽略)
    • 如果字符串中包含有效的浮點(diǎn)格式,如“1.1”漠趁,則將其轉(zhuǎn)換為對應(yīng)的浮點(diǎn)值(也會(huì)忽略前導(dǎo)零)
    • 如果字符串中包含有效的十六進(jìn)制格式扁凛,如“0xf”,則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值
    • 如果字符串是空的(不包含任何字符)闯传,則將其轉(zhuǎn)換為零
    • 如果字符串中包含除上述格式之外的字符谨朝,轉(zhuǎn)換為NaN
  • 如果是對象,則調(diào)用對象的valueOf()方法丸边,然后依照前面的規(guī)則轉(zhuǎn)換返回的值叠必。如果轉(zhuǎn)換的結(jié)果是NaN,則調(diào)用對象的toString()妹窖,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值纬朝。

2、parseInt()函數(shù)的轉(zhuǎn)換規(guī)則
由于Number()函數(shù)在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理骄呼,因此在處理整數(shù)的時(shí)候更常用的是parseInt()函數(shù)共苛。此函數(shù)在處理字符串時(shí),會(huì)忽略字符串前面的空格蜓萄,直至找到一個(gè)非空字符隅茎。如果第一個(gè)字符不是數(shù)字字符或負(fù)號,此函數(shù)會(huì)返回NaN嫉沽。也就是說辟犀,此函數(shù)轉(zhuǎn)換空字符串會(huì)返回NaNNumber()對空字符返回零)。如果第一個(gè)字符是數(shù)字字符绸硕,此函數(shù)會(huì)繼續(xù)解析第二個(gè)字符堂竟,直到解析完所有的后續(xù)字符或者遇到了一個(gè)非數(shù)字字符魂毁。如“123blue”會(huì)被轉(zhuǎn)換為123“22.5”出嘹、“22.1”都會(huì)被轉(zhuǎn)換為22席楚。如果字符串中第一個(gè)字符是數(shù)字字符,此函數(shù)能夠是被出各種整數(shù)的格式税稼。

var num1 = parseInt("123blue");//123
var num2 = parseInt("");//NaN
var num3 = parseInt("0xA");//10
var num4 = parseInt("22.5");//22
var num5 = parseInt("070");//56
var num6 = parseInt("70");//70

說明:ECMAScript 53中此函數(shù)對八進(jìn)制的解析存在分歧:

var num7 = parseInt("070");//ECMAScript 3認(rèn)為是56帐要,ECMAScript 5認(rèn)為是70

也就是說坛悉,ECMAScript 5中坪创,此函數(shù)已經(jīng)不具有解析八進(jìn)制的能力瞎嬉。針對這種情況,我們推薦指定基數(shù)扰肌,即指定使用哪種格式(進(jìn)制)解析:

var num1 = parseInt("AF", 16);//175
var num2 = parseInt("AF");//NaN

3铆农、parseFloat()函數(shù)的解析規(guī)則
parseInt()函數(shù)類似,此函數(shù)也是從第一個(gè)字符開始解析每個(gè)字符狡耻。也是一直解析到字符串末尾墩剖,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止。字符串中的第一個(gè)小數(shù)點(diǎn)是有效的夷狰,而后面多余的小數(shù)點(diǎn)就是無效的了岭皂,于是,后面的字符串將被忽略沼头。如“22.5.6”將被轉(zhuǎn)換為22.5爷绘。除了第一個(gè)小數(shù)點(diǎn)有效之外,此函數(shù)與parseInt()的第二個(gè)區(qū)別在于它始終都會(huì)忽略前導(dǎo)的零进倍。此函數(shù)可以識別前面討論過的所有的浮點(diǎn)數(shù)值格式土至,也包括十進(jìn)制整數(shù)格式。但十六進(jìn)制格式的字符串則始終會(huì)被轉(zhuǎn)換為零猾昆。由于此函數(shù)值解析十進(jìn)制值陶因,因此它沒有第二個(gè)參數(shù)用來指定基數(shù)的用法。如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù)(沒有小數(shù)點(diǎn)垂蜗,或者小數(shù)點(diǎn)后都是零)楷扬,此函數(shù)會(huì)返回整數(shù)。

var num1 = parseFloat("123blue");//123
var num2 = parseFloat("0xA");//0
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.5.3");//22.5
var num5 = parseFloat("0908.5");//908.5
var num6 = parseFloat("3.125e7");//31250000

3.6 String類型

字符串可以由雙引號或單引號表示贴见,但是左右引號必須匹配烘苹。

3.6.1 字符字面量

String數(shù)據(jù)類型包含一些特殊的字符字面量,也叫轉(zhuǎn)義序列片部,用于表示非打印字符镣衡,或者具有其他用途的字符。

字面量 含義
\n 換行
\t 制表
\b 空格
\r 回車
\f 進(jìn)紙
\\ \\ 斜杠
\' 單引號
\" 雙引號
\xnn 以十六進(jìn)制代碼nn表示的一個(gè)字符(其中n0~F)。例如\x41表示“A”
\unnnn 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode字符(其中n0~F)廊鸥。如\u03a3表示希臘字符Σ

這些字面量可以出現(xiàn)在字符串中的任意位置然爆,而且被當(dāng)作一個(gè)字符來解析。

3.6.2 字符串的特點(diǎn)

ECMAScript中黍图,字符串是不可變的,即字符串一旦創(chuàng)建奴烙,它們的值就不能改變助被。要改變某個(gè)變量保存的字符串,首先要銷毀原來的字符串切诀,然后用另一個(gè)包含新值的字符串填充該變量揩环。

var lang = "Java";
lang = lang + "Script";

說明:上述代碼的執(zhí)行過程是,首先創(chuàng)建一個(gè)能容納十個(gè)字符的新字符串幅虑,然后在這個(gè)字符串中填充“Java”“Script”丰滑,最后異步是銷毀原來的字符串“Java”“Script”,因?yàn)檫@兩個(gè)字符串已經(jīng)沒用了倒庵,這個(gè)過程是在后臺發(fā)生的褒墨,這也是舊版本瀏覽器中拼接字符串很慢的原因,現(xiàn)在已經(jīng)解決了擎宝。

3.6.3 轉(zhuǎn)換為字符串

要把一個(gè)值轉(zhuǎn)換為一個(gè)字符串有兩種方式郁妈。第一種是使用幾乎每個(gè)值都有的toString()方法。

var age = 11;
var ageAsString = age.toString();//"11"
var found = true;
var foundAsString = found.toString();//"true"

數(shù)值绍申、布爾值噩咪、對象和字符串值(字符串使用此方法返回其本身的一個(gè)副本)都有toString()nullundefined值沒有這個(gè)方法极阅。在多數(shù)情況下胃碾,調(diào)用此方法不用傳遞參數(shù),但是在將數(shù)字轉(zhuǎn)換為字符串時(shí)筋搏,可以傳入相關(guān)的基數(shù)仆百,而輸出的字符串可以是某個(gè)值的八進(jìn)制、十進(jìn)制(默認(rèn))奔脐、十六進(jìn)制表示儒旬。

在不知道要轉(zhuǎn)換的值是不是nullundefined的情況下,還可以使用轉(zhuǎn)型函數(shù)String()帖族,這個(gè)函數(shù)能夠?qū)⑷魏晤愋偷闹缔D(zhuǎn)換為字符串栈源,轉(zhuǎn)換規(guī)則如下:

  • 如果值有toString()方法,則調(diào)用該方法并返回相應(yīng)的結(jié)果
  • 如果值是null竖般,則返回“null”
  • 如果值是undefined甚垦,則返回“undefined”

3.7 Object類型

ECMAScript中,Object類型是所有它的實(shí)例的基礎(chǔ)。Object的每個(gè)實(shí)例都有下列屬性和方法:

  • constructor:保存用于創(chuàng)建當(dāng)前對象的函數(shù)艰亮。
  • hasOwnProperty(protoName):用于檢查給定的屬性在當(dāng)前對象中(而不是在原型中)是否存在闭翩,其中參數(shù)必須以字符串形式指定
  • isPrototypeOf(object):用于檢查傳入的對象是否是傳入對象的原型迄埃。
  • propertyIsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語句來枚舉疗韵。參數(shù)也必須以字符串形式指定。
  • toLocaleString():返回對象的字符串表示侄非,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng)
  • valueOf():返回對象的字符串蕉汪、數(shù)值或布爾值表示。通常與toString()方法的返回值相同逞怨。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末者疤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叠赦,更是在濱河造成了極大的恐慌驹马,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件除秀,死亡現(xiàn)場離奇詭異糯累,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)册踩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門寇蚊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人棍好,你說我怎么就攤上這事仗岸。” “怎么了借笙?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵扒怖,是天一觀的道長。 經(jīng)常有香客問我业稼,道長盗痒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任低散,我火速辦了婚禮俯邓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熔号。我一直安慰自己稽鞭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布引镊。 她就那樣靜靜地躺著朦蕴,像睡著了一般篮条。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吩抓,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天涉茧,我揣著相機(jī)與錄音,去河邊找鬼疹娶。 笑死伴栓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雨饺。 我是一名探鬼主播钳垮,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沛膳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起汛聚,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锹安,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后倚舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叹哭,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年痕貌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了风罩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舵稠,死狀恐怖超升,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哺徊,我是刑警寧澤室琢,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站落追,受9級特大地震影響盈滴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轿钠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一巢钓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疗垛,春花似錦症汹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阵幸。三九已至,卻和暖如春芽世,著一層夾襖步出監(jiān)牢的瞬間挚赊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工济瓢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠割,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓旺矾,卻偏偏與公主長得像蔑鹦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子箕宙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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