javascript語言基礎(chǔ)

ECMAScript作為核心寇漫,它規(guī)定了語言的組成部分:語法刊殉、類型殉摔、語句、關(guān)鍵字记焊、保留字逸月、操作符、全局對象遍膜。

1.語法

ECMAScript 的語法很大程度上借鑒了 C 語言和其他類 C 語言碗硬,如 Java 和 Perl。

1.1區(qū)分大小寫

首先要知道的是瓢颅,ECMAScript 中一切都區(qū)分大小寫恩尾。無論是變量、函數(shù)名還是操作符挽懦。

1.2標識符

所謂標識符翰意,就是變量、函數(shù)信柿、屬性或函數(shù)參數(shù)的名稱冀偶。標識符可以由一或多個下列字符組成:
? 第一個字符必須是一個字母、下劃線(_)或美元符號($)角塑;
? 剩下的其他字符可以是字母蔫磨、下劃線、美元符號或數(shù)字圃伶。
注意第一個字符不能使數(shù)字

按照慣例堤如,ECMAScript 標識符使用駝峰大小寫形式,例如:
myCar, firstBook窒朋。

1.3注釋

//單行注釋

/*
這是多行注釋
*/

2關(guān)鍵字與保留字

關(guān)鍵字=>js已經(jīng)賦予特殊功能的單詞搀罢。
如:

break、else侥猩、new榔至、var、 case欺劳、 finally 唧取、 return、 void 划提、 catch 枫弟、for 、switch 鹏往、 while 淡诗、 continue、 function 、this 韩容、 with 款违、default 、 if 群凶、 throw 插爹、 delete 、 in 座掘、 try 递惋、do 、 instranceof溢陪、 typeof萍虽、let、const

保留字=>>js預訂可能未來要使用的字形真。

abstract 杉编、 enum 、int 咆霜、 short 邓馒、 boolean 、export 蛾坯、interface光酣、 static、 byte 脉课、extends 救军、 long 、 super 倘零、 char 唱遭、 final 、native 呈驶、synchronized 拷泽、 class 、float 袖瞻、 package 司致、throws 、 const 聋迎、goto 脂矫、private 、transient 砌庄、 debugger 羹唠、 implements 、protected 娄昆、 volatile 佩微、 double 、import 萌焰、public

盡量不要用關(guān)鍵字或保留字來做標識符哺眯。采用駝峰以及連字符能比較好的避免意外采用關(guān)鍵字或保留字。

3 變量

有三個關(guān)鍵字可以聲明變量:var扒俯、let奶卓、const。var 在ECMAScript 的所有版本中都可以使用撼玄,而 const 和 let 只能在 ECMAScript 6 及更晚的版本中使用夺姑。

3.1 var關(guān)鍵字

定義變量可以使用var操作符(var也是關(guān)鍵字),可以先聲明再賦值掌猛,也能在聲明的時候同時初始化盏浙。

var myFavorite;//默認undefin
myFavorite = 'book';//先聲明再賦值

var myFavorite = 'book';//聲明的時候同時初始化

隨后,不僅可以改變保存的值荔茬,也可以改變值的類型:

myFavorite = 10;//10,但這么做并不推薦
3.1.1 var聲明的作用域

var聲明的作用域是函數(shù)作用域废膘,使用 var在一個函數(shù)內(nèi)部定義一個變量,就意味著該變量將在函數(shù)退出時被銷毀:

function myTest(){
var a = 10;
console.log(a);//10慕蔚,局部變量
}
console.log(a);//報錯

省略var的話

function myTest(){
 a = 10;
console.log(a);//10丐黄,全局變量
}
myTest();
console.log(a);//10

調(diào)用函數(shù)后啊才會在全局被定義。

可以一次性定義多個變量:

var a = 10,
    b = 20,
    c = 13;
3.1.2var 聲明的提升

使用 var 時孔飒,下面的代碼不會報錯灌闺。這是因為使用這個關(guān)鍵字聲明的變量會自動提升到函數(shù)作用域.
頂部:

function myTest(){
console.log(a);
var a = 10;
}
myTest();//undefined

原因是為 ECMAScript 運行時把它看成等價于如下代碼:

function myTest(){
var a ;
console.log(a);
var a = 10;
}
myTest();//undefined

