1.js 所有變數
都可以當作 物件使用,除了兩個例外 null 和 undefined。
false.toString(); //'false' [1,2,3].toString(); //'1,2,3'2.toString(); 出錯:SyntaxError js解析錯誤 但可以(2).toString()
2.刪除屬性
var obj={bar:1,foo:2}; obj.bar=null; 或 obj.bar=undefined; 並不能真正的刪除屬性, 而僅僅是移除了屬性和值的關聯delete obj.bar//遍歷物件for(var i in obj){if(obj.hasOwnProperty(i)){console.log(i,obj[i]);}}
3. hasOwnProperty
1.是 JavaScript 中唯一一個處理屬性但是不查詢原型鏈的函式Object.prototype.bar = 1; // 修改 Object.prototypevar foo = {moo: 2};for(var i in foo) {console.log(i); // 輸出兩個屬性:bar 和 moo}通過Object.prototype 原型上的 hasOwnProperty 函式 過濾掉(比如 Object.prototype)擴充套件的屬性for(var i in foo) {if (foo.hasOwnProperty(i)) {console.log(i); // 輸出兩個屬性:bar}}重點:推薦總是使用 hasOwnProperty。不要對程式碼執行的環境做任何假設,不要假設原生物件是否已經被擴充套件了。2.JavaScript 不會保護 hasOwnProperty 被非法佔用,因此如果一個物件碰巧存在這個屬性, 就需要使用外部的 hasOwnProperty 函式來獲取正確的結果。var foo = {hasOwnProperty: function() {return false;},bar: 'Here be dragons'};foo.hasOwnProperty('bar'); // 總是返回 false({}).hasOwnProperty.call(foo, 'bar'); // true
4.this 的工作原理
this 的處理機制。 在五種不同的情況下 ,this 指向的各不相同。
a.全域性範圍內 this;當在全部範圍內使用 this,它將會指向全域性物件。(瀏覽器中全域性物件 window)b.函式呼叫
foo(); 這裡 this 也會指向全域性物件。c.方法呼叫 thistest.foo(); 這個例子中,this 指向 test 物件。d.呼叫建構函式
new foo();
如果函式傾向於和 new 關鍵詞一塊使用,則我們稱這個函式是 建構函式。 在函式內部,this 指向新建立的物件。e.顯式的設定 thisfunction foo(a, b, c) {}var bar = {};foo.apply(bar, [1, 2, 3]); // 陣列將會被擴充套件,如下所示foo.call(bar, 1, 2, 3); // 傳遞到foo的引數是:a = 1, b = 2, c = 3當使用 Function.prototype 上的 call 或者 apply 方法時,函式內的 this 將會被 顯式設定為函式呼叫的第一個引數。函式呼叫的規則在上例中已經不適用了,在foo 函式內 this 被設定成了 bar。重點:常見誤解Foo.method = function() {// this 方法呼叫 this指向 Foofunction test() {// this 將會被設定為全域性物件(譯者注:瀏覽器環境中也就是 window 物件)}test();}//test 中獲取對 Foo 物件的引用,我們需要在 method 函式內部建立一個區域性變數指向 Foo 物件
Foo.method = function() {
var that = this;
function test() {
// 使用 that 來指向 Foo 物件
}
test();
}
特殊:
方法的賦值表示式 一個方法賦值給一個變數 如:
var test = someObject.methodTest;
test();
上例中,test 就像一個普通的函式被呼叫;因此,函式內的 this 將不再被指向到 someObject 物件。
this 的晚繫結特性似乎並不友好,但這確實是基於原型繼承賴以生存的土壤。
function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = Foo.prototype;
new Bar().method();
當 method 被呼叫時,this 將會指向 Bar 的例項物件。
5.閉包
閉包是函式,是函式內定義的函式,因為它能訪問父級函式內的內部變數 所以取了個名字叫閉包
閉包就是能夠讀取其他函式內部變數的函式
在本質上,閉包是將函式內部和函式外部連線起來的橋樑
所以函式的這些閉包 都會被return 出去
因為 函式 是 JavaScript 中唯一擁有自身作用域的結構,因此閉包的建立依賴於函式。
a.模擬私有變數
function fatherfn(start){var i=start;return{child_a:function(){i++;},child_b:function(){return i;}}}var fa=fatherfn(4);fa.child_a();fa.child_b(); //5