摘要:方法用于刪除原數(shù)組中的一部分元素,并可以在被刪除的位置添加新數(shù)組成員,返回值是被刪除的元素。遞歸函數(shù)函數(shù)內(nèi)部調(diào)用函數(shù)自身,稱之為遞歸。在函數(shù)內(nèi)使用聲明的變量是局部變量,是人為的聲明。
前言
這個(gè)筆記不知道什么時(shí)候記下的反正很有意思,很基礎(chǔ),很理論。
JavaScript學(xué)習(xí)筆記1 第一章 JavaScript概述 1.1 什么是JavaScriptJavaScript是一種輕量級(jí)的腳本語(yǔ)言,也是一種嵌入式(embedded)語(yǔ)言,是一種對(duì)象模型語(yǔ)言。
腳本語(yǔ)言又被稱為擴(kuò)建的語(yǔ)言,或者動(dòng)態(tài)語(yǔ)言,是一種編程語(yǔ)言,用來(lái)控制軟件應(yīng)用程序,腳本通常以文本(如ASCII)保存,只在被調(diào)用時(shí)進(jìn)行解釋或編譯,在依靠特定的宿主環(huán)境提供API來(lái)實(shí)現(xiàn)操作和效果。常見(jiàn)的宿主環(huán)境有瀏覽器,服務(wù)器環(huán)境(操作系統(tǒng))。
嵌入式語(yǔ)言一句話就是不能獨(dú)立做事,插入到其他語(yǔ)言才能用的語(yǔ)言。1.2 使用方法 1.2.1 內(nèi)部引用(標(biāo)簽引入)
理論上
邏輯或解析圖
順序結(jié)構(gòu):從上而下
分支結(jié)構(gòu)(選擇結(jié)構(gòu)):if else if else 和switch。
if else 和 switch的區(qū)別?
if結(jié)構(gòu)不僅可以判斷固定值, 還可以判斷范圍區(qū)間。switch結(jié)構(gòu)只能判斷固定值情況。
3.循環(huán)結(jié)構(gòu):while,for,do while等
4.continue和break的區(qū)別;
continue:跳出當(dāng)前循環(huán),繼續(xù)下次循環(huán)。2.4 數(shù)組 2.4.1 數(shù)組的簡(jiǎn)單使用break:跳出整個(gè)循環(huán)結(jié)構(gòu),也就相當(dāng)于結(jié)束循環(huán)。
數(shù)組是一組有序數(shù)據(jù)的集合,在內(nèi)存中表現(xiàn)為一段連續(xù)的內(nèi)存地址。
數(shù)組的聲明也很簡(jiǎn)單:
var arr=[1,2,3,4];var arr=new Array(1,2,3,4);
var arr=new Array(2); arr[0]=1;arr[1]=2;arr[2]=3;
多維數(shù)組:數(shù)組的元素也是一個(gè)數(shù)組,則父數(shù)組是多為數(shù)組。
var arr=[1,2,[3,4,5,[6,7]]];是個(gè)三維數(shù)組
獲取數(shù)組元素:通過(guò)下標(biāo)獲?。〝?shù)組[下標(biāo)]),多為數(shù)組的話所有下標(biāo)都寫上,不然只的到所在行的全部元素。
數(shù)組的遍歷:
最常用的通過(guò)for循環(huán),根據(jù)循環(huán)語(yǔ)法,在循環(huán)之前先獲取數(shù)組長(zhǎng)度
var arr=["Apple","Huawei","SumSung"]; var len=arr.length; for(var i=0;i for...in循環(huán)遍歷數(shù)組:for..in可以遍歷對(duì)象,也可以遍歷數(shù)組,畢竟數(shù)組也是個(gè)特殊的對(duì)象。var arr=["Apple","Huawei","SumSung"]; for(var i in arr){ //每次遍歷是,系統(tǒng)自動(dòng)將元素的索引下標(biāo)放入變量i中 console.log(arr[i]); }2.4.2 數(shù)組對(duì)象的屬性及方法(很重要,背下來(lái))length屬性:返回?cái)?shù)組的成員數(shù)量即數(shù)組的長(zhǎng)度。數(shù)組對(duì)象的常用方法:
push方法:用于在數(shù)組的末端添加一個(gè)或多個(gè)元素,并返回新元素的數(shù)組長(zhǎng)度。注意push方法會(huì)改變?cè)瓟?shù)組。
var a=[]; a.push(1); alert(a);//1 a.push("a"); console.log(a);//Array[1,"a"] a.push(true,{}); console.log(a);//Array [ 1, "a", true, {} ]pop方法:用于刪除數(shù)組的最好一個(gè)元素,并返回該元素。注意,pop方法會(huì)改變?cè)瓟?shù)組
var a=["a","b","c"]; var b=a.pop();//c console.log(a);//Array["a","b"] console.log(b);//cjoin方法:用于參數(shù)分隔符,將所有數(shù)組成員一個(gè)字符串返回,如果不提供參數(shù),默認(rèn)用逗號(hào)分隔。不改變?cè)瓟?shù)組。
var a=[1,2,3,4]; var b=a.join("|"); console.log(b);//1|2|3|4 var c=a.join(); console.log(c);concat方法:用于多個(gè)數(shù)組的合并,它將新數(shù)組的成員添加到原數(shù)組的尾部,然后返回一個(gè)新的數(shù)組,原數(shù)組不變。
var a=["hello"]; var b=["world"]; var d=a.concat(b); console.log(d);//Array [ "hello", "world" ] console.log(d.concat(["!"],["A"]));//Array [ "hello", "world", "!", "A" ]shift方法:用于刪除數(shù)組的第一元素,并返回給該元素。注意改變?cè)瓟?shù)組。
var a=[1,2,3]; var b=a.shift(); console.log(a);//Array [ 2, 3 ] console.log(b);//1unshift方法:用于在數(shù)組的第一個(gè)位置添加一個(gè)元素,并返回新加元素后的數(shù)組長(zhǎng)度。注意該方法會(huì)改變?cè)瓟?shù)組。
var a=[1,2,3]; var b=a.unshift(5); console.log(a);//Array [ 5, 1, 2, 3 ] console.log(b);//4reverse方法:用于顛倒數(shù)組中的元素,返回改變后的數(shù)組。注意,該方法將改變?cè)瓟?shù)組。
var a=[1,2,3]; var b=a.reverse(); console.log(a);//Array [ 3,2,1 ] console.log(b);//Array [ 3,2,1 ]slice方法:用于提取原數(shù)組中的一部分元素(相當(dāng)于截取),返回一個(gè)新數(shù)組,原數(shù)組不變。它的第一個(gè)參數(shù)為起始位置(從0開(kāi)始) , 第二個(gè)參數(shù)為終止位置(但該位置的元素本身不包括在內(nèi)) 。如果省略第二個(gè)參數(shù), 則一直返回到原數(shù)組的最后一個(gè)成員。
var a = ["a","b","c","d","e"]; console.log(a.slice(0)) // ["a", "b", "c", "d", "e"] console.log(a.slice(1)) // ["b", "c", "d", "e"] console.log(a.slice(1,3)); // ["b", "c"]splice方法:用于刪除原數(shù)組中的一部分元素,并可以在被刪除的位置添加新數(shù)組成員,返回值是被刪除的元素。注意,該方法會(huì)改變?cè)瓟?shù)組。splice的第一個(gè)參數(shù)是刪除的起始位置, 第二個(gè)參數(shù)是被刪除的元素個(gè)數(shù)
var a = ["a", "b", "c", "d", "e", "f"]; var a1 = a.splice(4, 2); console.log(a1); //Array["e", "f"] console.log(a); // Array["a", "b", "c", "d"] var b = ["a", "b", "c", "d", "e", "f"]; var a2 = b.splice(1, 2, 1, 2); console.log(a2); //["b", "c"] // console.log(b);//["a", 1, 2, "d", "e", "f"]forEach方法:用于遍歷數(shù)組的所有成員,執(zhí)行某種操作;forEach方法的參數(shù)是一個(gè)函數(shù),數(shù)組的所有成員會(huì)依次執(zhí)行該函數(shù),它接受三個(gè)參數(shù),分別是當(dāng)前位置的值,當(dāng)前位置的編號(hào)和整個(gè)數(shù)組
var a = ["a", "b", "c", "d", "e", "f"]; a.forEach(function(v,k,h){ console.log(v); console.log(k); console.log(h); }); //第三個(gè)參數(shù)可以寫可以不寫,它帶便遍歷次數(shù)第三章 函數(shù) 3.1 函數(shù)概述函數(shù)就是制作工具的工具,比如計(jì)算器就是一個(gè)工具,而制作計(jì)算器的工具就是函數(shù),也就是制作工具的工具。一次定義多次使用。
用函數(shù)的好處:節(jié)省代碼的數(shù)量,減少代碼量,使代碼可以重復(fù)使用,節(jié)省空間,節(jié)省時(shí)間,使程序代碼具有結(jié)構(gòu)化,模塊化,后期維護(hù)更友好等等很多好處
3.2 函數(shù)基本使用 3.2.1 函數(shù)的聲明及調(diào)用多次聲明同一個(gè)函數(shù)的話,最后一次聲明的函數(shù)會(huì)覆蓋前面的函數(shù),前面的聲明在任何時(shí)候都是無(wú)效的。
遞歸函數(shù):函數(shù)內(nèi)部調(diào)用函數(shù)自身,稱之為遞歸。只要是遞歸必須的有判斷,不然它是個(gè)死循環(huán),用別的函數(shù)解決的問(wèn)題最好別用遞歸解決,遞歸占內(nèi)存大,不友好。
function Recursion(x){ if(x>1){ return x+Recursion(x-1); }else{ return 1; } } console.log(Recursion(100);3.2.2 函數(shù)的參數(shù)及返回值函數(shù)的參數(shù)有形參和實(shí)參:
形參就是函數(shù)聲明時(shí)需要接受的參數(shù),可以理解成暫時(shí)的占位符,并無(wú)實(shí)際意義實(shí)參就是調(diào)用函數(shù)是傳遞進(jìn)函數(shù)的具體的實(shí)際數(shù)據(jù),也就是給占替代位符的的值
函數(shù)體內(nèi)部的return語(yǔ)句:表示將數(shù)據(jù)返回給調(diào)用者。return后面即使有語(yǔ)句,也不會(huì)執(zhí)行,也就是return后面不執(zhí)行.return語(yǔ)句可有可無(wú),沒(méi)有則不反悔任何值或者說(shuō)返回undefined。
函數(shù)中的arguments對(duì)象:arguement是函數(shù)調(diào)用時(shí)的實(shí)參列表;只是實(shí)參列表
function Argu(a){ console.log(arguments); } Argu(1,2,3);aruguments對(duì)象帶有一個(gè)callee屬性,返回他所對(duì)應(yīng)的原函數(shù)。callee代表當(dāng)前運(yùn)行的函數(shù)
function Argu(a){ console.log(arguments.callee); } Argu(1,2,3);3.2.3 自調(diào)用匿名函數(shù)函數(shù)可以沒(méi)有名字嗎?當(dāng)然可以:(function(){})();
為什么要有自調(diào)用匿名函數(shù)?
因?yàn)橛忻瘮?shù)有缺點(diǎn),可能運(yùn)行時(shí)會(huì)出現(xiàn)命名沖突,如果在編寫程序時(shí),直接采取自調(diào)用匿名函數(shù),則不會(huì)產(chǎn)生命名沖突問(wèn)題。市場(chǎng)上很多框架,如JQuery.js,ext.js等都是采用匿名函數(shù)進(jìn)行封裝。使用自調(diào)用匿名函數(shù)結(jié)合aruguments對(duì)象實(shí)現(xiàn)遞歸:
var a = (function (n) { if (n > 1) { return n + arguments.callee(n - 1); } else { return 1; } })(100); console.log(a);3.3 函數(shù)作用域 3.3.1 定義作用域指的是變量存在的范圍。JavaScript中作用域有兩種局部作用域和全局作用域。
局部作用域:變量只在函數(shù)的內(nèi)部存在。在函數(shù)內(nèi)使用var聲明的變量是局部變量,是人為的聲明。全局作用域:變量在整個(gè)程序中存在,所有地方都可以讀取。全局變量一個(gè)是函數(shù)外聲明的變量;還有一個(gè)是函數(shù)內(nèi)不使用var的變量(僅僅帶便變量被賦值),也就是如果不是人為定義,系統(tǒng)會(huì)定義,系統(tǒng)定義的變量在整個(gè)程序中存在,不加var會(huì)污染全局。
function a(){ b=1 } a(); console.log(b);局部變量會(huì)替代全局變量:函數(shù)內(nèi)部聲明的變量會(huì)在函數(shù)內(nèi)部區(qū)域覆蓋同名的全局變量。
這說(shuō)明javascript的函數(shù)在查找自身函數(shù)定義開(kāi)始,從“內(nèi)”向“外”查找。var a=3; function fun(){ var a=2; console.log(a); } fun();//2 console.log(a);//3如果函數(shù)內(nèi)部不使用var關(guān)鍵字,那么函數(shù)內(nèi)部的賦值將會(huì)影響全局變量。實(shí)際上,JavaScript默認(rèn)喲偶一個(gè)全局的對(duì)象窗口,全局作用域的變量實(shí)際上是被綁定到窗口對(duì)象上的一個(gè)屬性,因此,直接訪問(wèn)全局對(duì)象a和訪問(wèn)window.a是完全一樣的
var a=3; function fun(){ a=2; console.log(a); } fun();//2 console.log(a);//2作用域解釋圖:
3.3.2 變量提升JavaScript的函數(shù)定義有個(gè)特點(diǎn),他會(huì)先掃描整個(gè)函數(shù)體呃逆的語(yǔ)句,把所有聲明的變量提升到函數(shù)的頂部,注意只是把聲明提升了,并不會(huì)提升變量的賦值。
function fun(){ console.log(a);//undefined var a=2; //JavaScript解析引擎來(lái)說(shuō)相當(dāng)于 /** *var a; *var b=1+a; *alert(b); *a=2; **/ } fun();3.3.3 函數(shù)本身的作用域函數(shù)本身也是一個(gè)值,也有自己的作用域;函數(shù)的作用域與變量一樣,就是它聲明時(shí)所作的作用域,與其運(yùn)行時(shí)所在的作用域無(wú)關(guān)
函數(shù)執(zhí)行時(shí)的作用域是定義時(shí)的作用域,而不是調(diào)用時(shí)的作用域。
var a=3; var x=function(){ console.log(a); } function f(){ var a=4; x(); } f();//3再看這個(gè):
var x=function(){ console.log(a); } function y(f){ var a=2; f(); } y(x);//ReferenceError: a is not defined //函數(shù)執(zhí)行時(shí)的作用域是定義時(shí)的作用域,而不是調(diào)用是的,所以,這代碼運(yùn)行結(jié)果是這樣。繼續(xù)看代碼
function fun(){ var a=2; function bar(){ console.log(a); } return bar; } var a=4; var f=fun(); f();//2第四章 語(yǔ)法分析 4.1 JavaScript代碼的編譯以及執(zhí)行JavaScript代碼運(yùn)行,分為編譯階段和執(zhí)行階段:
編譯階段:聲明變量,聲明函數(shù)(display),語(yǔ)法檢查等操作,一旦出錯(cuò)不會(huì)執(zhí)行下一階段,除了錯(cuò)誤提示不輸出別的內(nèi)容執(zhí)行階段:變量的賦值,函數(shù)的調(diào)用,代碼的執(zhí)行等操作,這一階段出錯(cuò)的話出錯(cuò)之前的內(nèi)容執(zhí)行;
4.2 script代碼段在html中是一段獨(dú)立的代碼,這一段代碼出錯(cuò)不會(huì)影響下一個(gè)代碼段的執(zhí)行;不管前面的代碼段錯(cuò)誤出現(xiàn)在編譯階段還是執(zhí)行階段都不會(huì)影響下一段代碼的執(zhí)行。
為什么呢?
雖然script代碼段在一個(gè)頁(yè)面,但是script代碼并不是一起執(zhí)行,而是分開(kāi)解析與執(zhí)行。JavaScript解析引擎從上而下讀取第一個(gè)代碼段-->放入內(nèi)存-->編譯階段-->執(zhí)行階段-->下一個(gè)JavaScript代碼段-->放入內(nèi)存...等操作;
總之一句話,JavaScript解析引擎執(zhí)行完一段代碼再執(zhí)行下一段代碼,每一段代碼都是獨(dú)立的存在。因此,前一個(gè)代碼無(wú)論發(fā)生什么錯(cuò)誤都不會(huì)影響下一個(gè)代碼段的執(zhí)行
看圖:
參考資料W3school
菜鳥教程
JavaScript權(quán)威指南(第6版)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28445.html
摘要:方法用于刪除原數(shù)組中的一部分元素,并可以在被刪除的位置添加新數(shù)組成員,返回值是被刪除的元素。遞歸函數(shù)函數(shù)內(nèi)部調(diào)用函數(shù)自身,稱之為遞歸。在函數(shù)內(nèi)使用聲明的變量是局部變量,是人為的聲明。 前言 這個(gè)筆記不知道什么時(shí)候記下的反正很有意思,很基礎(chǔ),很理論。 JavaScript學(xué)習(xí)筆記1 第一章 JavaScript概述 1.1 什么是JavaScript JavaScript是一種輕量級(jí)的腳...
摘要:基礎(chǔ)語(yǔ)法鞏固正則表達(dá)式引擎根據(jù)正則去匹配字符的時(shí)候,是通過(guò)檢查索引的方式。妻原配就是好,可以直接使用正則表達(dá)式調(diào)用它。下面解釋一下上面這些常用的元字符查找單個(gè)字符,除了換行和行結(jié)束符。正則系列文章整理到了 上一章內(nèi)容:正則表達(dá)式實(shí)戰(zhàn)篇 知識(shí)回顧 前2章分別學(xué)習(xí)了正則表達(dá)式入門技巧,以及遇到正則需求該如何去分析問(wèn)題,還有正則表達(dá)式實(shí)戰(zhàn)的一些場(chǎng)景解釋。 這一章內(nèi)容偏向理論,推薦你點(diǎn)擊開(kāi)頭的...
摘要:語(yǔ)法分析對(duì)輸入的文本按照語(yǔ)法規(guī)則進(jìn)行分析并確定其語(yǔ)法結(jié)構(gòu)的一種過(guò)程,稱為語(yǔ)法分析。遞歸下降分析法遞歸下降分析法,也稱為自頂向下分析法。表達(dá)式代碼生成我們通常用的四則運(yùn)算表達(dá)式是中綴表達(dá)式,但是對(duì)于計(jì)算機(jī)來(lái)說(shuō)中綴表達(dá)式不便于計(jì)算。 四則運(yùn)算的語(yǔ)法規(guī)則(語(yǔ)法規(guī)則是分層的) x* 表示 x 出現(xiàn)零次或多次 x | y 表示 x 或 y 將出現(xiàn) ( ) 圓括號(hào),用于語(yǔ)言構(gòu)詞的分組 以下規(guī)則...
摘要:前言本文主要是有關(guān)前端方面知識(shí)按照目前的認(rèn)知進(jìn)行的收集歸類概括和整理,涵蓋前端理論與前端實(shí)踐兩方面。 前言:本文主要是有關(guān)前端方面知識(shí)按照 XX 目前的認(rèn)知進(jìn)行的收集、歸類、概括和整理,涵蓋『前端理論』與『前端實(shí)踐』兩方面。本文會(huì)告訴你前端需要了解的知識(shí)大致有什么,看上去有很多,但具體你要學(xué)什么,還是要 follow your heart & follow your BOSS。 初衷...
閱讀 3206·2021-09-29 09:34
閱讀 3560·2021-09-10 10:51
閱讀 1960·2021-09-10 10:50
閱讀 6767·2021-08-12 13:31
閱讀 3008·2019-08-30 15:54
閱讀 1585·2019-08-30 15:44
閱讀 1435·2019-08-29 12:26
閱讀 2663·2019-08-26 18:36