JavaScript 備忘筆記

  • ECMAScript 中也沒有函數簽名的概念,因爲其函數參數是以一個包含零或多個值的數組的形式傳遞的。 
  • 可以向 ECMAScript 函數傳遞任意數量的參數,並且可以通過 arguments 對象來訪問這些參數。  
  • 由於不存在函數簽名的特性,ECMAScript 函數不能重載。通過檢查傳入函數中參數的類型和數量並作出不同的反應,可以模仿方法的重載。
  • 爲了證明參數 對象是按值傳遞的,我們再看一看下面這個經過修改的例子: 
  • js中是按值傳遞的
  • function setName(obj) { 
        obj.name = "Nicholas"; 
        obj = new Object(); 
        obj.name = "Greg"; 
        } 
    var person = new Object(); 
    setName(person); 
    alert(person.name); //"Nicholas"
 這個例子與前一個例子的唯一區別,就是在 setName()函數中添加了兩行代碼:一行代碼爲 obj 重新定義了一個對象,另一行代碼爲該對象定義了一個帶有不同值的 name 屬性。在把 person 傳遞給 setName()後,其 name 屬性被設置爲"Nicholas"。然後,又將一個新對象賦給變量 obj,同時將其 name 屬性設置爲"Greg"。如果 person 是按引用傳遞的,那麼 person 就會自動被修改爲指向其 name 屬性值 爲"Greg"的新對象。但是,當接下來再訪問person.name 時,顯示的值仍然是"Nicholas"。這說明 即使在函數內部修改了參數的值,但原始的引用仍然保持未變。實際上,當在函數內部重寫 obj 時,這 個變量引用的就是一個局部對象了。而這個局部對象會在函數執行完畢後立即被銷燬。
  • 組合使用構造函數模式和原型模式 
創建自定義類型的最常見方式,就是組合使用構造函數模式與原型模式。構造函數模式用於定義實 例屬性,而原型模式用於定義方法和共享的屬性。結果,每個實例都會有自己的一份實例屬性的副本, 但同時又共享着對方法的引用,最大限度地節省了內存。另外,這種混成模式還支持向構造函數傳遞參 數;可謂是集兩種模式之長。下面的代碼重寫了前面的例子。 
function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Shelby", "Court"];
}
Person.prototype = {
    constructor : Person,
    sayName : function(){
        alert(this.name);
    }
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van”
alert(person2.friends); //"Shelby,Count”
alert(person1.friends === person2.friends); //false
alert(person1.sayName === person2.sayName); //true
在這個例子中,實例屬性都是在構造函數中定義的,而由所有實例共享的屬性 constructor 和方法 sayName()則是在原型中定義的。而修改了 person1.friends(向其中添加一個新字符串),並不會影響到 person2.friends,因爲它們分別引用了不同的數組。 這種構造函數與原型混成的模式,是目前在 ECMAScript 中使用最廣泛、認同度最高的一種創建自定義類型的方法。可以說,這是用來定義引用類型的一種默認模式。

  • 數組去重
//js對象實際上是哈希表
let signaling = {};
//利用對象的特性,組織不重複的protocol.message數據到data的"signaling"屬性包含的對象數組中data_tem.forEach((o, p, q) => {
    if (!signaling[q[p].protocol + '.' + q[p].message]) {
        signaling[q[p].protocol + '.' + q[p].message] = q[p].protocol + '.' + q[p].message;

  • 尤雨溪:真正會導致上下行解析出問題的 token 有 5 個:括號,方括號,正則開頭的斜槓,加號,減號。我還從沒見過實際代碼中用正則、加號、減號作爲行首的情況,所以總結下來就是一句話:一行開頭是括號或者方括號的時候加上分號就可以了,其他時候全部不需要。其實即使是這兩種情況,在實際代碼中也頗爲少見。

  • 對象深拷貝
推薦使用框架 lodash 的 _.cloneDeep(value) 方法。
我常用的兩種方法:
第一種:
obj = JSON.parse(JSON.stringify(o));
這種方法有弊端,已知一個包含Date()數據時在轉換過程中會變成字符串;
第二種:
  //deepCopyvardeepCopy = function(source) {
 var result;
  (source instanceof Array) ? (result = []) : (result = {});

 for (varkey in source) {
    result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key];
  }
 return result;
};

ES 6 中數組深拷貝:
const a1 = [1, 2];
const a2 = [...a1];

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章