javascript
了解JavaScript 对象的属性操作
提起操作, 很多人都會想到我們學習過程中最經常做的操作, 就是對數據庫進行增, 刪, 改, 查, 既然提到這個, 那么對于對象的屬性操作也不例外, 基本上可以說也是這幾個操作.
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
轉載于:https://www.cnblogs.com/JianweiWang/p/5213843.html
總結
以上是生活随笔為你收集整理的了解JavaScript 对象的属性操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ 3171】 [Tjoi201
- 下一篇: 遍历map几种方式及应用