js高階
一、資料型別,
1.五種基本的資料型別
undefined\null\boolean\number\string
null是以前的js的乙個bug,我們現在的js繼承了過來。所以null也是值型別。
1種複雜基本型別: object– 本質是乙個無序的鍵值對列表(集合),也就是json格式,我們的object物件都是json格式的,只不過我們把這種格式的物件成為json。
2.function是物件,不是一種資料型別,在js裡面沒有類的概念
,平常women在c#裡說的類的概念,在js裡就是物件,物件的概念在js裡叫物件的例項。
3.undefined值是乙個值(undefined),在使用var宣告變數但未對其賦值(初始化)時,變數預設值為undefined,但與沒宣告的變數不一樣。如:
var msg;
alert(msg==undefined);//true
alert(msg2);//錯誤
4.null 只是乙個值(null)。表示乙個空物件指標。
alert(typeof null); //object
alert(null==undefined);//true
在儲存物件的變數沒有儲存真正物件時,應該讓該變數儲存null值。
5.boolean型別 - 兩個字面值:true和false(區分大小寫)
6.number型別 – 整數和浮點數。*isnan(nan) parseint("123blue") parsefloat nan=not a number 代表不是乙個數字
7.string型別- 0至16位unicode字元組成的字串行。
8.object型別 – 一組資料和功能的集合,也是頂級「父類」。 通過new關鍵字建立物件。包含成員:constructor 建構函式, hasownproperty(propertyname) 檢查屬性是否在當前物件中,isprototypeof(object) 檢查物件是不是該物件原型,propertyisenumerable(propertyname) 檢查屬性是否能用for-in來迴圈,tostring(),valueof()
基本資料型別在記憶體中分別占用固定大小的空間,因為它們唄儲存在棧記憶體中。
引用型別在棧中儲存的是物件在堆記憶體中的位址。
這個跟c#中是一樣的。
當我們定義乙個字串的時候,這個時候系統會馬上定義乙個包裝類,然後把這個字串放在包裝類中,這個包裝類除了存放這個值以外還有一大堆的方法。
var a="abc";
這個時候我們用a.會點出很多方法出來,這些方法根本就不是值型別的,其實這些都是包裝類的,當我們點乙個方法出來執行的時候,是在執行的時候立馬把這個a放在乙個包裝類的物件裡面,呼叫的是包裝類物件的方法。當我們為這個a變數新增乙個屬性的時候,是加到包裝類中的,當我們再次訪問這個屬性的時候就點不出來,因為當你點的時候又會建立乙個新的包裝類,這個包裝類根本不存在這個屬性。
例如:a.name=「張三」;
這個時候在a.的時候並不會出來name這個屬性。這就是為什麼我們不能給值型別動態的新增屬性,因為這個屬性其實是新增到包裝類中的。
二、函式
1.通過函式可以封裝任意多條語句,在任何地方、任何時候呼叫。
定義函式時不需要指定返回值,因為任何函式在任何時候都可以通過return語句返回資料。
實際上未指定返回值的函式都返回乙個undefined值。
三、函式引數arguments。
function test()
在我們呼叫的時候,當我們不傳引數的時候,會彈出0。雖然我們沒有指定引數,但是我們可以傳遞任意多個引數。
如test(1,2,3)這樣會彈出3。
也就是說其實我們傳入的引數是存放在arguments中的,但是它不是陣列,我們可以這樣驗證,alert(arguments instanceof array)會彈出false。
其實arguments是類陣列的乙個集合。
與其他語言不同,ecmascript函式不介意傳遞進來多少個引數,也不在乎是什麼型別。-- 因為引數在內部是用乙個類陣列來表示的,函式接收到的始終是個類陣列。
上例看出,ecmascript函式的乙個重要特點:命名引數只提供便利,但不是必須的。
我們可以根據arguments來實現函式的過載。
arguments(包含所有傳入方法的引數)特殊用法:arguments中有乙個屬性callee,是乙個指標,指向擁有這個arguments物件的函式物件(就是當前函式物件的指標)。
例子:(階乘函式)
function facorial(num)
var another=facorial; facorial=function()
alert(another(5)); alert(facorial(5));
大家可以執行這段**,試試看又什麼不一樣。仔細想想為什麼。
function setname(o)
var c=new object()
setname(c);
alert(c.name);
這個時候會列印張三。
當我們呼叫這個方法的時候,我們將c的引用傳入到函式中,
那我們在函式中第乙個**操作的是c的引用。
當我們再new object的時候,我們的o指向的不再是c的引用,而是建立了乙個新的堆空間,指向了這個新的物件。
函式中的區域性變數在函式執行完後自動銷毀。
四、執行環境和作用域。
執行環境:定義了變數或函式有權訪問的其他資料,決定了他們各自的行為。環境中所有**執行完畢後該環境變數被銷毀。
每個執行環境都有乙個與之關聯的 變數物件,環境中定義的所有變數和函式都儲存在這個物件中。
我們可以這個來理解。
我們定義這樣乙個方法
function show()
這個show方法在執行的時候,在裡面有乙個scope,這個變數儲存了乙個指標,這個指標指向了showscope變數,這個變數是作用域變數。這個變數裡面其實就是乙個陣列,這個陣列下標為0的是乙個指標,這個指標指向了show方法的變數物件。
這個變數也是陣列。
這個show方法的變數物件包含arguments,a,c還有乙個this。
每個函式在被呼叫時都會建立自己的執行環境:當執行流進入乙個函式時,函式的環境建立併入棧。執行完後棧將環境推出,把控制權返回給之前的執行環境。
所謂的作用域鏈就是我們上面圖中的showhiscope。當我們執行方法的時候,就是通過查詢作用域鏈來查詢到變數等東西。
當**在乙個環境中執行時,會建立由變數物件構成的作用域鏈(scope chain)。用來保證對執行環境 有權訪問的所有變數和函式的有序訪問。作用域鏈前端始終是當前執行環境的變數物件。全域性執行環境的變數物件始終都是作用域鏈的最後乙個。
五、js函式裡面沒有塊級作用域
function show()
c=111;
alert(c);
}按照常理來說我們在外面是不能訪問到c的,但是在js函式裡面中沒有這種塊級作用域,我們能夠訪問到。
但是在js函式外面是不能訪問到的。在函式外面還是有這種作用域的。
六、引用型別:
引用型別是一種資料結構,用來將資料和功能組織到一起。常被成為「類」。但它不具備傳統物件導向語言所支援的類和介面。
建立object 的兩種方式:1.new 關鍵字var s = new object(); s.name="james"; s.age=27;var s = {}; s.name="james"; s.age=27;
2.物件 字面量表示法var s = ;var s2 = ;
訪問物件屬性:s.name 或 s["name"]使用方括號的有點是可以通過變數來動態訪問屬性var proname="name"; alert(s[proname]);
七、陣列的特點。
js中的array的元素可以是任意型別。長度也是可變的。
下面的棧和佇列都是模擬的
棧:先進後出,push(),pop();
佇列:先進先出,push(0,shift(),unshift().
var arr=new array();
arr.push(1);
arr.push(2);
alert(arr.pop());
alert(arr.pop());
alert(shift())
alert(shift())
分別列印2,1,1,2
陣列的排序:
arr.push(1);
arr.push(3);
arr.push(2);
var s="";
for(i=0;iy) return 1;
else return 0
}然後將這個方法傳到sort方法的引數中。
,reverse()-翻轉(將陣列元素順序倒過來)
concat()—連線陣列的
var colors=["a","b"];
var newcolor=colors.concat("yellow",["c","d"]);
連線成乙個新的陣列。
八、this引用的是函式據以執行操作的物件,也就是 函式在執行時所處的作用域(通俗:就是哪個物件.出了這個函式,那麼函式裡的this就代表哪個物件)
1.當在網頁全域性作用域呼叫函式時,this物件就是window
如: window.color="blue";
var o=;
function saycolor()
scolor();
o.saycolor=saycolor;
o.saycolor();
字段屬性方法你都知道了嗎
欄位的定義由三部分組成 訪問修飾符,欄位的型別和欄位名稱,下面的 給出了字段的定義方法。public class person set 通過屬性來訪問字段,避免了呼叫方法。當屬性僅含有get訪問器,或者set訪問器為private級別時,這樣的屬性稱之為唯讀屬性 當屬性僅包含set訪問器,或者get...
你真的不想理我了嗎?
每天登qq,都會看到你的頭像亮著。心裡的滋味都是怪怪的,你真的不想跟我說話了嗎,真的不想理我了嗎?也許那一天我真的傷害了你,對不起。也許在愛情世界裡沒有誰對誰錯,只有合不合適,我還是覺得有愧於你。兩次主動在qq裡跟你打招呼,你都對我不理不睬,我以後再也不會去煩你了。後悔寒假回家跟你見面,如果沒有見你...
你真的會學習了嗎?
從幼兒園 小學到初高中一直到大學,我們每天都在忙忙碌碌的 學習 學習這個,學習那個。可是,現在給你一道高中物理或者數學題,又有誰可以能夠確保自己在短時間內快速的正確解答出來?也許你會說,到了大學我們都是 術業有專攻 不可能全面兼顧。那好,咱先不說其他的,就說有誰可以將自己大學學的所有課程的名字都一一...