3.2 let 聲明

let 與var作用差不多都可以可以先聲明再賦值十偶,也能在聲明的時候同時初始化菩鲜。最明顯的區(qū)別是,let 聲明的范圍是塊作用域惦积,而 var 聲明的范圍是函數(shù)作用域接校。

if(true) {
var a  = 10;
console.log(a)//10
}
console.log(a);//10

用let的話

if(true) {
let a  = 10;
console.log(a)//10
}
console.log(a);//報錯

此外,使用let操作符的話同一個變量名不能重復聲明狮崩。

var age;
var age;

let age;
let age;//SyntaxError,age已經(jīng)用let聲明過了蛛勉。


JavaScript 引擎會記錄用于變量聲明的標識符及其所在的塊作用域,因此嵌套使用相同的標識符不會報錯睦柴,而這是因為同一個塊中沒有重復聲明:

var a = 20;
console.log(a);//20
if(true) {
var a  = 10;
console.log(a)//10
}
var name= 'chen';
console.log(name);//chen
if(true) {
var name= 'li';
console.log(name)//'li'
}

對聲明冗余報錯不會因混用 let 和 var 而受影響诽凌。這兩個關(guān)鍵字聲明的并不是不同類型的變量,它們只是指出變量在相關(guān)作用域如何存在坦敌。(函數(shù)侣诵、塊級)

var age;
let age;//報錯

let age;
var age;//報錯
3.2.1暫時性死區(qū)(temporal dead zone)

let 聲明的變量不會在作用域中提升;

console.log(name);//chen
var name = 'chen';

console.log(name);// ReferenceError
let name = 'li';

3.2.2

與var 關(guān)鍵字不同痢法,使用var在全局作用域中聲明的變量會成為windo對象的屬性,let不會:

var name = 'aa';
console.log(window.name);//aa

let name = 'bb';
console.log(window.name)//undefined
3.2.3for循環(huán)中的let

在 let 出現(xiàn)之前杜顺,for 循環(huán)定義的迭代變量會滲透到循環(huán)體外部:

for(var i = 0; i < 5; i++) {

}
console.log(i)//5

使用let就解決了這個問題

for(let i = 0; i < 5; i++) {

}
console.log(i)//ReferenceError:

3.3 const聲明

const與let基本一致财搁,但在聲明的時候必須進行初始化,且不能修改const聲明的變量躬络;

const pig;//報錯
const age = 17;
age = 18;//TypeError,給常量賦值; 

也不允許重復聲明

const Test = 'book';
const Test = 'English';//SyntaxError

const聲明的作用域也是塊

if(true) {
const color = 'red';//red
console.log(color)
}
console.log(color)//ReferenceError

const聲明的限制只是對于它指向的變量尖奔;如果聲明的是一個對象,那么這個對象依舊是可修改的穷当。

const o = {};
o.name = 'chen';//'chen'

既然這樣就好理解接下來在for循環(huán)中用const聲明了提茁。

for(const j = 0; j < 10; j++){}//TypeError

這是因為迭代變量會自增。

如果這樣就沒問題了.

let i = 0;
for(const j = 7; i < 5; i++) {
console.log(j)//7,7,7,7,7
}

此外馁菜,

for(const key in {a:1, b: 2}) {  茴扁, ;/
console.log(key)//a,b
}
for(const key in [1,2,3]) {
console.log(key)//0,1,2
}

這樣是可行的汪疮,數(shù)組也是對象的一種丹弱。

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

ECMAScript 有六種基本數(shù)據(jù)類型(簡單數(shù)據(jù)類型):
? "undefined"表示值未定義;
? "boolean"表示值為布爾值铲咨;
? "string"表示值為字符串躲胳;
? "number"表示值為數(shù)值;
? "object"表示值為對象(而不是函數(shù))或 null纤勒;
? "function"表示值為函數(shù)坯苹;
? "symbol"表示值為符號。

還有引用數(shù)據(jù)類型(復雜數(shù)據(jù)類型)Object摇天。

3.4.1typeof

可以通過typeof來檢測數(shù)據(jù)類型粹湃。比如:

typeof 123;//"number"
typeof '123'//"string"

typeof 的返回值是字符串;

