javascript 密碼花園 並不清晰的js基礎 總結(1)

樓云溪水發表於2018-06-23
直接給 地址 不喜歡看我寫的 可以直接去人家官網去看 bonsaiden.github.io/JavaScript-…

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.prototype
var 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.方法呼叫 this
test.foo(); 這個例子中,this 指向 test 物件。
d.呼叫建構函式
new foo();
如果函式傾向於和 new 關鍵詞一塊使用,則我們稱這個函式是 建構函式。 在函式內部,this 指向新建立的物件。
e.顯式的設定 this
function 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指向 Foo
function 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



相關文章