了解JavaScript 對象的屬性操作 -开发者知识库

了解JavaScript 對象的屬性操作 -开发者知识库,第1张

  提起操作, 很多人都會想到我們學習過程中最經常做的操作, 就是對數據庫進行增, 刪, 改, 查, 既然提到這個, 那么對於對象的屬性操作也不例外, 基本上可以說也是這幾個操作.

  JS中對象的屬性標簽

  writable(可寫), enumerable(可枚舉), configurable(可配置), value(值), get/set(get, set方法). 這幾個標簽會在后面逐漸豐富, 這里先簡單介紹下.

  屬性的讀寫

  屬性的讀寫在介紹對象的時候基本已經說的差不多了, 這里補充和總結一下. 這里通過".方法", 或者通過key值的字符串作為索引讀取寫入.

  var object = {

      x : 1,

      y : 2

    };

  document.write(object.x);  // 1

  document.write(object["y"]);  // 2

  object["x"] = 3;

  object.y = 4;

  document.write(object["x"]);  //3

  document.write(object.y);  //4

  遍歷對象屬性

  一般通過for in遍歷對象的屬性, 針對上面的對象, 上代碼說話.

  var p;

  for (p in object){

    if (object.hasOwnProperty(p)){

       document.write(p " : "object[p] "<br />");

    } 

  }

  這段代碼旨在將object上面的全部屬性遍歷出來, 中間加了個判斷, 因為for in是將全部的屬性, 包括原型鏈上的屬性遍歷一遍的, 所以在遍歷對象屬性的時候切記不要忘記了加上判斷.

  undefined的屬性讀寫

  undefined是不具有屬性的, 所以切記不要為undefined設置屬性和讀取屬性.

  屬性的刪除

  delete關鍵字, delete是用來刪除對象的屬性和變量的. 下面演示下其用法, 順便簡單介紹下什么狀態的屬性變量可以刪除, 什么時候不可以.

  var object = {

      x : 1,

      y : 2

    };

  delete object.x;  //true

  delete object["y"];  //true

  document.write(object.x);  //undefined

  document.write(object.y);  //undefined

  上面就是成功通過delete關鍵字刪除了object的屬性, 但是delete這個方法並不是總是很有用, 這里介紹下一個新的概念DontDelete, 這個可以稱之為是一個對象的一個標簽, 如果一個對象創建的時候持有了這個標簽, 那么就不允許被刪除. 

  持有DontDelete的屬性標記情況

  顯式聲明一個變量(全局, 局部), 函數, 對象, 都持有DontDelete

 

  var variable = 1;  //顯式聲明的全局變量

  delete variable;  //false

  

  function func(){};  //顯式聲明的函數

  delete func;  //false

 

  local = 5;  //隱式設置一個全局的屬性

  delete local;  //true

 

  內建對象是自動持有DontDelete標記的, 比如函數內的arguments數組對象, 作為參數數組的內建對象, 是不允許被刪除的.

  通過eval()聲明的變量是可以刪除的, 原因也是在eval中聲明的變量創建時都不會持有DontDelete標記的.

  eval('var variable = 3;');

  variable;  //3

  delete variable;  //true

  綜上所述, 我有一點個人理解, 對錯以后隨着我的認識會回來修改, 畢竟寫東西不就是讓人推翻討論的么, 我認為delete的特性就是在非eval情況下只可以刪除一個已有對象的屬性, 而不可以刪除一段開辟的內存空間, 顯式的聲明變量其實是為變量開辟了一塊內存, 函數, 對象都是如此, 所以這些都不可以刪除, 而對象的屬性, 隱式的全局變量(其實就是上下文中this的屬性), 這些都是一個對象的屬性, 所以他們使可以刪除的. eval是JS的動態特征, 類似於OC的runtime貌似, 還沒有研究的太深, 所以就不深入討論了, 知識有限.

  屬性的檢測

  想要知道一個對象是否具有一個屬性, 有幾個方式進行檢測, 下面會細分.

  in

  如果想要簡單的判斷一個對象及其原型鏈是否具有一個屬性, 只需要使用in操作符, 它的特性就是無論是自身持有, 還是原型鏈持有, 都會返回true.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  'name' in person;  //true, 自身持有

  'hobby' in person;  //false, 自身不持有

  'toString' in person;  //true, 原型鏈持有

  in操作符的左邊通常是一個字符串, 右邊必須是一個對象.

  hasOwnProperty()方法

  這個是僅判斷當前對象是否具有屬性, 它並不會檢測原型鏈上的屬性. 所以如果需要准確的判斷對象自持有哪些屬性, 就選擇使用hasOwnProperty()方法, 參數為屬性名的字符串.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  person.hasOwnProperty('name');  //true, 自身持有

  person.hasOwnProperty('toString');  //false, 原型鏈持有

  Object.keys()方法

  這個方法的作用是將參數對象自身所持有的所有屬性(並不會有原型鏈上的屬性), 展現出來, 方法參數要求是對象.

  var person = {

      name : "JianweiWang",

      age : "23",

    };

  document.write(Object.keys(person));  //name, 23

  

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复