JavaScript簡(jiǎn)介
1.JavaScript用途
前端三層:
- 結(jié)構(gòu)層 HTML(從語(yǔ)義的角度描述頁(yè)面的結(jié)構(gòu))
- 樣式層 CSS(從審美的角度裝飾頁(yè)面)
- 行為層 JavaScript (從交互的角度提升用戶(hù)體驗(yàn))
JavaScript用來(lái)制作web頁(yè)面交互效果练般,提升用戶(hù)體驗(yàn)谎碍。
JavaScript在今天甜害,如果你要離開(kāi)他,寸步難行澜建,網(wǎng)頁(yè)將無(wú)法正常使用。
2.JavaScript誕生
在1995 年 Netscape,一位名為 Brendan Eich 的工程師創(chuàng)造了 JavaScript块饺,隨后在 1996 年初拌滋,JavaScript 首先被應(yīng)用于 Netscape 2 瀏覽器上朴沿。最初的 JavaScript 名為 LiveScript(活力腳本),后來(lái)因?yàn)?Sun Microsystem 的 Java 語(yǔ)言的興起和廣泛使用鸠真,Netscape 出于宣傳和推廣的考慮悯仙,將它的名字從最初的 LiveScript 更改為 JavaScript——盡管兩者之間并沒(méi)有什么共同點(diǎn)。這便是之后混淆產(chǎn)生的根源吠卷。
幾個(gè)月后锡垄,Microsoft 隨著 IE 3 推出了一個(gè)與之基本兼容的語(yǔ)言 JScript(注意微軟的人生哲學(xué),當(dāng)它發(fā)現(xiàn)別人的東西很好的時(shí)候祭隔,就必須擰巴的推出自己的货岭,然后自己的又被市場(chǎng)排斥路操,又開(kāi)始兼容別人的)。又幾個(gè)月后千贯,Netscape 將 JavaScript 提交至 Ecma
International(一個(gè)歐洲標(biāo)準(zhǔn)化組織)屯仗, ECMAScript 標(biāo)準(zhǔn)第一版便在 1997 年誕生了,隨后在 1999 年以 ECMAScript 第三版的形式進(jìn)行了更新搔谴,從那之后這個(gè)標(biāo)準(zhǔn)沒(méi)有發(fā)生過(guò)大的改動(dòng)魁袜。由于委員會(huì)在語(yǔ)言特性的討論上發(fā)生分歧,ECMAScript 第四版尚未推出便被廢除敦第,但隨后于 2009 年 12 月發(fā)布的 ECMAScript 第五版引入了第四版草案加入的許多特性峰弹。第六版標(biāo)準(zhǔn)已經(jīng)于2015年六月發(fā)布。
ECMAScript是JavaScript的標(biāo)準(zhǔn)芜果,現(xiàn)在我們學(xué)習(xí)的版本的ECMAScript4鞠呈、5。
3.JavaScript從丑小鴨到金鳳凰
2003年:牛皮鮮右钾,頁(yè)面上漂浮的廣告蚁吝、彈窗廣告;所以當(dāng)時(shí)的瀏覽器就推出一個(gè)功能舀射,禁用廣告窘茁,實(shí)際上本質(zhì)就是禁用JavaScript。頁(yè)面上的特效后控,都特別俗庙曙,比如鼠標(biāo)后面跟隨的星星,然后工程師對(duì)JS的感覺(jué)就是不用學(xué)習(xí)浩淘,生搬硬套捌朴,大量的“效果寶盒”軟件,一套就有各種特效了张抄。沒(méi)有人琢磨語(yǔ)言特性砂蔽。
2004年:谷歌打開(kāi)了Ajax這個(gè)潘多拉的盒子,從此JavaScript被人重視署惯,很多人開(kāi)始學(xué)習(xí)JS語(yǔ)言左驾。當(dāng)時(shí)問(wèn)世了兩本JS巨作《犀牛書(shū)》、《高級(jí)程序設(shè)計(jì)》极谊。
2007年:三層分離诡右,iPhone發(fā)布,人們開(kāi)始重視用戶(hù)體驗(yàn)轻猖。大家發(fā)現(xiàn)了帆吻,JavaScript是web頁(yè)面中制作交互效果唯一的語(yǔ)言,所以把JS的重視程度咙边,提到了相當(dāng)高的一個(gè)地位猜煮。招聘信息里面開(kāi)始出現(xiàn)獨(dú)立的“JS工程師”職位了次员,之前都是后臺(tái)工程師捎帶腳寫(xiě)寫(xiě)JS。
2008年:Chrome瀏覽器發(fā)布王带,V8引擎加快了JS的解析淑蔚,之前的瀏覽器解析JS的時(shí)候卡頓卡頓的,動(dòng)畫(huà)效果是蹦蹦的愕撰。在Chrome里刹衫,它的引擎叫做V8,運(yùn)行JS很流暢盟戏。
2009年:jQuery變得流行绪妹,解決了瀏覽器兼容問(wèn)題,制作頁(yè)面效果變得簡(jiǎn)單柿究,越來(lái)越多的初學(xué)者愿意學(xué)習(xí)JavaScript。
2010年:Canvas畫(huà)布技術(shù)得到眾多瀏覽器支持黄选,可以用Canvas替代Flash了蝇摸,并且能制作小游戲,比如偷菜办陷、停車(chē)小游戲貌夕。我們有這個(gè)課程,做Flappy Bird民镜、俄羅斯方塊啡专、消消樂(lè)、接觸物理拋物線引擎制圈。
2011年:Node.js得到廣泛應(yīng)用们童,實(shí)際上就是把JavaScript運(yùn)行在了服務(wù)器上,單線程非阻塞鲸鹦,能夠讓企業(yè)用最小的成本實(shí)現(xiàn)后臺(tái)網(wǎng)站慧库,比如之前4萬(wàn)的服務(wù)器都卡,現(xiàn)在用了node之后馋嗜,4000的機(jī)器都很流暢齐板。
2012年:HTML5+CSS3的流行,也帶火了JavaScript葛菇。
2013年: hybrid app模式開(kāi)始流行甘磨。就是做手機(jī)app的時(shí)候,老板們發(fā)現(xiàn)要雇傭三隊(duì)人馬眯停,iOS济舆、Android、window phone庵朝÷鹪花三份工資又厉,并且產(chǎn)品還不好迭代。所以人們發(fā)明了用網(wǎng)頁(yè)技術(shù)開(kāi)發(fā)手機(jī)App的技術(shù)椎瘟,叫做web app覆致。hybrid app就是混合app,同時(shí)結(jié)合web技術(shù)和原生開(kāi)發(fā)技術(shù)肺蔚。省錢(qián)煌妈,好迭代。
2015年:ECMA6發(fā)布宣羊,叫做ECMA2015璧诵。重量級(jí)的改變,把語(yǔ)言的特性顛覆性的一個(gè)增強(qiáng)仇冯。
4.JavaScript非常好學(xué)
好學(xué)的點(diǎn)是什么:
- JavaScript是有界面效果:不像C語(yǔ)言之宿,黑底白字,很枯燥的苛坚。
- JavaScript的語(yǔ)法來(lái)源于C和Java:有C和Java的經(jīng)驗(yàn)同學(xué)好學(xué)很多比被。
- JavaScript是弱變量類(lèi)型的語(yǔ)言,動(dòng)態(tài)數(shù)據(jù)類(lèi)型語(yǔ)言泼舱。
- JavaScript運(yùn)行在宿主環(huán)境中等缀,不關(guān)心內(nèi)存,垃圾回收娇昙。
不好學(xué)的點(diǎn)是什么:
- 兼容性問(wèn)題: IE8是個(gè)怪胎尺迂,很多東西都不一樣,所以就要寫(xiě)兼容寫(xiě)法冒掌,不怕造輪子噪裕,多寫(xiě)幾遍
- 花式寫(xiě)法很多,抽象:從簡(jiǎn)單入手宋渔,細(xì)細(xì)品味代碼
- 太多細(xì)節(jié):為知筆記認(rèn)真寫(xiě)自己的筆記州疾,自己做實(shí)驗(yàn);
5.學(xué)習(xí)方法
- 要多去“品”程序,多去思考內(nèi)在邏輯皇拣,讀懂每一行代碼严蓖!
- JS機(jī)械重復(fù)性的勞動(dòng)幾乎為0,基本都是創(chuàng)造性的勞動(dòng)氧急。HTML颗胡、CSS都是重復(fù)的勞動(dòng),margin吩坝、padding擠來(lái)擠去毒姨。
- 永遠(yuǎn)不要背程序,每一個(gè)程序都必須自己會(huì)寫(xiě)钉寝,有一個(gè)每天的作業(yè)弧呐,重復(fù)老師的上課案例闸迷。
Hello World!
這事兒吧俘枫,挺有意思腥沽,就是學(xué)習(xí)任何的語(yǔ)言,我們都喜歡在屏幕上直接輸出一點(diǎn)什么鸠蚪,當(dāng)做最簡(jiǎn)單今阳、最基本的案例。輸出什么大家隨意茅信,但是很多人都習(xí)慣輸出ldquo;hello worldrdquo;盾舌,世界你好。感覺(jué)自己很有情懷的樣子蘸鲸。
1.JavaScript書(shū)寫(xiě)的位置
<script type="text/javascript">
alert("Hello World!");
</script>
JavaSript程序妖谴,要寫(xiě)在HTML頁(yè)面中,運(yùn)行頁(yè)面的時(shí)候酌摇,這個(gè)頁(yè)面上的JS也就一起運(yùn)行了窖维。也就是說(shuō),js的運(yùn)行必須有宿主環(huán)境妙痹,最最常見(jiàn)的宿主環(huán)境,就是瀏覽器鼻疮。
JS寫(xiě)在<script>標(biāo)簽對(duì)兒里面怯伊,type屬性就是類(lèi)型,text/javascript就是純文本的javascript判沟;注意耿芹,這個(gè)type必須寫(xiě)準(zhǔn)確,可以不寫(xiě)挪哄,但是要寫(xiě)吧秕,一定要寫(xiě)準(zhǔn)確,否則失效迹炼。
2.alert()語(yǔ)句
alert就是英語(yǔ)中“警報(bào)”的意思砸彬,能夠讓頁(yè)面彈出警告框。
實(shí)際上這條語(yǔ)句斯入,在運(yùn)行一個(gè)內(nèi)置函數(shù)砂碉,運(yùn)行函數(shù)就要加圓括號(hào)。不要糾結(jié)這個(gè)東西刻两,學(xué)習(xí)所有的程序增蹭,都是從模仿開(kāi)始的。前期磅摹,不要去糾結(jié)語(yǔ)法的機(jī)理是什么滋迈,只需要進(jìn)行模仿霎奢。你只需要知道,你模仿了饼灿,你就能實(shí)現(xiàn)效果幕侠。隨著課程的深入,你將知道每條語(yǔ)句的確切機(jī)理赔退。
alert("你好俺纫馈!");
這是一條語(yǔ)句硕旗,每條語(yǔ)句之后用;結(jié)尾窗骑。注意,所有的符號(hào)都是英文的符號(hào)漆枚,不要使用中文创译!
程序是順序執(zhí)行的,任何程序都是這樣墙基。
語(yǔ)句都要遵循語(yǔ)法软族,alert的語(yǔ)法比較簡(jiǎn)單,就是后面的圓括號(hào)残制。
3.控制臺(tái)
控制臺(tái)是Chrome瀏覽器“檢查”里面的功能立砸,快捷鍵是F12。英文叫做console初茶。
程序的所有未捕獲的錯(cuò)誤颗祝,都會(huì)在控制臺(tái)中輸出∧詹迹控制臺(tái)是調(diào)試程序的一個(gè)利器螺戳。
比如下面的語(yǔ)句用了中文的符號(hào),有語(yǔ)法錯(cuò)誤:
alert(“你好”)折汞;
有些時(shí)候我們想在控制臺(tái)中自己輸出點(diǎn)什么倔幼,那么就要使用語(yǔ)句:
console.log();
console就是控制臺(tái),log就是日志的意思爽待,這里是動(dòng)詞损同,表示打印。
還是那句話堕伪,只需要模仿就行了揖庄,后面的課程你將知道console是一個(gè)內(nèi)置對(duì)象,log是它的一個(gè)方法欠雌。
比如:
console.log("你好啊");
養(yǎng)成打開(kāi)控制臺(tái)調(diào)試程序的習(xí)慣蹄梢。
4.行文特性
JavaScript語(yǔ)句和語(yǔ)句之間的換行、空格、縮進(jìn)都不敏感禁炒。
<script type="text/javascript">
alert("你好");alert("帥");
alert("哈哈哈哈");
</script>
等價(jià)于:
<script type="text/javascript">
alert("你好");
alert("帥");
alert("哈哈哈哈");
</script>
語(yǔ)句后面的分號(hào)而咆,不是必須寫(xiě)的,如果語(yǔ)句是一行一行寫(xiě)的幕袱,那么分號(hào)是沒(méi)有必要的暴备。但是壓縮頁(yè)面的時(shí)候,語(yǔ)句結(jié)尾的分號(hào)们豌,非常重要涯捻。
我們把頁(yè)面做好之后,通常都會(huì)進(jìn)行壓縮望迎,用軟件把所有的空格障癌、換行都去掉。此時(shí)辩尊,語(yǔ)句末尾的分號(hào)顯得非常重要涛浙,如果去掉分號(hào),將不能執(zhí)行摄欲。
不能執(zhí)行:
<script type="text/javascript">
alert("你好")alert("帥")alert("哈哈哈哈")
</script>
正確寫(xiě)法:
<script type="text/javascript">
alert("你好");alert("帥");alert("哈哈哈哈");
</script>
5.注釋
給人看的東西轿亮,對(duì)讀程序是一個(gè)提示作用。復(fù)習(xí)一下HTML的注釋?zhuān)?br>
``
CSS注釋?zhuān)?br>
/*我是注釋*/
JavaScript里面的注釋?zhuān)?br> 單行注釋?zhuān)?/p>
<script type="text/javascript">
//我是一行注釋
//再來(lái)一行
alert("你好");
</script>
或者多行注釋?zhuān)?/p>
/*
我是一行注釋
再來(lái)一行
哈哈胸墙,我又寫(xiě)了一行
*/
注釋的符號(hào)我注,不能嵌套,錯(cuò)誤的示范:
/*
我是一行注釋
/*
*/
再來(lái)一行
哈哈迟隅,我又寫(xiě)了一行
*/
sublime中注釋的快捷鍵仓手,就是ctrl+/
字面量
字面量:英語(yǔ)叫做literals,有些書(shū)上叫做直接量玻淑。看見(jiàn)什么呀伙,它就是什么补履。
我們先來(lái)學(xué)習(xí)數(shù)字的字面量,和字符串的字面量剿另。剩余的字面量類(lèi)型箫锤,我們?nèi)蘸笥鲆?jiàn)再介紹。
1.數(shù)字的字面量
數(shù)字的字面量雨女,就是這個(gè)數(shù)字自己谚攒,并不需要任何的符號(hào)來(lái)界定這個(gè)數(shù)字。
JavaScript中氛堕,數(shù)字的字面量可以有三種進(jìn)制:
- 10進(jìn)制:普通的數(shù)字就是十進(jìn)制
- 8進(jìn)制:如果以0開(kāi)頭馏臭、或者以0o開(kāi)頭、或者以0O開(kāi)頭的都是八進(jìn)制讼稚,八進(jìn)制只能用0~7來(lái)表示
- 16進(jìn)制:如果以0x開(kāi)頭的都是十六進(jìn)制括儒。
八進(jìn)制舉例:
<script type="text/javascript">
//以0開(kāi)頭绕沈,所以就是八進(jìn)制;顯示的時(shí)候會(huì)以十進(jìn)制顯示
//3*8+6=30
console.log(036); //30
console.log(044); //36
console.log(010); //8
console.log(0o36); //30
console.log(0O36); //30
</script>
運(yùn)行結(jié)果:
注意帮寻,八進(jìn)制只能出現(xiàn)0~7這8中字符乍狐,如果表示不合法,那么JS將自動(dòng)的認(rèn)為你輸入錯(cuò)了固逗,從而用十進(jìn)制進(jìn)行顯示:
console.log(088); //以0開(kāi)頭浅蚪,按理說(shuō)是八進(jìn)制,但是后面的數(shù)字錯(cuò)了烫罩,所以以十進(jìn)制顯示
但是以0o開(kāi)頭惜傲、0O開(kāi)頭的數(shù)字,如果后面寫(xiě)錯(cuò)了嗡髓,控制臺(tái)報(bào)錯(cuò)操漠!
console.log(0o88)
再看一下16進(jìn)制:
console.log(0xff);
console.log(0x2b);
console.log(0x11);
運(yùn)行結(jié)果:
如果后面有錯(cuò)誤的寫(xiě)法,那么控制臺(tái)報(bào)錯(cuò):
console.log(0x2m);
[圖片上傳失敗...(image-d75f-1566032897161)]
總結(jié)一下饿这,下面的輸出結(jié)果都是15:
console.log(15);
console.log(017);
console.log(0o17);
console.log(0O17);
console.log(0xf);
下面的輸出結(jié)果都是負(fù)15:
console.log(-15);
console.log(-017);
console.log(-0o17);
console.log(-0O17);
console.log(-0xf);
小數(shù)的字面量也很簡(jiǎn)單浊伙,就是數(shù)學(xué)上的點(diǎn)。計(jì)算機(jī)世界中长捧,小數(shù)稱(chēng)為“浮點(diǎn)數(shù)”嚣鄙。
允許使用e來(lái)表示乘以10的幾次冪:
console.log(-3.1415926); //-3.1415926
console.log(.315); //.315 如果整數(shù)位數(shù)是0,可以不寫(xiě)
console.log(5e5); //500000
console.log(5.6e5); //560000
console.log(1e-4); //0.0001
console.log(.1e-3); //0.0001
只有十進(jìn)制有小數(shù)的字面量串结,八進(jìn)制哑子、十六進(jìn)制沒(méi)有小數(shù)的字面量。
最后學(xué)習(xí)兩個(gè)特殊的字面量:
Infinity 無(wú)窮大
試圖輸出一個(gè)非常大的數(shù)字:
console.log(3e45645645645645);
控制臺(tái)顯示Infinity
表示無(wú)窮大
至于多大的數(shù)字能生成無(wú)窮大肌割,不同瀏覽器不一樣卧蜓,不要管。
可以是負(fù)的無(wú)窮大:
console.log(-3e45645645645645);
控制臺(tái)顯示-Infinity
表示負(fù)的無(wú)窮大
我們可以直接在控制臺(tái)輸出無(wú)窮大把敞,注意大小寫(xiě):
console.log(Infinity);
NaN英語(yǔ)全名叫做not a number弥奸,不是一個(gè)數(shù)。比較哲學(xué)的是奋早,這個(gè)“不是一個(gè)數(shù)”是一個(gè)數(shù)字字面量盛霎。
console.log(0/0);
總結(jié)一下,數(shù)字字面量有整數(shù)字面量(十進(jìn)制耽装、16進(jìn)制愤炸、八進(jìn)制),浮點(diǎn)數(shù)字面量(要記住e)掉奄,Infinity规个,NaN
2.字符串
字符串是一個(gè)術(shù)語(yǔ),就是人類(lèi)說(shuō)的語(yǔ)句、詞绰姻。
字符串的字面量枉侧,必須用雙引號(hào)、單引號(hào)包裹起來(lái)狂芋。字符串被限定在同種引號(hào)之間榨馁;也即,必須是成對(duì)單引號(hào)或成對(duì)雙引號(hào)帜矾。
console.log("今天天氣很好");
// 必須是同種引號(hào)翼虫,這是錯(cuò)誤的:
console.log('哈哈");
如果一個(gè)數(shù)字,用引號(hào)引起來(lái)屡萤,那么就是字符串了:
console.log(“3”);
轉(zhuǎn)義字符珍剑,
\n
回車(chē)換行
\t
tab縮進(jìn)
alert("你好\n啊\n我很愛(ài)你\n啊");
引號(hào)的轉(zhuǎn)譯:
正常情況下,引號(hào)內(nèi)部可以有不同種的引號(hào)死陆,比如雙引號(hào)里面可以有單引號(hào):
console.log("老師說(shuō)你像'考拉'一樣漂亮");
console.log('老師說(shuō)你像"考拉"一樣漂亮');
可以用\” 來(lái)表達(dá)引號(hào):
console.log("老師說(shuō)你像\"考拉\"一樣漂亮");
反斜杠自己也用反斜杠來(lái)轉(zhuǎn)義:
console.log("c:\\a\\b.jpg");
變量
變量(Variables)招拙,和高中代數(shù)學(xué)習(xí)的x、y措译、z很像别凤,它們不是字母,而是蘊(yùn)含值的符號(hào)领虹。
它和直接量不同规哪,直接量5,就是數(shù)字5塌衰;直接量”你好”就是字符串“你好”∷呱裕現(xiàn)在這個(gè)變量不一樣了,你看見(jiàn)一個(gè)a最疆,實(shí)際上它不是字母a杯巨,而是里面蘊(yùn)含的不同的值。
1.整體感知
<script type="text/javascript">
//定義一個(gè)變量
var a;
//賦值
a = 100;
//輸出變量a
console.log(a);
</script>
我們使用var關(guān)鍵字來(lái)定義變量努酸,所謂的關(guān)鍵字就是一些有特殊功能的小詞語(yǔ)舔箭,關(guān)鍵字后面要有空格。
var就是英語(yǔ)variables變量的縮寫(xiě)蚊逢,表示定義一個(gè)變量。一旦你var a;
你的電腦內(nèi)存中箫章,就會(huì)開(kāi)辟一個(gè)空間烙荷,來(lái)存儲(chǔ)這個(gè)變量a。
現(xiàn)在就可以給這個(gè)變量賦值檬寂,JS中給變量賦值用等號(hào)终抽,等號(hào)右邊的值賦給左邊。
a = 100;
現(xiàn)在a變量的值就是100。所以我們輸出
console.log(a);
控制臺(tái)就會(huì)輸出a變量的值昼伴,就是100匾旭。
2.量必須先聲明,才能使用
使用一個(gè)變量圃郊,必須先進(jìn)行一個(gè)var价涝,才能使用。var這個(gè)過(guò)程可以叫做聲明declaration持舆,也可以叫做定義definition色瘩。
現(xiàn)在我們直接運(yùn)行語(yǔ)句:
console.log(b); //這個(gè)b沒(méi)有被var過(guò),所以要報(bào)錯(cuò)
因?yàn)閎沒(méi)有被定義逸寓,所以b現(xiàn)在不是一個(gè)變量居兆,系統(tǒng)不認(rèn)識(shí)這個(gè)b的。拋出引用錯(cuò)誤竹伸。
變量的名稱(chēng)是標(biāo)識(shí)符(identifiers)泥栖,任何標(biāo)識(shí)符的命名都需要遵守一定的規(guī)則:
在JavaScript語(yǔ)言中,一個(gè)標(biāo)識(shí)符(identifier)可以由字母勋篓、下劃線(_)吧享、美元($)符號(hào)、數(shù)字(0-9)組成生巡,但不能以數(shù)字開(kāi)頭耙蔑。也就是說(shuō),一個(gè)標(biāo)識(shí)符必須由字母孤荣、下劃線甸陌、美元符號(hào)開(kāi)頭,后續(xù)可以有字母盐股、下劃線钱豁、美元符號(hào)、數(shù)字疯汁。因?yàn)镴avaScript語(yǔ)言是區(qū)分大小寫(xiě)的牲尺,所以A和a不是同一個(gè)變量。并且不能是JavaScript保留字幌蚊、關(guān)鍵字谤碳。
保留字,是系統(tǒng)里面的有用途的字溢豆,為了不造成誤會(huì)蜒简,不能成為標(biāo)識(shí)符的名字。
保留字漩仙,不用背:
abstract搓茬、boolean犹赖、byte、char卷仑、class峻村、const、debugger锡凝、double粘昨、enum、export私爷、extends雾棺、fimal、float
goto衬浑、implements捌浩、import、int工秩、interface尸饺、long、mative助币、package浪听、private、protected眉菱、public迹栓、short、static俭缓、super克伊、synchronized、throws华坦、transient愿吹、volatile
合法變量名的舉例:
// 以下都是合法的變量名
var a;
var A;
var b333;
var _abc;
var $;
var $o0_0o$;
var ________;
var _;
非法的:
var 123a; //不能數(shù)字開(kāi)頭
var 12_a; //不能數(shù)字開(kāi)頭
var abc@163; //不能有特殊符號(hào),符號(hào)只能有_和$
var abc¥; //不能有特殊符號(hào)惜姐,符號(hào)只能有_和$
var var; //不能是關(guān)鍵字
var class; //不能是保留字
變量的名字的長(zhǎng)度實(shí)際上每個(gè)瀏覽器的規(guī)范不同犁跪,不用在意。
3.變量的賦值
變量的賦值用等號(hào)歹袁,等號(hào)就是賦值符號(hào)坷衍,在JS中等號(hào)沒(méi)有其他的含義,等號(hào)就表示賦值条舔。
var a; //定義
a = 100; //賦初值
console.log(a);
可以定義和賦初值一起寫(xiě):
var a = 100;
console.log(a);
等號(hào)右邊的值給左邊枫耳,等號(hào)右邊的值不變。
var a = 100;
var b = 200;
a = b; //在改變a變量的值逞刷,a的值變?yōu)?00嘉涌。b的值不變。
console.log(a);
console.log(b);
你會(huì)發(fā)現(xiàn)夸浅,變量只需要var一次仑最,后面改變變量的值的時(shí)候,就不需要var了帆喇,可以直接改變它的值警医。
var a = 100;
a = 50; //不需要寫(xiě)var
console.log(a);
如果一個(gè)變量,僅僅被var了坯钦,但是沒(méi)有被賦初值呢预皇,此時(shí)這個(gè)變量的值就是undefined;
var m;
console.log(m); //輸出undefined
實(shí)際上我們已經(jīng)var了這個(gè)m,已經(jīng)定義了這個(gè)m婉刀,只不過(guò)這就是瀏覽器的一個(gè)規(guī)矩吟温,如果這個(gè)變量沒(méi)有被賦初值,那么這個(gè)變量就視為沒(méi)有“定義完成”突颊。值就是undefined鲁豪。
4.變量聲明的提升
這是js特有的一個(gè)特點(diǎn),其他語(yǔ)言都沒(méi)有這個(gè)特點(diǎn)律秃。有些程序員挺反感這個(gè)特點(diǎn)的爬橡。
我們現(xiàn)在先去改變變量的值,然后定義變量棒动,由于JS有一個(gè)機(jī)制糙申,叫做變量聲明的提升,所以現(xiàn)在程序在執(zhí)行前會(huì)已經(jīng)看見(jiàn)這個(gè)程序中有一行定義變量船惨,所以就會(huì)提升到程序開(kāi)頭去運(yùn)行柜裸。
<script type="text/javascript">
a = 100;
var a; //這行定義變量會(huì)自動(dòng)提升到所有語(yǔ)句之前
console.log(a);
</script>
輸出:100
記住,js只能提升變量的聲明掷漱,而不能提升變量的賦初值
console.log(a);
var a = 100;
等價(jià)于:
var a; //自動(dòng)升級(jí)
console.log(a);
a = 100; //賦初值還留在原地
5.不寫(xiě)var的情況
abc = 123;
console.log(abc);
定義abc的時(shí)候沒(méi)有寫(xiě)var粘室,程序沒(méi)有報(bào)錯(cuò),說(shuō)明這個(gè)abc變量真的已經(jīng)被定義成功了〔贩叮現(xiàn)在你看不出來(lái)var和不var的區(qū)別衔统,感覺(jué)都是成功的,但是日后你就會(huì)知道不寫(xiě)var定義了一個(gè)全局變量海雪,作用域是不能控制的锦爵。
6.用逗號(hào)來(lái)隔開(kāi)多個(gè)變量的定義
var a = 7 , b = 9 , c = 10;
逗號(hào)這個(gè)表示法,只能用于變量的連續(xù)定義奥裸,不要瞎用险掀。
7.區(qū)分變量還是直接量
變量的時(shí)候,不能加引號(hào)湾宙。如果變量加上引號(hào)樟氢,就變成字符串了冈绊。
var a = 100;
console.log("a");
輸出的是a,而不是輸出100,
引號(hào)是“字符串”的定界符埠啃,所以在雙引號(hào)里面的a已經(jīng)失去了變量的意思死宣,就是一個(gè)字符串a(chǎn)。
變量的類(lèi)型
1.概述
基本類(lèi)型5種
-
number
數(shù)字類(lèi)型 -
string
字符串類(lèi)型 -
undefined
undefined類(lèi)型碴开,變量未定義時(shí)的值毅该,這個(gè)值自己是一種類(lèi)型 -
boolean
布爾類(lèi)型,僅有兩個(gè)值true 和 false潦牛,講if語(yǔ)句時(shí)我們細(xì)說(shuō) -
null
null類(lèi)型眶掌,這個(gè)值自己是一種類(lèi)型,遇見(jiàn)時(shí)我們細(xì)說(shuō)
引用類(lèi)型
2.typeof關(guān)鍵字
這個(gè)關(guān)鍵字巴碗,用來(lái)檢測(cè)一個(gè)變量的類(lèi)型朴爬。
var a = 100;
var a = 100;
console.log(typeof a);
3.number類(lèi)型
所有的數(shù)字都是number類(lèi)型
<script type="text/javascript">
//下面定義的變量都是number類(lèi)型
var a = 100;
var b = 234243245345;
var c = -345345435435;
var d = 345.3245234;
var e = .5e6;
var f = 0xff;
var g = 017;
var h = Infinity;
var i = NaN;
console.log(typeof a);
console.log(typeof b);
console.log(typeof c);
console.log(typeof d);
console.log(typeof e);
console.log(typeof f);
console.log(typeof g);
console.log(typeof h);
console.log(typeof i);
</script>
JS中所有的數(shù)字都是number類(lèi)型的,不在細(xì)分為整形int良价、浮點(diǎn)型float這些亂七八糟的東西寝殴。
number類(lèi)型的東西:所有數(shù)字(不分正負(fù)吗铐、不分整浮晌涕、不分大小、不分進(jìn)制)垂涯、Infinity痊银、NaN抵蚊。
4.string類(lèi)型
var m1 = "哈哈";
var m2 = "123";
var m3 = ""; //空字符串,也是字符串
console.log(typeof m1);
console.log(typeof m2);
console.log(typeof m3);
這個(gè)變量是什么類(lèi)型溯革,和賦的值有關(guān)系贞绳,而和定義的時(shí)候是沒(méi)有關(guān)系的。定義的時(shí)候致稀,都是用var關(guān)鍵字定義的冈闭。
var mm = 123; //number
console.log(typeof mm);
mm = "哈哈"; //改為string是合法的
console.log(typeof mm);
我們說(shuō)js這個(gè)語(yǔ)言叫做動(dòng)態(tài)數(shù)據(jù)類(lèi)型,原因就在這里抖单,就是賦值的時(shí)候就決定這個(gè)變量的類(lèi)型了萎攒。甚至可以改變這個(gè)變量的值,為其他類(lèi)型的值矛绘。變量的類(lèi)型是自動(dòng)檢測(cè)的耍休,而不是人規(guī)定的。
5.undefined類(lèi)型
之前說(shuō)過(guò)货矮,一個(gè)變量只var過(guò)羊精,沒(méi)有賦初值,它的默認(rèn)值是undefined;
這個(gè)undefined是自成一家囚玫,自己是自己的類(lèi)型喧锦,它的類(lèi)型也叫作undefined读规。undefined類(lèi)型的值就只有undefined一個(gè)。
var nn; //我只定義了燃少,沒(méi)有賦初值掖桦,所以就是undefined,類(lèi)型也是undefined
console.log(nn);
console.log(typeof nn);
6.加號(hào)
加號(hào)兩邊都是數(shù)字的時(shí)候供汛,那么就是數(shù)學(xué)加法;兩邊不都是數(shù)字的時(shí)候涌穆,那么就是連字符怔昨,結(jié)果是字符串。
console.log("你" + "好");
console.log(1 + "2");
12宿稀,因?yàn)?被引號(hào)引起來(lái)了趁舀,所以就是字符串,所以+就是連字符
var a = "1";
var b = "2";
console.log(a + b);
var a = 1;
var b = 2;
console.log("a" + b); //a2
多個(gè)加號(hào)祝沸,從左算到右:
var a = 1;
var b = 2;
var c = 3;
console.log("a" + a + b + "c");
var a = 1;
var b = 2;
var c = 3;
console.log(a + b + "c");
變量類(lèi)型的轉(zhuǎn)換
1.string → number
先來(lái)學(xué)習(xí)一個(gè)語(yǔ)句矮烹,這個(gè)語(yǔ)句和alert差不多,也是彈窗罩锐,彈的是輸入框:
prompt("請(qǐng)輸入你的電話","139");
這些小功能奉狈,就叫做程序給我們提供的API,每個(gè)API都有自己不同的語(yǔ)法涩惑。
prompt(“提示文本”,”默認(rèn)值”);
默認(rèn)值可以省略仁期。
可以把用戶(hù)輸入的值,存入變量:
var a = prompt("請(qǐng)輸入你的電話","139");
alert("哈哈竭恬,你輸入的電話是" + a);
用prompt接收的任何東西都是字符串跛蛋,哪怕用戶(hù)輸入了一個(gè)數(shù)字,也是字符串的數(shù)字痊硕。
有一些方法可以將內(nèi)存中表示一個(gè)數(shù)字的字符串轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字
parseInt()
和parseFloat()
赊级。
parseInt就是將一個(gè)string轉(zhuǎn)為一個(gè)整數(shù),不四舍五入岔绸,直接截取整數(shù)部分理逊。如果這個(gè)string有亂七八糟的東西,那么就截取前面數(shù)字部分亭螟。
var a = "123";
var b = parseInt(a); //parseInt就把字符串123轉(zhuǎn)為數(shù)字123了
console.log(b);
console.log(typeof b);
下面的實(shí)例結(jié)果都是123挡鞍,最后一個(gè)是-123:
parseInt("123") //123
parseInt("123.6") //123
parseInt("123年都會(huì)很愛(ài)你") //123
parseInt("123年11月") //123
parseInt("123px") //123
parseInt("-123.99999999") //-123
parseInt()
不僅僅能夠進(jìn)行一個(gè)轉(zhuǎn)為整數(shù),更能進(jìn)行一個(gè)進(jìn)制的轉(zhuǎn)換预烙,把任何進(jìn)制的數(shù)字墨微,都換為10進(jìn)制。
進(jìn)制和要轉(zhuǎn)換的字符串扁掸,用逗號(hào)隔開(kāi)翘县。
下面的運(yùn)算結(jié)果都是15:
parseInt(15,10)
parseInt(17,8)
parseInt(1111,2)
parseInt("0xf",16)
parseInt("f",16)
parseInt(16,9)
parseInt("15e6",10)
parseInt("15*6",10)
parseInt如果不能轉(zhuǎn)最域,那么就返回NaN
parseInt("Hello", 8);
parseInt("546", 2);
parseInt("三百六十五");
得到NaN的方法又多了一種,上午講的是6/0得到Infinity锈麸。0/0得到NaN镀脂。
parseFloat就是將字符串轉(zhuǎn)為浮點(diǎn)數(shù)
盡可能的將一個(gè)字符串轉(zhuǎn)為浮點(diǎn)數(shù),浮點(diǎn)數(shù)之后如果有亂七八糟的內(nèi)容忘伞,直接舍棄薄翅。
<script type="text/javascript">
var a = "123.67.88";
var b = parseFloat(a);
console.log(b);
</script>
也就是說(shuō),數(shù)字類(lèi)型都是number氓奈,不分整數(shù)和浮點(diǎn)數(shù)翘魄,但是轉(zhuǎn)換的時(shí)候分。
2.number → string
將一個(gè)數(shù)字舀奶,與一個(gè)空字符串進(jìn)行連字符運(yùn)算暑竟,那么就是自動(dòng)轉(zhuǎn)為字符串了。
var a = 123;
var b = a + "";
console.log(b);
console.log(typeof b);
數(shù)學(xué)運(yùn)算符
運(yùn)算符叫做operator育勺,也可以叫做操作符但荤。運(yùn)算符有很多種,一元運(yùn)算符涧至、二元運(yùn)算符腹躁;數(shù)學(xué)運(yùn)算符、邏輯運(yùn)算符……我們今天先學(xué)習(xí)數(shù)學(xué)運(yùn)算符南蓬,比較簡(jiǎn)單
- 加法
- 減法
- 乘法
/ 除法
% 取余數(shù)
( ) 括號(hào)
下面的結(jié)果都是3:
console.log(1 + 2);
console.log(8 - 5);
console.log(1.5 * 2);
console.log(12 / 4);
console.log(13 % 5); //得幾不重要潜慎,要的是余數(shù)
取余數(shù)這個(gè)運(yùn)算,實(shí)際上也是除蓖康,要的是余數(shù):
//取余數(shù)
console.log(12 % 3); //0
console.log(121 % 11); //0
console.log(5 % 8); //5
console.log(8 % 5); //3
console.log(5 % 5); //0
默認(rèn)的計(jì)算順序铐炫,先乘除,后加減蒜焊。乘除取余是平級(jí)倒信,先遇見(jiàn)誰(shuí),就算誰(shuí)泳梆。
console.log(1 + 2 * 3); //7
console.log(1 + 2 * 3 % 3); //1
console.log(1 + 2 % 3 * 3); //7
我們可以用小括號(hào)來(lái)改變計(jì)算先后順序鳖悠,注意沒(méi)有中括號(hào)和大括號(hào),一律用小括號(hào)优妙。
var a = 4 * (3 + (1 + 2) * 3);
alert(a);
JS中的數(shù)學(xué)運(yùn)算符乘综,就這么幾個(gè),如果你學(xué)過(guò)C套硼,那么我提醒你卡辰,沒(méi)有乘方^。如果你學(xué)過(guò)java那么我提醒你,沒(méi)有取整除法\九妈。
乘法怎么算反砌?
Math.pow(3,4);
這是一個(gè)新的API,記住就行了萌朱,后面的課程將會(huì)告訴你宴树,Math是一個(gè)內(nèi)置對(duì)象,pow是它的一個(gè)方法晶疼。
Math就是數(shù)學(xué)酒贬,pow就是power乘方。
var a = Math.pow(3,2 + Math.pow(3,6));
根號(hào)就是
Math.sqrt(81);
今天遇見(jiàn)的所有API:
alert("哈哈");
prompt("請(qǐng)輸入數(shù)字","默認(rèn)值");
console.log("哈哈");
parseInt("123",8);
parseFloat("123");
Math.pow(3,4);
Math.sqrt(81);