javaScripts中的函數
javaScripts中的函數沒有引用傳遞,隻有值傳遞
但是數組作為參數傳遞給函數時,此時的數組是作為地址傳遞給函數的,可以理解為引用傳遞。
變量作用域
擁有全局作用域的變量:1、在函數外定義的變量
2、在函數體內沒有經過var申明的變量
javaScripts擁有的函數作用域,沒有塊級作用域
什麼是塊級作用域:
任何一對花括號({和})中的語句集都屬於一個塊,在這之中定義的所有變量在代碼塊外都是不可見的,我們稱之為塊級作用域。
c、java等其他語言都是有塊級作用域,但是javaScript沒有塊級作用域。
#include void main() { int i=2; i--; if(i) { int j=3; } printf("%d/n",j); }
會輸出use an undefined variable:j的錯誤
但是在js中沒有塊級作用域
function test(){ for(var i=0;i<3;i++){ } console.log(i); //會輸出3 } test();
會輸出3 在{}之外仍然可以訪問到i
遞歸
function he(i) { if(i==0){ return i; } else{ return i+he(i-1); } }
實現的就是從0加到5利用遞歸實現
一維數組和數組的操作方法
創建數組
var numbers=[]; var cc=new Array(); console.log(cc instanceof Array) //檢測是否為數組 var cc=[1,'e',true];
數組中的元素可以不是數字
由字符串生成數組
var aa="hello,jdisajd,djska"; var cc=aa.split(","); console.log(cc.length) //3
將數組轉化為字符串
使用的是join()方法和tostring()方法
join()的方法
var aa=[1,3,6,'dda',cc]; console.log(aa.join("c"));
輸出的結果是用C來連接數組中的每一個元素
改變數組的函數
向數組添加一個元素
push unshift
var aa=[1,3,6,'dda',cc]; aa.push('21'); //在數組的末尾加一個元素 aa.unshift('1212') //在數組的開始添加一個元素
從數組中刪除一個元素
aa.pop() //從數組的末尾刪除一個元素 aa.shift() //從數組的開始刪除一個元素
從數組的中間添加或者刪除元素
splice()方法
實現為數組添加元素 需要提供一下參數
1、開始索引
2、想要刪除的元素的個數(添加是的時候為0)
3、想要添加的數組的元素
var aa=[1,3,6,4,6]; aa.splice(1,4,4,5,6,7); console.log(aa); //[1, 4, 5, 6, 7]
第二個參數為要刪除的個數,隻是添加的話就為0,
後面的參數都是添加到數組的元素。
為數組排序
reverse()
這個方法知識實現瞭將數組的元素進行反轉。
sort()
這個方法是將數組的元素按照ACII碼來排序。但是可以改變這種排序的方式,通過傳遞一個函數。
/* function compare(num1,num2){ return num1-num2; }*/ function compare(num1,num2){ if(num1>num2){ return -1; }else{ return 1 } } var aa=[1,3,6,12,4,6]; aa.sort(compare); console.log(aa); //[1, 4, 5, 6, 7]
上面的compare函數被傳遞給sort函數從而實現排序
迭代器方法、
1、不生成新數組的迭代器
不會產生一個新的數組,但是會對數組中的每一個元素都會進行一個操作。
forEach()函數 接受的是一個函數,對數組中的每一個元素都執行這個函數
function cc(num) { console.log(num*num); } var cc1=[1,2,3,4] cc1.forEach(cc);
every()函數 接受的是一個返回值為佈爾類型的函數。對數組每一個元素使用該函數,如果對於所有元素都返回true,該方法就會返回true,否則會返回false 與
function cc(num) { return num%2==0; } var cc1=[2,4] console.log(cc1.every(cc)); //true
some()方法 接受的是一個返回佈爾值得函數,隻有一個元素返回true就會使得這個函數返回true 或
function cc(num) { return num%2==0; } var cc1=[1,3,2,4] console.log(cc1.some(cc)); //true
2、生成新數組的迭代器
map() 方法 這個方法是和forEach()類似的功能,但是這個方法返回的的是一個新的數組,不會改變原來的數組。
function cc(num) { return num+5; } var cc1=[1,3,2,4] console.log(cc1.forEach(cc)); //undefined console.log(cc1.map(cc)); //[6, 8, 7, 9]
filter()方法 接受的也是一個返回值為佈爾類型的函數,和every()方法不同的是當歲數組的所有的元素應用該函數時,會將結果為true的元素集合到一個數組中,會將結果為false的元素集合到一個數組中
function even(num) { return num%2==0; } function odd(num) { return num%2==1; } var cc1=[1,3,2,4] console.log(cc1.filter(even)); //[2,4] console.log(cc1.filter(odd)); //[1,3]
indexOf()
方法著數組中的某一個元素
var aa="hello,jdisajd,djska"; var cc=aa.split(","); console.log(cc.indexOf("hello"))
二維數組
js中本身沒有二維數組,通過下邊的方法模擬創建一個二維數組
Array.martix=function(rows,cols,init){ var arr=[]; for(var i=0;i列表 list 實現的是索引列表
js中列表可以是任意的數據類型 用js實現列表和對列表的操作 https://github.com/wenjuanzhao/git/blob/master/3.1-list.js
棧 -元素先進後出
js實現棧的數據結構 https://github.com/wenjuanzhao/git/blob/master/3.2-stack.js 棧是一種特殊的列表 棧內的元素隻能在一端訪問元素。這一端稱為棧頂 使用棧實現數值之間的進制轉換
function mulBase(num,base) { var s=new stack(); do{ s.push(num%base); num=Math.floor(num/base); }while(num>0) return s; } var cc=""; var ss=mulBase(12,2); while(ss.length()>0){ cc+=ss.pop(); } console.log(cc);使用棧來實現遞歸的過程
function ff(n){ var s=new stack(); while(n>1){ s.push(n--); } var product=1; while(s.length()>0){ product*=s.pop(); } return product; } console.log(ff(5));使用棧實現瞭檢測一個表達式中的括號是否匹配
function validBraces(str) { let brackets = str.match(/[\[\]\(\)\{\}]/g), ss=new stack(), symbal; for(var i=0;i0?false:true; } console.log(validBraces("2.3+23/12+{((1))}"))隊列
先進先出的數據結構
使用node從文件讀取跳舞者 的姓名和性別,js實現隊列的算法來實現跳舞排隊。一男一女一個組合剩下的男或者女按照隊列的規則在排隊
https://github.com/wenjuanzhao/git/tree/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.1-queue
隊列實現基數排序
基數排序:https://baike.baidu.com/link?url=GjmU4fcHfrE0ls_w2fT8lxGjZwQoK9hapNCtU0b2up5Iax1Fp_UOs7oz7FxZA8kyGon0vs5rudQHw1rydm37G_
js利用實現基數排序:要實現這個算法需要9個隊列。
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.4-queue.jsdelete刪除操作符
delete用於刪除對象的屬性但是不能刪除變量和函數
var o={x:1}; //使用瞭delete來刪除瞭對象的屬性 delete o.x; console.log(o.x) //undefined function aa(){ return 1; } //使用delete不能刪除不瞭這個函數也刪除不瞭定義的變量 delete aa; console.log(typeof aa); //function鏈表
數組的缺點:在很多編程語言中數組的長度是固定的,
1、當數組中的被填滿的時候,很難再擴充數組的長度,
2、數組中添加和刪除都是比較困難的,因為一旦刪除或者添加都必須移動其他的元素
所以在很多的編程語言中就封裝瞭鏈表
鏈表是一個一個節點組成的集合
每一個節點都使用一個對象的引用指向它的後繼。
頭節點:鏈表最前面的一個特殊的節點。
設計一個基於對象的鏈表
註意:向鏈表中插入節點的時候1、首先創建一個節點,並將鏈表的頭節點賦給新節點2、在鏈表上進行循環,如果當前的element屬性和我們要找的信息不符,就從當前的節點移動到下一個節點。3、一旦找到可以插入的位置,首先將next屬性設置為後面節點next屬性對應的值。
實現插入的關鍵性語句
newNode.next=current.next;
current.next=newNode;
實現刪除某個節點的時候必須是先找到被刪除節點的前一個節點,用findPrev這個方法來找到
js實現單向鏈表
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.5-%E5%8D%95%E5%90%91%E9%93%BE%E8%A1%A8.js
js實現雙向鏈表
改變瞭每一個節點的具體結構
https://github.com/wenjuanzhao/git/blob/master/javaScript%E5%AE%9E%E7%8E%B0%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/5.6-%E5%8F%8C%E5%90%91%E5%88%97%E8%A1%A8.js
js實現循環列表vc3Ryb25nPjxiciAvPg0KPGltZyBhbHQ9"這裡寫圖片描述" src="/uploadfile/Collfiles/20160920/20160920093450223.png" title="\" />
循環鏈表和單向鏈表相似, 節點類型都是一樣的。 唯一的區別是, 在創建循環鏈表時, 讓其頭節點的 next 屬性指向它本身, 即:
head.next = head
讓你果然有錯誤的約瑟夫問題字典
字典是一種以鍵、值的方式存儲的一種數據結構。