首页 > 其他分享 >属性遍历那些事儿:从入门到精通,笑谈间掌握技巧

属性遍历那些事儿:从入门到精通,笑谈间掌握技巧

时间:2024-03-26 09:04:55浏览次数:24  
标签:遍历 入门 Symbol Object ins person attr 笑谈 属性

1. 属性的分类

  • 普通属性
  • 原型属性
  • 不可枚举属性
  • Symbol 属性
  • 静态属性 ??

我们先来看看下面这个对象。

const symbolIsAnimal = Symbol.for("pro_symbol_attr_isAnimal");
const symbolSay = Symbol.for("pro_symbol_method_say");
const symbolSalary = Symbol.for("ins_symbol_attr_salary");

function Person(age, name){
    this.ins_in_attr_age = age;
    this.ins_in_attr_name = name;

    this.ins_in_method_walk = function () {
        console.log("ins_method_walk");
    }
}


// 原型方法
Person.prototype.pro_method_say = function(words){
    console.log("pro_method_say:", words);
}
Person.prototype[symbolSay] = function(words){
    console.log("pro_symbol_method_say", words);
}


// 原型属性
Person.prototype[symbolIsAnimal] = true;
Person.prototype.pro_attr_isAnimal = true;

const person = new Person(100, "程序员");

    //Symbol 属性
person[symbolSalary] = 6000;
person["ins_no_enumerable_attr_sex"] = "男";


// sex 不可枚举
Object.defineProperty(person, "ins_no_enumerable_attr_sex", {
    enumerable: false
});

Object.defineProperty(person, symbolSalary, {
    enumerable: false, // 无效的设置 
    value: 999
});

我们来归类下,这些都属于哪些属性分类。

了解属性分类以后,让我们再想想 我们又如何获取person 对象的所有属性呢??

遍历对象的属性

1. for in

for(let i in person){
    console.log("for in===",i);
}

// for in=== ins_in_attr_age
// for in=== ins_in_attr_name
// for in=== ins_in_method_walk
// for in=== pro_method_say
// for in=== pro_attr_isAnimal

可遍历原型上的属性键以及普通属性键,不可枚举的属性和Symbol属性除外。

2. Object.keys

const keys=Object.keys(person);

console.log("Object.keys==",keys)

// Object.keys== [ 'ins_in_attr_age', 'ins_in_attr_name', 'ins_in_method_walk' ]Object.keys== [ 'age', 'name', 'walk' ]

返回的是所有可枚举属性键,也就是属性下的enumerable: true。但不包括Symbol值作为名称的属性键。

3. Object.getOwnPropertyNames

const names=Object.getOwnPropertyNames(person);
console.log("Object.getOwnPropertyNames==",names);

//
// Object.getOwnPropertyNames== [
//  'ins_in_attr_age',
//  'ins_in_attr_name',
//  'ins_in_method_walk',
//  'ins_no_enumerable_attr_sex'
// ]

返回对象所有普通属性键 ,包括不可枚举属性但不包括Symbol值作为名称的属性键和原型属性。

4. Object.getOwnPropertySymbols

    //Symbol 属性
person[symbolSalary] = 6000;

Object.defineProperty(person, symbolSalary, {
    enumerable: false, // 无效的设置 
    value: 999
});

const keys=Object.getOwnPropertySymbols(person);
console.log("Object.getOwnPropertySymbols==",keys);
console.log("描述符是否生效==",person[symbolSalary])


// Object.getOwnPropertySymbols== [ Symbol(ins_symbol_attr_salary) ]
// 描述符是否生效== 999

返回一个给定对象自身的所有 Symbol 属性键的数组。包括不可枚举的Symbol属性。只限Symbol。

5. Reflect.ownKeys

const names=Reflect.ownKeys(person);
console.log("Object.getOwnPropertySymbols==",names);

// Reflect.ownKeys== [
//  'ins_in_attr_age',
//  'ins_in_attr_name',
//  'ins_in_method_walk',
//  'ins_no_enumerable_attr_sex',
//   Symbol(ins_symbol_attr_salary)
// ]

返回一个由目标对象自身的属性键组成的数组。等同于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))。

6. for of

for…of 循环仅适用于可迭代的对象。 而普通对象不可迭代。在 ES6 中引入的 for…of 循环,以替代 for…in 和 forEach() ,并支持新的迭代协议。for…of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。

const obj = { fname: 'foo', lname: 'bar' };
 
for (const value of obj) { // TypeError: obj[Symbol.iterator] is not a function
    console.log(value);
}
const array = ['foo', 'bar', 'baz'];
 

// sex 不可枚举
Object.defineProperty(array, "0", {
    enumerable: false,
    writable:false
});

