最近面试遇到问如何获取对象全部属性名的方法,总结一下:

对象属性类型分类:

1.ESMAScript分类

  1. 数据类型 又分为可枚举和不可枚举类型
  2. 访问器类型

2.上下文分类

  1. 原型属性
  2. 实例属性

1.列举自身但不包括原型的可枚举属性名 Object.keys(obj)

  1. // 遍历对象
  2. function Person(name, age) {
  3. this.name = name;
  4. this.age = age;
  5. }
  6. Person.prototype.demo = function() {};
  7. let cj = new Person('cj', 25);
  8. // 通过Object.defineProperty定义一个不可枚举属性
  9. Object.defineProperty(cj, 'weight', {
  10. enumerable:false
  11. })
  12. // enumerable = true
  13. // console.log(Object.keys(cj)) // name age
  14. // enumerable = false
  15. // console.log(Object.keys(cj)) // name age weight

2.列举包括自身不可枚举但不包括原型的属性名 Object.getOwnPropertyNames(obj)

  1. function Person(name, age) {
  2. this.name = name;
  3. this.age = age;
  4. }
  5. // 设置原型属性
  6. Person.prototype.demo = function() {};
  7. let cj = new Person('cj', 25);
  8. // 通过Object.defineProperty定义一个不可枚举属性
  9. Object.defineProperty(cj, 'weight', {
  10. enumerable:false
  11. })
  12. // 获取属性名
  13. console.log(Object.getOwnPropertyNames(cj)) // name age weight

3.获取自身和原型链上的可枚举属性 for in 返回的顺序可能与定义顺序不一致

  1. function Person(name, age) {
  2. this.name = name;
  3. this.age = age;
  4. }
  5. // 设置原型属性
  6. Person.prototype.demo = function() {};
  7. Object.prototype.j = 1
  8. let cj = new Person('cj', 25);
  9. // 通过Object.defineProperty定义一个不可枚举属性
  10. Object.defineProperty(cj, 'weight', {
  11. enumerable:false
  12. })
  13. let props = []
  14. for(prop in cj){
  15. props.push(prop)
  16. }
  17. console.log(props) //name age weight j

4.获取自身Symbol属性 Object.getOwnPropertySymbols(obj)

  1. let obj = {};
  2. // 为对象本身添加Symbol属性名
  3. let a = Symbol("a");
  4. obj[a] = "localSymbol";
  5. // 为对象原型添加Symbol属性名
  6. let b = Symbol("b")
  7. Object.prototype[b] = 111
  8. let objectSymbols = Object.getOwnPropertySymbols(obj);
  9. console.log(objectSymbols); //Symbol(a)

5.获取自身包括不可枚举和Symbol属性名,但不包括原型 Reflect.ownKeys(obj)

  1. // 遍历对象
  2. function Person(name, age) {
  3. this.name = name;
  4. this.age = age;
  5. }
  6. Person.prototype.demo = function() {};
  7. let s = Symbol('s')
  8. let cj = new Person('cj', 25);
  9. // 通过Object.defineProperty定义一个不可枚举属性
  10. Object.defineProperty(cj, 'weight', {
  11. enumerable: false
  12. })
  13. cj[s] = 1
  14. let a = Symbol('a')
  15. Object.prototype[a] = 1
  16. console.log(Object.getOwnPropertyNames(cj)) //name age weight
  17. console.log(Reflect.ownKeys(cj)) //name age weight Symbol(s)

JS获取对象属性名小结的更多相关文章

  1. js 获取对象属性个数

    js 获取对象属性个数 方法一: var attributeCount = function(obj) { var count = 0; for(var i in obj) { if(obj.hasO ...

  2. js获取对象属性的两种方法,object.属性名,[‘属性名’ ]

    1.通过点的方式 2.通过括号的方式 例: <input type="text" value="hello" id="text"/&g ...

  3. JS获取对象“属性和方法”的方法

    平时在写的代码过程中,经常会遇到对对象Object的数据处理.而在对对象的数据处理中,操作最频繁的是“数据引用”.“值的修改”.“获取关键字(属性)”.平时最烦的也是“获取关键字”,经常忘记怎么去获取 ...

  4. JS获取对象“属性”的方法

    var testObj= new Object(); testObj.name = "shangguan"; testObj.age= ; testObj.action = fun ...

  5. js 更改对象属性名

    来自:https://segmentfault.com/q/1010000011923504 侵删 [ { "Id":"3972679ef2c04151972b376dd ...

  6. js 获取 对象 属性名称(转载)

    来源:https://www.cnblogs.com/YuyuanNo1/p/9257634.html dataObj = {name : su,age : 26,height : 18cm }; f ...

  7. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  8. js获取对象的属性个数

    for (var i = 0; i < dt.length; i++) { if (Object.keys(dt[i]).length <= 1) { dt.splice(i, 1); i ...

  9. JS 对象属性名排序

    问题,对象属性名排序,如: var data = { A:[], D:[], B:{} } 调整为=> var data = { A:[], B:[], D:{} } 方法一: for,in,把 ...

随机推荐

  1. 服务器个人环境下pytorch0.4.1编译warp-ctc遇到的问题及解决方法

    一.关于warp-ctc CTC可以生成一个损失函数,用于在序列数据上进行监督式学习,不需要对齐输入数据及标签,经常连接在一个RNN网络的末端,训练端到端的语音或文本识别系统.CTC论文 CTC网络的 ...

  2. mongodb 更新数据时int32变为double的解决办法

       场景: 在命令手动的修改签到表的整型字段synState,multi参数是可以更新多条,如果是false则更新一条. db.getCollection("ClassRecordOneD ...

  3. Java反射复习

    三种实例化对象: 1.Class<?> cls = Class.forName("java.util.Date") ; *** System.out.println(c ...

  4. layui 在页面弹出小窗口,并关闭

    function showdialog() { layer.open({  type: 2,  title: '发起调度', shadeClose: true, shade: 0.8, area: [ ...

  5. ASP.NET Core中使用MialKit实现邮件发送

    # 导包 首先我们需要导入 MailKit NuGet包,NuGet安装包命令在下方拓展介绍中. # 引用命名空间 using MailKit.Net.Smtp; using MimeKit; # 邮 ...

  6. 在 VSCode 调试过程中,使用 Watcher,免手动重新编译

    1.安装Microsoft.DotNet.Watcher.Tools包 dotnet add package Microsoft.DotNet.Watcher.Tools --version 2.0. ...

  7. validateField方法对部分表单字段进行校验

    原文:https://blog.csdn.net/qq_37782076/article/details/85123602 代码 <template> <div class=&quo ...

  8. 设计模式之(十四)责任链模式(Chain of Responsibility)

    在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...

  9. android studio学习---签名打包的两种方式

    注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如果不知道签名是啥意思, ...

  10. 互联网企业级监控系统 OpenFalcon

    Open-Falcon 人性化的互联网企业级监控系统,Open-Falcon 整体可以分为两部分,即绘图组件.告警组件.其中: 安装绘图组件 负责数据的采集.收集.存储.归档.采样.查询.展示(Das ...