Javascript 基本概念(語法)

語法

區(qū)分大小寫

ECMAScript中的一切都區(qū)分大小寫平绩。

標識符

標識符指變量、函數(shù)邻吭、屬性、參數(shù)的名字宴霸,有如下規(guī)則:

  • 第一個字符必須是字母囱晴、下劃線或$
  • 其他字符可以是字母、下劃線猖败、$ 或數(shù)字
  • 不能把關(guān)鍵字速缆、保留字、true恩闻、false艺糜、null用作標識符
    標識符中的字符可以是擴展的ASCII或Unicode字符,但不推薦
    按照慣例幢尚,標識符采用駝峰大小寫格式

注釋

兩個斜杠//開頭表示行級注釋
/*開頭破停,以*/結(jié)尾的表示塊級注釋

嚴格模式

在腳本頂部或函數(shù)內(nèi)第一行添加如下代碼開啟嚴格模式:

"use strict;"

語句

ECMAScript語句以分號結(jié)尾,可以省略尉剩,但不推薦真慢,添加分號不僅可以降低壓縮代碼時出錯的概率,也可以提升性能(解析器不用花時間判斷哪里需要分號)

關(guān)鍵字和保留字

保留字在ECMAScript中沒有任何特定用途理茎,但將來可能被用作關(guān)鍵字黑界。
以下是ECMAScript全部的關(guān)鍵字,標注星號的是ECMAScript 5提出來的:



以下是全部保留字:


變量

ECMAScript中的變量是松散型的皂林,可以保存任何類型的數(shù)據(jù)朗鸠。
var name;在當前作用域中定義了一個名為name的局部變量,也可以在定義時順便賦值var name = 'Sue';础倍,但這樣并不會給name標注成字符串類型的變量烛占。
如果我們給一個未定義的變量賦值,非嚴格模式下,我們會創(chuàng)建一個全局變量忆家,嚴格模式下犹菇,會拋出ReferenceError
可以使用一條語句定義多個變量:

var name = 'Sue',
    age = '24';

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

ECMAScript中有5中基本數(shù)據(jù)類型:Number Boolean String Null Undefined芽卿,一種復雜數(shù)據(jù)類型:Object揭芍,所有值都是這6種類型之一。

typeof

由于ECMAScript變量是松散的卸例,因此需要一種手段來告訴我們變量存儲的值的類型沼沈,于是就有了typeof,typeof操作符可以返回如下結(jié)果:

  • "undefined" :值未定義
  • "boolean":布爾值
  • "string":字符串
  • "object":對象或null
  • "number":數(shù)值
  • "function":函數(shù)
    typeof操作符的操作數(shù)可以是變量也可以是數(shù)值字面量币厕。

有幾個地方可能會讓人迷惑:

  • typeof null時返回"object"列另,這是因為null被認為是空對象的引用
  • Safari5及之前版本、Chrome7及之前版本旦装,typeof /^d$/返回"function"页衙,其他瀏覽器返回"object"
  • function屬于object卻被區(qū)別對待,這是因為function比較特殊阴绢,有必要去識別它

Undefined類型

Undefined類型只有一個值undefined店乐,聲明時未被賦值的變量會為其賦予undefined,最初設(shè)計這個類型是為了區(qū)分空指針和未初始化變量呻袭,因此不存在需要為一個變量顯式地賦予undefined值的情況眨八。
對未初始化和未聲明的變量調(diào)用typeof都會返回undefined,這是由于這兩種都不可能執(zhí)行真正的操作左电,但為了使typeof能夠反應一個變量是否被聲明廉侧,我們最好在定義一個變量時為它賦值。

Null類型

Null類型只有一個值null篓足,它是一個空指針對象段誊,undefined派生自null,因此:

undefined == null; //true

前面提到過栈拖,不存在需要為一個變量顯式地賦值undefined的情況连舍,但我們?nèi)绻暶髁艘粋€將來要保存對象類型的變量,我們最好在這個變量被定義時給它賦予null涩哟,

Boolean類型

Boolean類型只有兩個值true false索赏,可以對任何數(shù)據(jù)類型調(diào)用Boolean(),返回結(jié)果是true or false

