前言
我们经常需要操作对象的属性。这里记录ES5中操作对象属性的API和它们之间的差异。
枚举属性
for/in遍历对象中的所有可枚举属性(包括自有属性和继承属性)
var obj = {name:"小花",age:18}; var obj2 = Object.create(obj); obj2.like = "骨头"; for(item in obj2){ // 将obj中的所有可枚举属性名以字符串形式分别赋值给itemtypeof item; => string console.log(obj2[item]); =>小花,骨头,18 }// 跳过继承属性和方法for(item in obj){ // 是继承属性或者方法就跳过此次循环。 if(!obj.hasOwnproperty(item) || typeof obj[item] === "function"){ continue; } }
object.key():返回一个数组,这个数组由对象中可枚举的自有属性名称组成。
var data = { balabala1:"x", balabala2:"y", balabala3:"z", } Object.keys(data).map(function(item){ // item:自有属性名称 obj[item]:属性值 console.log(data[item]); })
Object.getOwnpropertyNames():返回包含所有自有属性名称的列表,包括不可枚举的。
检测属性
in运算符:左侧是字符串形式的属性名称,右侧是对象。如果对象或者对象的继承属性中有这个属性就返回true。
var obj = {name:"小花"}; console.log("name" in obj );
Object.hasOwnProperty():接收一个字符串形式的属性名,检测是否是对象的自有属性,继承属性会返回false
propertyIsEnumerable():hasOwnProperty的增强版本,只有当这个属性是自有属性并且可枚举的时候才会返回true
删除属性
delete可以删除对象的属性。他的操作数应该是一个属性访问表达式。
delete 语句返回值类型是Boolean。
// 返回true的情况 o = {x:1}; // o有一个自有属性x 并继承了toString属性 delete o.x; // 删除x返回true delete o.x; // 此时o中已经没有x属性了,o.x=》undefined。等同 delete undefined; delete o.toString; // 删除不了原型中继承来的属性。同样返回true // 返回false delete Object.prototype; // 属性不可配置,不能删除 var i = 0; // 声明一个全局变量 delete i; this.i; // 无法删除全局变量的属性 function f(){}; // 声明一个全局函数 delete f; this.f // 也无法删除全局函数
delete的行为有些怪异,有几点需要注意:
1,它只是断开属性和对象的联系,不会取操作属性中的属性。
2,只能删除自有属性。
3,无法删除不可配置的属性。
4,无法删除原型属性。
5,就算其后的属性访问表达式的值是undefined 它返回的也是true。
原文地址:https://www.cnblogs.com/keliguicang/p/10960481.html
时间: 2024-11-05 16:23:46