close
文章出處

Delete一個Object的屬性會讓此對象變慢(多耗費15倍的內存)

var o = { x: 'y' };
delete o.x; //此時o會成一個慢對象
o.x; //
 
var o = { x: 'y' };
o = null;  //應該這樣

 

閉包

在閉包中引入閉包外部的變量時,當閉包結束時此對象無法被垃圾回收(GC)。

var a = function() {
  var largeStr = new Array(1000000).join('x');
  return function() {
    return largeStr;
  }
}();

 

DOM泄露

當原有的COM被移除時,子結點引用沒有被移除則無法回收。

var select = document.querySelector;
var treeRef = select('#tree');
 
//在COM樹中leafRef是treeFre的一個子結點
var leafRef = select('#leaf');  
var body = select('body');
 
body.removeChild(treeRef);
 
//#tree不能被回收入,因為treeRef還在
//解決方法:
treeRef = null;
 
//tree還不能被回收,因為葉子結果leafRef還在
leafRef = null;
 
//現在#tree可以被釋放了。

 

Timers計(定)時器泄露

for (var i = 0; i < 90000; i++) {
  var buggyObject = {
    callAgain: function() {
      var ref = this;
      var val = setTimeout(function() {
        ref.callAgain();
      }, 90000);
    }
  }
 
  buggyObject.callAgain();
  //雖然你想回收但是timer還在
  buggyObject = null;
}

 

調試內存

Chrome自帶的內存調試工具可以很方便地查看內存使用情況和內存泄露:

在 Timeline -> Memory 點擊record即可:

 

Object.create(prototype[,descriptors])

這個方法用于創建一個對象,并把其prototype屬性賦值為第一個參數,同時可以設置多個descriptors,關于decriptor下一個方法就會介紹這里先不說。只需要這樣就可以創建一個原型鏈干凈對象了

var o = Object.create({
            "say": function () {
                alert(this.name);
            },
            "name":"Byron"
        });

image

Object.defineProperty(O,Prop,descriptor) / Object.defineProperties(O,descriptors)

想明白這兩個函數必須明白descriptor是什么,在之前的JavaScript中對象字段是對象屬性,是一個鍵值對,而在ECMAScript5中引入property,property有幾個特征

1. value:值,默認是undefined

2. writable:是否是只讀property,默認是false,有點像C#中的const

3. enumerable:是否可以被枚舉(for in),默認false

4. configurable:是否可以被刪除,默認false

同樣可以像C#、Java一樣些get/set,不過這兩個不能和value、writable同時使用

5.get:返回property的值得方法,默認是undefined

6.set:為property設置值的方法,默認是undefined

        Object.defineProperty(o, 'age', {
            value: 24,
            writable: true,
            enumerable: true,
            configurable: true
        });

        Object.defineProperty(o, 'sex', {
            value: 'male',
            writable: false,
            enumerable: false,
            configurable: false
        });

        console.log(o.age); //24
        o.age = 25;

        for (var obj in o) {
            console.log(obj + ' : ' + o[obj]);
            /*
            age : 25  //沒有把sex : male 遍歷出來
            say : function () {
            alert(this.name);
            } 
            name : Byron 
            */
        }
        delete o.age;
        console.log(o.age); //undefined 

        console.log(o.sex); //male
        //o.sex = 'female'; //Cannot assign to read only property 'sex' of #<Object> 
        delete o.age;
        console.log(o.sex); //male ,并沒有被刪除

也可以使用defineProperties方法同時定義多個property,

      Object.defineProperties(o, {
            'age': {
                value: 24,
                writable: true,
                enumerable: true,
                configurable: true
            },
            'sex': {
                value: 'male',
                writable: false,
                enumerable: false,
                configurable: false
            }
        });

 

Object.getOwnPropertyDescriptor(O,property)

 

這個方法用于獲取defineProperty方法設置的property 特性

 

var props = Object.getOwnPropertyDescriptor(o, 'age');
console.log(props); //Object {value: 24, writable: true, enumerable: true, configurable: true}

 

Object.getOwnPropertyNames

獲取所有的屬性名,不包括prototy中的屬性,返回一個數組

console.log(Object.getOwnPropertyNames(o)); //["age", "sex"]

不含病毒。www.avast.com
arrow
arrow
    全站熱搜

    AutoPoster 發表在 痞客邦 留言(0) 人氣()