一.直接量(字面量)
在學(xué)習(xí)JavaScript變量之前,先認(rèn)識一下直接量(字面量)
字面量:英語叫做literals扼鞋,也做直接量蟹演。看見什么英妓,它就是什么挽放。
咱們先學(xué)習(xí)數(shù)字和字符串的字面量。剩余的字面量類型鞋拟,之后在講
1. 數(shù)字的字面量
數(shù)字的字面量骂维,就是這個數(shù)字自己,并不需要任何的符號來界定這個數(shù)字贺纲。
例如:
數(shù)字8 就是數(shù)字8 不比表示其他值,這就是字面量
但是也需要注意, 數(shù)字也有進(jìn)制問題,
1.1 整數(shù)
JavaScript中航闺,數(shù)字的整數(shù)字面量可以有三種進(jìn)制:
10進(jìn)制:普通的數(shù)字就是十進(jìn)制
8進(jìn)制:如果以0、0o猴誊、0O開頭數(shù)字字面量是八進(jìn)制潦刃,八進(jìn)制只包括數(shù)字0~7
16進(jìn)制:如果以0x,0X開頭數(shù)字字面量是十六進(jìn)制。十六進(jìn)制整數(shù)可以包含(0-9)和字母 a-f 或 A-F
1.1.1 八進(jìn)制
<scripttype="text/javascript">
//以0開頭懈叹,是八進(jìn)制乖杠;顯示的時(shí)候會以十進(jìn)制顯示console.log(017);//15 //1*8+7=15? console.log(0o17);//15console.log(0O17);//15console.log(044);//4*8+4=36 ,顯示36console.log(010);//8console.log(0o36);//30console.log(0O36);//30</script>
注意澄成,八進(jìn)制只能出現(xiàn)0~7這8中數(shù)字胧洒,如果表示不合法畏吓,那么JS將自動的認(rèn)為你輸入錯了,從而用十進(jìn)制進(jìn)行顯示:
console.log(080);//80 //以0開頭卫漫,按理說是八進(jìn)制菲饼,但是后面的數(shù)字錯了,所以以十進(jìn)制顯示
但是以0o開頭列赎、0O開頭的數(shù)字宏悦,如果后面寫錯了,控制臺報(bào)錯包吝!
// 如果是0o開頭的饼煞,后面的數(shù)字錯了,對不起诗越,不轉(zhuǎn)為10進(jìn)制了砖瞧,控制臺報(bào)錯!console.log(0o88);//報(bào)錯console.log(0O88);//報(bào)錯// 控制臺報(bào)錯//Uncaught SyntaxError: Invalid or unexpected token//語法錯誤
1.1.2 十六進(jìn)制
// 十六進(jìn)制:console.log(0xff);//255console.log(0x2b);//43
如果后面有錯誤的寫法掺喻,那么控制臺報(bào)錯:
console.log(0x2g);// 控制臺報(bào)錯//Uncaught SyntaxError: Invalid or unexpected token//語法錯誤
總結(jié):認(rèn)識下面字面量為什么進(jìn)制的數(shù)字字面量
console.log(16);// 十進(jìn)制console.log(020);// 八進(jìn)制console.log(0o20);// 八進(jìn)制console.log(0O20);// 八進(jìn)制console.log(0x10);// 十六進(jìn)制console.log(-0xf);// 十六進(jìn)制
1.2 浮點(diǎn)數(shù)(小數(shù)或指數(shù))
小數(shù)的字面量也很簡單芭届,就是數(shù)學(xué)上的點(diǎn)。計(jì)算機(jī)世界中感耙,小數(shù)稱為“浮點(diǎn)數(shù)”。
指數(shù)就是:允許使用e來表示乘以10的幾次冪:
console.log(3.1415);//3.1415console.log(.35);//.35 如果整數(shù)位數(shù)是0持隧,可以不寫console.log(5e5);//500000console.log(5.2e5);//520000console.log(1e-4);//0.0001
注意:
只有十進(jìn)制有小數(shù)的字面量即硼,八進(jìn)制、十六進(jìn)制沒有小數(shù)的字面量屡拨。所以小數(shù)沒有進(jìn)制之分
那么有個問題,JavaScript里的數(shù)字到底最大能顯示多大的數(shù)字
// 非常大的數(shù)字只酥,無窮大console.log(3e45645645645646);// 非常小的數(shù)字,負(fù)無窮大console.log(-3e45645645645646);
1.3 特殊字面量
1.3.1Infinity 無窮大
試圖輸出一個非常大的數(shù)字:
// 非常大的數(shù)字呀狼,無窮大console.log(3e45645645645646);//Infinity
至于多大的數(shù)字能生成無窮大裂允,不同瀏覽器不一樣,不要管哥艇。
可以是負(fù)的無窮大:
console.log(-5e31415926);//-Infinity
我們可以直接在控制臺輸出無窮大绝编,注意大小寫:
console.log(Infinity);
1.3.2NaN
英語全名叫做not a number,不是一個數(shù)貌踏。
比較有意思的是十饥,這個“不是一個數(shù)”他居然是一個數(shù)字字面量。
// 輸出NaNconsole.log(0/0);// NaN
1.4 總結(jié)一下祖乳,
數(shù)字字面量有整數(shù)字面量(十進(jìn)制逗堵、16進(jìn)制、八進(jìn)制)眷昆,
浮點(diǎn)數(shù)字面量(要記住e)蜒秤,
特殊字面量:Infinity汁咏,NaN
2.? 字符串的字面量
字符串是一個術(shù)語,說白了就是我們?nèi)苏f的話作媚。
2.1 字符串字面量的書寫方式
字符串的字面量有限定符攘滩,就是必須用雙引號、單引號包裹起來掂骏。字符串被限定在同種引號之間轰驳;也就是說,必須是成對單引號或成對雙引號。
console.log("今天你好帥哦");//? 字符串用雙引號包裹弟灼,或者單引號console.log("今天天氣很好");console.log('今天天氣很好');
不加引號是錯誤的
//? 不能不加引號级解,這是錯誤的:console.log(今天天氣很好);
注意引號必須是同種引號,混用錯誤
console.log('嘻嘻");
如果一個數(shù)字,用引號引起來田绑,那么就是字符串了:
console.log("兄弟勤哗,你中午吃了幾碗飯?");console.log("3");
正常情況下掩驱,引號內(nèi)部可以有不同種的引號芒划,比如雙引號里面可以有單引號:
// 雙引號中用單引號console.log("你笑起來像'花兒'一樣好看");// 單引號中用雙引號console.log('你笑起來像"花兒"一樣好看');
2.2 特殊字符
在字符串中可以使用一些特殊字符,他們有特定的含義
\n? ? New line? ? 換行符
\t? ? Tab? ? ? ? ? ? tab縮進(jìn)
//轉(zhuǎn)義字符alert("你們\n啊\n怎么可以\n那么可愛呢");
這里\反斜杠就是我們通常所說的轉(zhuǎn)義符號, 可以將沒有意義的字面n轉(zhuǎn)為有意義的換行,
同樣換行符也可以將有意義的符號轉(zhuǎn)為沒有意義的不同字符
在使用字符串中可以使用轉(zhuǎn)義字符,
'? ? 單引號
\”? ? 雙引號
\? ? 反斜杠
// 使用反斜杠\轉(zhuǎn)義字符 console.log("你笑起來像\"花兒\"一樣好看");
二.變量
變量(Variables)欧穴,和高中數(shù)學(xué)中的x民逼、y、z很像涮帘,它們此時(shí)不是字母拼苍,而是代指一些值的符號。
它和直接量不同调缨,直接量5疮鲫,就是數(shù)字5;直接量”你好”就是字符串“你好”弦叶。
現(xiàn)在這個變量不一樣了俊犯,你看見一個a,實(shí)際上它不是字母a伤哺,而是里面蘊(yùn)含的不同的值燕侠。
1. 整體了解
<scripttype="text/javascript">//定義一個變量vara;//賦值a=200;//輸出變量aconsole.log(a);// 這個語句將會引發(fā)錯誤,因?yàn)閎沒有進(jìn)行定義console.log(b);</script>
我們使用var關(guān)鍵字來定義變量默责,所謂的關(guān)鍵字就是一些有特殊功能的單詞贬循,關(guān)鍵字后面要有空格。
var就是英語variables變量的縮寫桃序,表示定義一個變量杖虾。一旦你
vara;
你的電腦內(nèi)存中,就會開辟一個空間媒熊,命名為a, 等待你給這個變量空間存放一定的值,
一旦變量聲明后,就可以給變量賦值奇适,
JS中給變量賦值用等號坟比,等號右邊的值賦給左邊。
a=200;
現(xiàn)在a變量的值就是200嚷往。所以我們輸出
console.log(a);
控制臺就會輸出a變量的值葛账,就是200
2. 變量必須先聲明,在使用
使用一個變量,必須先進(jìn)行一個var皮仁,才能使用籍琳。var這個過程可以叫做聲明declaration,也可以叫做定義definition贷祈。叫聲明一個變量,或定義一個變量.
如果變量未聲明就直接使用,會怎么樣呢,看下
console.log(n);//這個c沒有被var過,所有會報(bào)錯
因?yàn)閚沒有被聲明趋急,所以n現(xiàn)在不是一個變量,系統(tǒng)不認(rèn)識這個n的势誊。就會拋出引用錯誤呜达。
console.log(n);//Uncaught ReferenceError: n is not defined//ReferenceError? ? 引用錯誤//n is not defined? n未定義
3. 變量命名規(guī)則
變量的名字就是標(biāo)識符(identifiers),任何標(biāo)識符的命名都需要遵守一定的規(guī)則:
JS中標(biāo)識符的定義規(guī)則,可先理解為變量的規(guī)則,以后我們還會接觸到其他標(biāo)識符
由字母粟耻、下劃線(_)查近、美元($)符號、數(shù)字(0-9)組成
不能以數(shù)字開頭
也就是說挤忙,一個標(biāo)識符必須由字母霜威、下劃線、美元符號開頭册烈,后續(xù)可以有字母侥祭、下劃線、美元符號茄厘、數(shù)字
嚴(yán)格區(qū)分大小寫
所以A和a不是同一個變量
不要使用中文變量名
不能使用關(guān)鍵字和保留字
那么什么是關(guān)鍵字 和保留字呢
關(guān)鍵字=>js已經(jīng)賦予特殊功能的單詞
保留字=>js預(yù)訂可能未來要使用的字
關(guān)鍵字:
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
保留字:
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
示例:
// // 以下都是合法的變量名vara;varA;varb333;var_abc;var$;var$o0_0o$;var________;var_;// 以下都是非法的變量名var123a;var12_a;varabc@163;varabc¥;varvar;varclass;
注意: 關(guān)鍵字,保留字不用可以的去記憶, 在未來學(xué)習(xí)的過程中會接觸到一大部分關(guān)鍵字保留字,
4. 變量的賦值
變量的賦值用等號布隔,等號就是賦值符號,在JS中等號沒有其他的含義稼虎,等號就表示賦值衅檀。
vara;//定義a=200;//賦初值console.log(a);
運(yùn)行結(jié)果:200
4.1? 可以將定義和賦初值寫在一起:
vara=200;console.log(a);//200vara=100;varb=200;a=b;//在改變a變量的值,a的值變?yōu)?00霎俩。b的值不變哀军。console.log(a);console.log(b);`
4.2 變量只要var一次就可以了
變量只需要var一次,后面改變變量的值的時(shí)候打却,就不需要var了杉适,可以直接改變它的值。
vara=200;a=50;//不需要寫varconsole.log(a);//50
4.3 var后沒有復(fù)制的變量
如果一個變量柳击,僅僅被var了猿推,但是沒有被賦初值呢,此時(shí)這個變量的值就是undefined;
// 定義不賦初值捌肴,值是undefinedvarm;console.log(m);//輸出undefined
實(shí)際上我們使用var后蹬叭,就已經(jīng)定義了這個m,只不過這就是瀏覽器的一個規(guī)矩状知,如果這個變量沒有被賦初值秽五,那么這個變量就視為沒有“定義完成”。值就是undefined饥悴。就是空值的意思
5. 不寫var的情況呢
// 不寫var的時(shí)候?qū)嶋H上現(xiàn)在看不出來區(qū)別坦喘,今后就知道是一個全局變量abc=123;console.log(abc);//123
定義abc的時(shí)候沒有寫var,程序沒有報(bào)錯西设,說明這個abc變量真的已經(jīng)被定義成功了“晗常現(xiàn)在你看不出來var和不var的區(qū)別,感覺都是成功的贷揽,但是日后你就會知道,不寫其實(shí)var定義了一個全局變量坯沪,作用域是不能控制的。
知道就行,自己千萬不要這么干
6. 同時(shí)定義多個變量
定義多個變量時(shí),中間用逗號隔開
vara=7,b=9,c=10;console.log(a);console.log(b);console.log(c);
7. 變量聲明的提升
這是js特有的一個特點(diǎn)擒滑,其他語言都沒有這個特點(diǎn)。
我們現(xiàn)在先去改變變量的值叉弦,然后定義變量丐一,
由于JS有一個機(jī)制,叫做變量聲明的提升淹冰,所以現(xiàn)在程序在執(zhí)行前會已經(jīng)看見這個程序中有一行定義變量库车,所以就會提升到程序開頭去運(yùn)行。
a=200;vara;//這行定義變量會自動提升到所有語句之前console.log(a);//200
記住樱拴,js只能提升變量的聲明柠衍,而不能提升變量的賦初值
//提升只能提升變量聲明洋满,而不能提升賦初值。輸出undefinedconsole.log(a);vara=200;
等價(jià)于
vara;//自動升級console.log(a);// undefineda=200;//賦初值還留在原地
變量的傳遞
vara=1;varb=2;varc=3;a=b;//這里改變a的值珍坊,a的值變?yōu)?牺勾,b的值不變?nèi)允?b=c;//這里改變b的值,b的值變?yōu)?阵漏,c的值不變?nèi)允?c=a;//這里改變c的值驻民,c的值變?yōu)?,a的值不變?nèi)允?console.log(a);//2console.log(b);//3console.log(c);//2
8. 區(qū)分變量還是直接量
變量的時(shí)候履怯,不能加引號回还。如果變量加上引號,就變成字符串的直接量了叹洲。
vara=200;console.log("a");//avara="大家好";console.log(a);
引號是“字符串”的定界符邪锌,所以在雙引號里面的a已經(jīng)失去了變量的意思,就是一個字符串a(chǎn)廷臼。