3.4.2 undefined

undefined類型只有一個值就是undefined泉坐。
當使用var或let聲明變量卻沒有初始化時为鳄,相當于給變量復制了undefined。

let message;//undefined
var information;//undefined

但是腕让,聲明還是沒聲明調(diào)用typeof都會返回undefined孤钦。

 let un;
 console.log(un); //undefined
 console.log(age); //報錯

 typeof un; //undefined
 typeof age; //undefined

建議在聲明變量的同時進行初始化(比如let num = 10)。這樣纯丸,當 typeof 返回"undefined"時偏形,你就會知道那是因為給定的變量尚未聲明(也就是啥都沒做),而不是聲明了但未初始化觉鼻。

3.4.3 null

Null 類型同樣只有一個值俊扭,即特殊值 null。邏輯上講坠陈,null 值表示一個空對象指針萨惑,這也是給typeof 傳一個 null 會返回"object"的原因:

typeof null; //'object'
null == undefined; //true

任何時候捐康,只要變量要保存對象,而當時又沒有那個對象可保存庸蔼,就要用 null 來填充該變量吹由。這樣就可以保持 null 是空對象指針的語義,并進一步將其與 undefined 區(qū)分開來朱嘴。

3.4.4 Boolean

有兩個字面值:true 和 false。
布爾值字面量 true 和 false 是區(qū)分大小寫的粗合,因此 True 和 False(及其他大小混寫形式)是有效的標識符萍嬉,但不是布爾值。

let true; // SyntaxError
let True; //undefined

此外隙疚,

let message = "Hello world!";
let messageAsBoolean = Boolean(message); //true

字符串 message 會被轉(zhuǎn)換為布爾值并保存在變量 messageAsBoolean 中壤追。
什么值能轉(zhuǎn)換為 true或 false?
當轉(zhuǎn)換的值是 ' '(空字符串)供屉、NaN行冰、null、false伶丐、undefined回懦、0這六種情況下時為假值(false);其他情況均為true冻辩。

ps: Boolean([]) == true;

3.4.5 Number

整數(shù)也可以用八進制(以 8 為基數(shù))或十六進制(以 16 為基數(shù))字面量表示。

對于八進制字面量,第一個數(shù)字必須是零(0)隧出,第二位可以是 o 或者 O(可以省略);然后是相應的八進制數(shù)字(數(shù)值 0~7)畏鼓。

let octalNum1 = 070; //8
let octalNum2 = 0o70; //8
let octalNum3 = 0O70; //8

要創(chuàng)建十六進制字面量拘悦,必須讓真正的數(shù)值前綴 0x或0X,然后是十六進制數(shù)字(0~9 以及 A~F(a-f));

let hexNum1 = 0xA; // 十六進制 10 
let hexNum2 = 0XA; // 十六進制 10 
let hexNum3 = 0xa; // 十六進制 10 
1.NaN;(not a number)

在 ECMAScript 中组题,0葫男、+0 或?0 相除會返回 NaN:

console.log(0/0); // NaN
console.log(-0/+0); // NaN 

如果分子是非 0 值,分母是有符號 0 或無符號 0

console.log(5/0); // Infinity
console.log(5/-0); // -Infinity 

NaN不等于本身

console.log(NaN == NaN); // false 

isNaN()接受一個參數(shù)并判斷其是否“不是數(shù)值”

console.log(isNaN(10)); // false崔列,10 是數(shù)值
console.log(isNaN("10")); // false梢褐,可以轉(zhuǎn)換為數(shù)值 10
console.log(isNaN("blue")); // true,不可以轉(zhuǎn)換為數(shù)值
console.log(isNaN(true)); // false赵讯,可以轉(zhuǎn)換為數(shù)值 1 
  1. 數(shù)值轉(zhuǎn)換

string "13px" => NaN; " " => 0
boolean true => 1 false => 0
null null => 0
undefined undefined => NaN
{} {} => NaN
[] [1]=>1,[]=>0,[1,2]=>NaN
function Number(function(){}) => NaN

parseInt方法
調(diào)用parseInt(),字符串最前面的空格會被忽略利职,從第一個非空格字符開始轉(zhuǎn)換。如果第一個字符不是數(shù)值字符瘦癌、加號或減號猪贪,parseInt()立即返回 NaN。