數(shù)據(jù)類型 轉(zhuǎn)化為true的值 轉(zhuǎn)化為false的值
Boolean true false
String 任何非空字符串 空字符串""
Number 任何非0數(shù)值 0和NaN
Object 任何非空對象 空對象null
Undefined N/A undefined

Number類型

Number類型使用IEEE754表示整數(shù)和浮點數(shù)

整數(shù)
  • 十進制整數(shù)
    var num = 55;
  • 八進制整數(shù)贴彼,第一位必須是0潜腻,然后是0~7,如果超出范圍锻弓,前導0會被忽略砾赔,后面的數(shù)值當做十進制整數(shù)解析蝌箍。嚴格模式下八進制無效青灼,會拋出錯誤暴心。
var num1 = 070; // 7*8 + 0 = 56
var num2 = 079: // 79
  • 十六進制整數(shù),前兩位是0x杂拨,后面跟0 ~ 9和A~F(or a~f)专普,如果超出范圍,會拋出錯誤弹沽。
var num = 0x15a; //1*16*16 + 5*16 + 10 = 346

在進行算術(shù)計算時檀夹,八進制和十六進制都會轉(zhuǎn)化為十進制:

var num1 = 10;
var num2 = 071;
var num3 = 0x56A;
num1 + num2; //67
num2 + num2; //114
num2 + num3; // 1553
num3 + num3; //2772
浮點數(shù)

浮點數(shù)值即數(shù)值中包含小數(shù)點,且小數(shù)點后必須有至少以為數(shù)字策橘,注意小數(shù)點前可以沒有數(shù)字炸渡,但不推薦。
由于保存浮點數(shù)需要的空間是整數(shù)的兩倍丽已,因此如果可以蚌堵,ECMAScript會將浮點數(shù)保存為整數(shù),比如:

var num1 = 1.0; // 1
var num2 = 1.; // 1

對于極大或極小的數(shù)值沛婴,可以用科學技術(shù)法表示(e或E):

var num = 2.34e6; //2.34 * Math.pow(10, 6)

在進行算術(shù)運算時吼畏,浮點數(shù)的精度遠遠不如整數(shù),會有舍入誤差嘁灯,比如:

0.1 + 0.2 // 0.30000000000000004

所以永遠不要測定某個浮點數(shù)值

數(shù)值范圍

由于內(nèi)存的限制泻蚊,ECMAScript 并不能保存世界上所有的數(shù)值。ECMAScript 能夠表示的最小數(shù)值保存在Number.MIN_VALUE 中——在大多數(shù)瀏覽器中丑婿,這個值是5e-324性雄;能夠表示的最大數(shù)值保存在Number.MAX_VALUE 中——在大多數(shù)瀏覽器中,這個值1.7976931348623157e+308羹奉。如果某次計算的結(jié)果得到了一個超出JavaScript 數(shù)值范圍的值毅贮,那么這個數(shù)值將被自動轉(zhuǎn)換成特殊的Infinity 值。具體來說尘奏,如果這個數(shù)值是負數(shù)滩褥,則會被轉(zhuǎn)換成-Infinity(負無窮),如果這個數(shù)值是正數(shù)炫加,則會被轉(zhuǎn)換成Infinity(正無窮)瑰煎。

以上引用了原文中的一段話,筆者親自試驗發(fā)現(xiàn)不是這樣俗孝,在chrome 63.0.3239.132和Microsoft Edge中打開調(diào)試工具酒甸,做了如下運算:

Number.MAX_VALUE + 1; // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 291); // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 292); // Infinity

關(guān)于Number.MIN_VALUE說的也不是很準確,準確來說赋铝,這個變量保存了最小的大于零的數(shù)值

NaN

NaN插勤, Not a Number,用于表示非數(shù)值。

  • 0 / 0 = NaN
  • 任何涉及NaN的運算都會返回NaN
  • NaN與任何數(shù)值包括NaN都不相等

可以通過isNaN()來判斷任何數(shù)據(jù)類型是否是非數(shù)值农尖,isNaN()在接收到一個參數(shù)后析恋,如果它是基本數(shù)據(jù)類型,會嘗試將其轉(zhuǎn)化為數(shù)值盛卡,如果它是object助隧,會先調(diào)用它的valueof(),再確定返回值是否能轉(zhuǎn)化成數(shù)值滑沧,如果不能并村,則基于返回值調(diào)用toString(),然后再嘗試轉(zhuǎn)化成數(shù)值滓技。

