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

对象属性类型分类:

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. vm ------ 安装

    虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件. 虚拟机最 ...

  2. MySQL 快速添加百万条数据

    需要向数据库添加100W条测试数据,直接在普通表中添加速度太慢,可以使用内存表添加,然后将内存表数据复制到普通表 创建表 # 内存表 DROP TABLE IF EXISTS `test_memory ...

  3. KVM学习

    获取镜像目前大小 # qemu-img info debian.img 添加额外的10G空间到镜像中 # qemu-img resize -f raw debian.img +10GB 注意:并不是所 ...

  4. dotnet中文字符工具类

    支持繁体简体互换. using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  5. VS2019无法安装Android SDK 28的问题

    在一台新电脑上安装VS2019,新建Xamarin.Android项目,反复提示要安装Android SDK Build Tools 28.0.3,在弹出的窗口里点击接受协议,却无法安装SDK. 直接 ...

  6. C#通过字符串分割字符串Split

    string[] strArr = str.Split(new[] {"****==="},StringSplitOptions.None); 更多内容关注公众号 洛水梅家

  7. C# winform 启动外部程序

    //class里面放入这段代码[DllImport("shell32.dll")]public static extern int ShellExecute(IntPtr hwnd ...

  8. moodle3.7中文语言包

    Moodle官方有中文语言包,但是还有没有翻译的,为了提高用户体验,可以将部分未翻译的应用在Moodle网站管理中自己修改. 具体步骤: 先确定需要修改的关键字,也就是网站中没有翻译成中文的文字 在c ...

  9. Logstash——multiline 插件,匹配多行日志

    本文内容 测试数据 字段属性 按多行解析运行时日志 把多行日志解析到字段 参考资料 在处理日志时,除了访问日志外,还要处理运行时日志,该日志大都用程序写的,比如 log4j.运行时日志跟访问日志最大的 ...

  10. English--比较结构

    English|比较结构 接下来让我们一起来透析,英语中的比较结构.各位同学,带上小板凳,要认真哦~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感 ...