let num1 = parseInt("1234blue"); // 1234
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10讯私,解釋為十六進制整數(shù)
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70热押,解釋為十進制值
let num6 = parseInt("0xf"); // 15西傀,解釋為十六進制整數(shù)

也可以接受第二個參數(shù)

let num = parseInt("0xAF", 16); // 175 
let num1 = parseInt("AF", 16); // 175
let num2 = parseInt("AF"); // NaN 

發(fā)現(xiàn)跟直接寫

let num = 0xAF;//175

一樣。
但是第一個參數(shù)可以直接傳值;

let num1 = parseInt("10", 2); // 2桶癣,按二進制解析
let num2 = parseInt("10", 8); // 8拥褂,按八進制解析
let num3 = parseInt("10", 10); // 10,按十進制解析
let num4 = parseInt("10", 16); // 16牙寞,按十六進制解析

parseFloat
parseFloat()函數(shù)的工作方式跟 parseInt()函數(shù)類似饺鹃,但是只解析到一個小數(shù)點而第二個小數(shù)點后的數(shù)值會被省略,此外间雀,parseFloat()只解析十進制悔详。

let num1 = parseFloat("1234blue"); // 1234,按整數(shù)解析  
let num2 = parseFloat("0xA"); // 0
let num3 = parseFloat("22.5"); // 22.5
let num4 = parseFloat("22.34.5"); // 22.34
let num5 = parseFloat("0908.5"); // 908.5 
3.4.6 String

ECMAScript 中的字符串是不可變的(immutable)惹挟,意思是一旦創(chuàng)建茄螃,它們的值就不能變了。

轉(zhuǎn)換為字符串
1 连锯、toString()

let age = 11;
let ageAsString = age.toString(); // 字符串"11"
let found = true;
let foundAsString = found.toString(); // 字符串"true"

在對數(shù)值調(diào)用這個方法時归苍,toString()可以接收一個底數(shù)參數(shù),即以什么底數(shù)來輸出數(shù)值的字符串表示运怖。

let num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a" 

2拼弃、String()
String()函數(shù)遵循如下規(guī)則。
? 如果值有 toString()方法摇展,則調(diào)用該方法(不傳參數(shù))并返回結(jié)果肴敛。
? 如果值是 null,返回"null"吗购。
? 如果值是 undefined医男,返回"undefined"。

let value1 = 10;
let value2 = true;
let value3 = null;
let value4;
console.log(String(value1)); // "10"
console.log(String(value2)); // "true"
console.log(String(value3)); // "null"
console.log(String(value4)); // "undefined" 
3.4.7 Symbol
3.4.8Object

這兩個后面單獨寫吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捻勉,一起剝皮案震驚了整個濱河市镀梭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踱启,老刑警劉巖报账,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異埠偿,居然都是意外死亡透罢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門冠蒋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羽圃,“玉大人,你說我怎么就攤上這事抖剿⌒嗄” “怎么了识窿?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脑融。 經(jīng)常有香客問我喻频,道長,這世上最難降的妖魔是什么肘迎? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任甥温,我火速辦了婚禮,結(jié)果婚禮上妓布,老公的妹妹穿的比我還像新娘姻蚓。我一直安慰自己,他們只是感情好秋茫,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乃秀,像睡著了一般肛著。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跺讯,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天枢贿,我揣著相機與錄音,去河邊找鬼刀脏。 笑死局荚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的愈污。 我是一名探鬼主播耀态,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暂雹!你這毒婦竟也來了首装?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤杭跪,失蹤者是張志新(化名)和其女友劉穎仙逻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧尿,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡系奉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姑廉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缺亮。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桥言,靈堂內(nèi)的尸體忽然破棺而出瞬内,到底是詐尸還是另有隱情迷雪,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布虫蝶,位于F島的核電站章咧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏能真。R本人自食惡果不足惜赁严,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粉铐。 院中可真熱鬧疼约,春花似錦、人聲如沸蝙泼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汤踏。三九已至织鲸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間溪胶,已是汗流浹背搂擦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哗脖,地道東北人瀑踢。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像才避,于是被迫代替她去往敵國和親橱夭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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