1.原始值與引用值
原始值存放在堆疊裡, 引用值存放在堆裡. 如程式:
複製代碼代碼如下:
function Person(id,name,age){
this.id = id;
this.name = name;
this.age = age;
}
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"笨蛋的座右銘",25);
2.undefined和null
undefined: 變數未定義; 是Undefined類型的專屬值;
null:引用未指派; 是Null類型的專屬值.
typeof(undefined) == undefined;
typeof(null) == object;
undefined==null;
undefined!==null;
null instanceof Object == false;
undefined instanceof Object == false;
雖然有Undefined和Null類型, 但是透過下面的例子說明這兩個類型是不可見的, 也就是說我們只能使用他們的值:
alert(undefined instanceof Undefined);
alert(null instanceof Null);
3.偽數組
特點:
1) 具有length屬性;
2) 像數組一樣按索引順序存取資料;
3) 不具備陣列特有的操作資料的方法如push, pop, slice...
偽數組都可以透過Array.prototype.slice轉換為真正的陣列:
var faceArray = {0: 'a', 1: 'b', length: 2}//標準的偽數組;
var realArray = Array.prototype.slice.call(fakeArray);
js中的偽數組:arguments, node.childNodes, document.getElementsByd;
IE中的問題: IE中node.childNodes是不能用slice轉換的.
Jquery中的偽數組: Jquery本身就是一個偽數組:
alert($('.class1').length); alert($('.class1').[0].tagName);
4.關於簡單類型的字面量
var a = 1; b = true, c = "ccc";
字面量看起來有類型
alert(typeof a);//number
alert(typeof b);//boolean
alert(typeof c);//string
但是透過instanceof卻測不出來
alert(a instanceof Number)//false
alert(a instanceof Object)//false
alert(b instanceof Boolean)//false
alert(b instanceof Object)//false
alert(c instanceof String)//false
alert(c instanceof Object)//false
5.函數的prototype屬性與物件實例的內部prototype屬性
每個function(建構子)都有一個prototype屬性, 每個物件實例都有一個不可見的(mozilla把它公開了, 可以透過__proto__來取得)內部的prototype屬性, 它指向建構子的prototype屬性. prototype還可以有它自己的prototype屬性, 這構成了prototype鏈, Object是最頂的對象, 所以所有的prototype鏈最終會指向Object.prototype. 當訪問對象實例的屬性/方法的時候,從物件實例自己開始搜尋, 若果實搜尋不到, 沿著prototype鏈向上搜尋, 直到Object.prototype.prototype == null 為止.
6.構造函數的一個小秘密
複製代碼代碼如下:
var s = new function(){return "sss"};
alert(s);//[object Object]
s = new function(){return new String("sss")};
alert(s);//sss
關於這段程式碼的解釋:
只要new 表達式之後的constructor 返回(return)一個引用對象(數組,對象,函數等),都將覆蓋new創建的匿名對象,如果返回(return)一個原始類型(無return 時其實為return 原始類型undefined ),那麼就返回new 創建的匿名物件.
7.物件的創建的過程
複製代碼代碼如下:
function Person(name){
this.name = name;
}
Person.prototype = {
getName: function(){return this.name}
};
var p = new Person('zhangsan');
解密p的建立過程:
◦創建一個build-in object物件obj並初始化;
◦將p的內部[[Prototype]]指向Person.prototype;
◦將p作為this,使用arguments參數呼叫Person的內部[[Call]]方法, 即執行Person函數本體, 並返回回傳值, 如果沒有return, 則回傳undefined;
◦如果前一步回傳的是Object型別, 則回傳這個值給p, 否則回傳obj.
8.物件的自有屬性和繼承屬性
複製代碼代碼如下:
function Person(name){
this.name = name;
}
Person.prototype = {
type: 'human',
getName: function(){return this.name}
};
var p = new Person('zhangsan');
alert(p.hasOwnProperty('type'));//false
p.type = 'ren';
alert(p.hasOwnProperty('type'));//true
運行結果很明確,物件的屬性無法修改其原型中的同名屬性,而只會自行建立一個同名屬性並為其賦值。
9.函數物件的創建過程
建立一個build-in object物件fn;
將fn的內部[[Prototype]]設為Function.prototype;
設定內部的[[Call]]屬性,它是內部實作的一個方法,處理函數呼叫的邏輯。 (簡單的理解為指向函數體);
設定fn.length為funArgs.length,如果函數沒有參數,則將fn.length設為0;
fn.prototype的constructor指向fn自己;
返回fn.
10.instanceof的原理
看a是不是B的實例, 就是看B的prototype(建構子的prototype屬性)指向的物件在不在a的原形鏈上.
11.關於Function和Object的猜測
alert(Function instanceof Function);//true
alert(Function instanceof Object);//true
alert(Object instanceof Function);//true
alert(Object instanceof Object);//true
想了好久, 沒有想透......