array[0]="apple";

for(let i of array){
    console.log("for of===",i);
}
console.log("=====分割=========");
for(let i in array){
    console.log("for in===",i);
}



// for of=== foo
// for of=== bar
// for of=== baz
// =====分割=========
// for in=== 1
// for in=== 2
 

我们通过对比for in 可以很清楚的看到 0 索引的不可枚举属性已经生效。

可遍历普通属性值,包含不可枚举属性值,不能遍历原型上的值。

总结

方法名普通属性不可枚举属性Symbol属性原型属性
for in
Object.keys
Object.getOwnPropertyNames
Object.getOwnPropertySymbols✔(Symbol)
Reflect.ownKeys
  1. for of 获得的是属性值,不是属性键
  2. 能遍历到原型属性的只有 for in
  3. Reflect.ownKeys 综合来看是最强大的
  4. for of一般不能遍历对象,,如果实现了Symbol.iterator,可以遍历。 如Array,Map,Set,String,TypedArray,arguments 对象等等

综合来看Relect.ownKeys功能强大,能取到Symbol和普通属性,不可枚举的属性也能获取。 但属性复制的时候经常采用的是 for in + Object.hasOwnProperty 双层判断。

写在最后

不忘初衷,有所得,而不为所累,如果你觉得不错,你的一赞一评就是我前行的最大动力。

微信公众号:成长的程序世界 ,关注之后,海量电子书,打包拿走不送。

或者添加我的微信 dirge-cloud,一起学习。

标签:遍历,入门,Symbol,Object,ins,person,attr,笑谈,属性
From: https://blog.csdn.net/u012397879/article/details/137028608

相关文章

  • GEE入门及进阶教程|在 Earth Engine 中绘制图像集合
            在前面的内容中,我们计算了增强植被指数(EVI),以说明卫星图像上的波段运算,代码在单个图像上被调用一次。如果我们想以相同的方式计算整个ImageCollection中的每个图像的EVI,该怎么办?在这里,我们使用EarthEngine工作流程第二部分的关键工具,即.map命令。......
  • 微信小程序开发【从入门到精通】——消息提示栏
    ......
  • 第 8 场 小白入门赛
    第8场小白入门赛比赛链接最后一次小白赛了,之后要打强者赛咯坤星球思路2024*2.5(小黑子题????)代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineall(x)x.begin()+1,x.end()voidsolve(){ cout<<2024*2.5<<endl; return; }sig......
  • 入门【网络安全/黑客】启蒙教程
    01什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有W......
  • .NET Emit 入门教程:第四部分:构建类型(Type)
    前言:在动态生成代码的过程中,构建类型(Type)是至关重要的一步。通过使用Emit中的TypeBuilder,我们可以定义和创建各种类型,包括类、结构体和接口。本节将深入探讨如何使用TypeBuilder动态构建类型,并介绍其在实际应用中的重要性。定义公用代码,生成程序集以供对照:通过学习本系......
  • Python基础入门 --- 8.文件
    文章目录第八章:8.文件8.1文件的编码8.2文件的读取8.2.1open()打开函数8.2.2读取函数read()readlines()readline()for循环读取文件行8.2.3文件关闭函数close()withopen()8.2.4总结:8.3文件的写入8.4文件的追加8.5文件操作综合案例第八章:8.文件8.1文件......
  • openGauss社区入门(openGauss-常用数据类型)
    常用数据类型数据类型 说明布尔类型 booleantrue/'1'/'yes'false/'0'/'no'数值类型 smallint两字节int4字节bigint8字节double/real浮点型money货币(两位小数||字符类型|varchar(n几位数)/char/text||二进制|bytea||位串类型|一串0、1bit(n)/bit......
  • Node.js新手必备:超实用命令行入门教程
    1.安装Node.js和npm首先,我们需要下载并安装Node.js,它自带了npm(NodePackageManager)。安装完成后,在命令行输入:node-vnpm-v这两个命令分别显示已安装的Node.js和npm版本,确认安装成功。2.初始化新项目npminit按照提示填写相关信息后,npm会帮你生成一个package.json......
  • 【go从入门到精通】闭包和陷阱
     作者简介:    高科,先后在IBMPlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。(谢谢你的关注) -------------......
  • 电路入门 ---- 基本放大电路
    1放大的概念2放大电路的性能指标放大电路的性能指标是评估其放大功能和效率的重要参数。以下是一些常见的放大电路性能指标:2.1增益(Gain)增益是衡量放大电路放大效果的重要指标,表示输出信号幅度与输入信号幅度之间的比例关系。增益可以分为电压增益、电流增益和功率增益等不......