ja对象属性—枚举、检查、删除

前言

  我们经常需要操作对象的属性。这里记录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

ja对象属性—枚举、检查、删除的相关文章

JavaScript服务器编程(对象属性枚举中应当避免原型污染问题)

前面文章中讨论了JS开发中对象属性枚举的ES3和ES5方案并给出了一组常用工具函数,其实,企业开发中真正应用时还存在不少问题.本文想基于前文进一步探讨一下有关原型污染的问题.由于JS的先天不足,有关原型污染背后隐藏着一个大的"故事",以后我们的文章中还要涉及其中一些情节. 问题 前面在讨论使用in运算符检测对象中是否存在属性的方案,但是通过所举的示例也发现一个问题,例如: console.log('"ID" in contacts: ',"ID"

JS 对象属性相关--检查属性、枚举属性等

1.删除属性 delete运算符可以删除对象的属性 delete person.age //即person不再有属性age delete person['age'] //或者这样 delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性  看到delete a.p之后b.x仍然为1 var a = {p:{x:1}}; var b = a.p; console.log(a.p.x); //1 delete a.p; console.log(a.p.x); //TypeError a.p

对象属性的可枚举性

JavaScript中对象的属性分为两种:数据属性和访问器属性.然后根据具体的上下文环境的不同,又可以将属性分为:原型属性和实例属性.原型属性是定义在对象的原型(prototype)中的属性,而实例属性一方面来自构造的函数中,然后就是构造函数实例化后添加的新属性. 在JavaScript中除了检测对象的属性是否存在,还会经常对对象的属性进行遍历(枚举).而在JavaScript中遍历一个对象的属性并不太简单,主要有两个原因: JavaScript中的对象通常都处在某个原型链中,它会从一个或多个的

javascript 对象属性的添加,删除,json对象和字符串转换方法等

1:动态添加 对象属性 var obj = new Object(); console.log (obj.username); obj.username = "haha"; console.log (obj.username); //undefined //haha 用"[]"表示.写成 obj["username"] = "haha"; var obj = new Object(); console.log (obj.use

JavaScript服务器端开发技术(对象属性的枚举与查询)

既然对象是属性的集合,那么检测与枚举集合中的属性就是一项重要任务.对此,我们来分别看一下ES3和ES5提供的解决方案. 1)     ES3枚举方案 示例代码: var contacts={ ID:[0,1,2,3,4,5], names:["Zero","One","Two","Three","Four","Five"], addresses:[ { Street:"ABC&

JavaScript中对象属性的添加和删除

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 用.为对象添加属性 用关键字delete删除属性 用[]添加属性 和.的不同 r.name==r["name"]; r.

Vue &amp;&amp; Angular 双向绑定检测不到对象属性的添加和删除

由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都setter和getter进去了. 两个实现的机制不一样.故解决方案也不一样. 详情查看:https://cn.vuejs.org/v2/guide/list.html#对象更改检测注意事项 Angular解决方案: 可以手动调用$apply()方法,会再自动轮询一遍 Vue解决方案: 使用vm.$set(对象

JS delete 用法(删除对象属性及变量)

1,对象属性删除 function fun(){ this.name = 'mm'; } var obj = new fun(); console.log(obj.name);//mm delete obj.name; console.log(obj.name); //undefined 2,变量删除 var name = 'lily'; delete name; console.log(name); //lily 直接用delelte删除不了变量 3,删除不了原型链中的变量 fun.proto

C#利用反射检查对象属性是否满足正则特性

有时对象的属性需要满足某些正则,若是单独创建方法去一个个验证这些正则太过麻烦,这时我们可以给属性添加正则特性,如下: public class student { [RegularExpression(@"^[a-zA-Z]{1,20}$", ErrorMessage = "英文姓名必须是英文字符,且长度小于20!")] public string EName { get; set; } } 可是有时候对象实例的生成会绕过这些正则检查,例如直接从Excel里数据流写