isNaN(NaN); // true
isNaN(10); // false
isNaN("10"); // false
isNaN("blue"); // true
isNaN(true); // false
isNaN([1, 2]); // true, [1, 2].valueof()返回[1, 2], [1, 2].toString() 返回 "1, 2"
isNaN([1]): // false, [1].valueof()返回[1], [1].toString() 返回 "1"

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

Number()
數(shù)據(jù)類型
Boolean true為1哩牍, false為0
Number 輸入即輸出
Null 0
Undefined 0

可以用于任何數(shù)據(jù)類型, 規(guī)則如下:

數(shù)據(jù)類型
Boolean true為1令漂, false為0
Number 輸入即輸出
Null 0
Undefined 0

String類型比較負責姐叁,規(guī)則如下:

  1. 如果只包含數(shù)字,包括前面帶正負號的情況洗显,將其轉(zhuǎn)化為數(shù)字(前導0被忽略)
  2. 如果包含有效的十六進制格式外潜,將其轉(zhuǎn)化為十進制
  3. 如果包含有效的浮點格式,將其轉(zhuǎn)化為浮點數(shù)值
  4. 空字符串轉(zhuǎn)化為0
  5. 如果以上情況均不滿足挠唆,轉(zhuǎn)化為NaN
    舉一些例子:
Number(true); // 1
Number(false); //0
Number(null); // 0
Number(undefined); //0
Number(3); // 3
Number(""); //0
Number("05"); // 5 不會把它當做八進制
Number("5.21"); //5.21
Number("0x43A"); // 1082
Number("num"); // NaN
parseInt()

parseInt()接收字符串參數(shù)处窥,有如下規(guī)則:

  • 會忽略字符串前面的空格,直至找到第一個非空格字符玄组,如果第一個非空格字符不是數(shù)字或正負號滔驾,那么返回NaN
  • 如果第一個非空格字符是數(shù)字,那么繼續(xù)解析下一個字符俄讹,直至遇到不是數(shù)字的字符或者解析完后續(xù)所有字符哆致,注意小數(shù)點并不是有效的數(shù)字字符
  • 可以識別十進制,八進制患膛,十六進制摊阀,ECMAScript 5中,需要為其傳入第二個參數(shù)指明進制踪蹬,才可以識別八進制胞此。在指明進制的情況下八進制可以不帶前導0,十六進制可以不帶0x跃捣。
    舉一些例子:
parseInt(""); //NaN
parseInt(".23); //NaN
parseInt("23.4"); //23
parseInt("23abc"); //23
parseInt("+23"); //23
parseInt("-23"); //-23
parseInt("070"); //70, ECMAScript
parseInt("0x7A"); //122
parseInt("070", 8); //56
parseInt("7A", 16); //122
parseFloat()

parseFloat() 與 parseInt() 很類似漱牵,有兩點區(qū)別:

  1. parseFloat() 字符串第一個小數(shù)點是有效的,第二個是無效的疚漆,后面的也不會解析
  2. parseFloat() 不能識別八進制和十六進制酣胀,符合八進制的字符串會忽略前導0刁赦,符合十六進制的字符串會被解析為0
  3. parseFloat() 可以識別科學計數(shù)法

舉一些例子:

parseFloat("23.24.5"); //23.24
parseFloat("3.4e5"); //340000
parseFloat("0x8A"); //0
parseFloat("045"); //45

String類型

有0或多個16位Unicode字符字符組成的字符序列,即字符串闻镶,可由單引號或雙引號表示甚脉。

轉(zhuǎn)義序列

表示非打印或有其他用途的字符

轉(zhuǎn)義序列 含義
\n 換行
\t 制表
\b 空格
\r 回車
\f 進紙
\ 斜杠
' 用于在單引號表示的字符串中顯示單引號
" 用于在雙引號表示的字符串中顯示雙引號
\xnn 以十六進制代碼nn表示的一個字符(其中n為0~F)。例如儒溉,\x41表示"A"
\unnnn 以十六進制代碼nnnn表示的一個Unicode字符(其中n為0~F)。例如发钝,\u03a3表示希臘字符Σ

轉(zhuǎn)義序列可以出現(xiàn)在字符串的任何地方顿涣,作為一個字符來解析,可以通過length屬性獲得字符串的長度

字符串的特點

var lang = "Java";
lang = lang + "Script";
以上示例中的變量lang 開始時包含字符串"Java"酝豪。而第二行代碼把lang 的值重新定義為"Java"與"Script"的組合涛碑,即"JavaScript"。實現(xiàn)這個操作的過程如下:首先創(chuàng)建一個能容納10 個字符的新字符串孵淘,然后在這個字符串中填充"Java"和"Script"蒲障,最后一步是銷毀原來的字符串"Java"和字符串"Script",因為這兩個字符串已經(jīng)沒用了瘫证。

轉(zhuǎn)化為字符串
  1. toString() Number揉阎、Boolean、Object背捌、String都有toString()方法毙籽,Number的toString()可以接收 進制參數(shù),以相應的進制格式輸出毡庆。
  2. 由于nullundefined沒有toString()方法坑赡,因此對null or undefined調(diào)用toString()會報錯,我們可以使用轉(zhuǎn)型函數(shù)String()么抗,它遵循以下規(guī)則:
  • 如果帶toString()毅否,則調(diào)用toString()
  • 如果是null, 則返回"null"
  • 如果是undefined蝇刀,則返回"undefined"

Object類型

對象就是一組數(shù)據(jù)和功能的集合螟加,可以通過new后跟要創(chuàng)建的對象類型來創(chuàng)建,比如:

var array = new Array(10);

如果沒有參數(shù)吞琐,可省略括號仰迁。
Object是所有它的實例的基礎(chǔ),每個實例都有如下屬性和方法:

  • constructor顽分,是用于創(chuàng)建對象的函數(shù)徐许,對于上述例子,是Array

函數(shù)

  • hasOwnProperty(propertyName) 給定的屬性在當前實例而非原型中是否存在卒蘸,作為參數(shù)的屬性名必須是字符串
  • isPrototypeOf(object) 檢查object是否是實例對象的原型
  • propertyIsEnumerable(propertyName) 給定的屬性是否可以使用for-in來枚舉雌隅,作為參數(shù)的屬性名必須是字符串
  • toLocaleString() 返回對象與執(zhí)行環(huán)境相對應的字符串表示
  • toString() 返回對象的字符串表示
  • valueOf() 返回對象的字符串翻默、布爾值、數(shù)值表示
    ECMAScript中對象的行為不適用于DOM恰起、BOM中的對象修械。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市检盼,隨后出現(xiàn)的幾起案子肯污,更是在濱河造成了極大的恐慌,老刑警劉巖吨枉,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹦渣,死亡現(xiàn)場離奇詭異,居然都是意外死亡貌亭,警方通過查閱死者的電腦和手機柬唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圃庭,“玉大人锄奢,你說我怎么就攤上這事【缒澹” “怎么了拘央?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長书在。 經(jīng)常有香客問我堪滨,道長,這世上最難降的妖魔是什么蕊温? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任袱箱,我火速辦了婚禮,結(jié)果婚禮上义矛,老公的妹妹穿的比我還像新娘发笔。我一直安慰自己,他們只是感情好凉翻,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布了讨。 她就那樣靜靜地躺著,像睡著了一般制轰。 火紅的嫁衣襯著肌膚如雪前计。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天垃杖,我揣著相機與錄音男杈,去河邊找鬼。 笑死调俘,一個胖子當著我的面吹牛伶棒,可吹牛的內(nèi)容都是我干的旺垒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼肤无,長吁一口氣:“原來是場噩夢啊……” “哼先蒋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宛渐,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤竞漾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窥翩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體业岁,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年鳍烁,在試婚紗的時候發(fā)現(xiàn)自己被綠了叨襟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片繁扎。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡幔荒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梳玫,到底是詐尸還是另有隱情爹梁,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布提澎,位于F島的核電站姚垃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盼忌。R本人自食惡果不足惜积糯,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谦纱。 院中可真熱鬧看成,春花似錦、人聲如沸跨嘉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祠乃。三九已至梦重,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亮瓷,已是汗流浹背琴拧。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘱支,地道東北人艾蓝。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓力崇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赢织。 傳聞我的和親對象是個殘疾皇子亮靴,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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