js你真的知道了嗎?(三)

2022-05-06 11:24:09 字數 4780 閱讀 5157

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裡跟你打招呼,你都對我不理不睬,我以後再也不會去煩你了。後悔寒假回家跟你見面,如果沒有見你...

你真的會學習了嗎?

從幼兒園 小學到初高中一直到大學,我們每天都在忙忙碌碌的 學習 學習這個,學習那個。可是,現在給你一道高中物理或者數學題,又有誰可以能夠確保自己在短時間內快速的正確解答出來?也許你會說,到了大學我們都是 術業有專攻 不可能全面兼顧。那好,咱先不說其他的,就說有誰可以將自己大學學的所有課程的名字都一一...