当前位置: 首页 > news >正文

javascript中的可枚举属性与不可枚举属性

JavaScript中的可枚举属性与不可枚举属性
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性能否被for…in查找遍历到。

一、怎么判断属性是否可枚举

js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等,如果你写出这样的代码遍历其中的属性:

var num = new Number();
for(var pro in num) {
    console.log("num." + pro + " = " + num[pro]);
}

它的输出结果会是空。这是因为Number中内置的属性是不可枚举的,所以不能被for…in访问到。

Object对象的propertyIsEnumerable()方法可以判断此对象是否包含某个属性,并且这个属性是否可枚举。
需要注意的是:如果判断的属性存在于Object对象的原型内,不管它是否可枚举都会返回false。

二、枚举性的作用

属性的枚举性会影响以下三个函数的结果:

for…in

Object.keys()

JSON.stringify

先看一个例子,按如下方法创建kxy对象:

function Person() {
    this.name = "KXY";
}
Person.prototype = {
    constructor: Person,
    job: "student",
};

var kxy = new Person();
Object.defineProperty(kxy, "sex", {
    value: "female",
    enumerable: false
});

其中用defineProperty为对象定义了一个名为”sex”的不可枚举属性

接下来做以下验证:

for(var pro in kxy) {
    console.log("kxy." + pro + " = " + kxy[pro]);
  }

遍历结果:可以看到除了”sex“之外的属性都遍历到了

console.log(Object.keys(kxy));

结果:只包含”name”属性,说明该方法只能返回对象本身具有的可枚举属性

console.log(JSON.stringify(kxy));

结果:此方法也只能读取对象本身的可枚举属性,并序列化为JSON对象。

相关文章:

  • javascript中的对象序列化
  • javascript中改变this的指向
  • css中的px、em 、rem的区别
  • 深入理解js中的闭包
  • Form表单只提交数据而不进行页面跳转的方法
  • ajaxForm与ajaxSubmit的区别
  • rem是如何实现自适应布局的
  • 如何实现图片的异步加载
  • AMD和CMD的区别
  • 使用Cesium.js加载3D模型
  • js中for in与for of之间的差异
  • Cesium实现三维可视化一般步骤
  • Vue2.0 探索之路——生命周期和钩子函数的一些理解
  • vuejs实践todolist列表
  • vue中的watch监听事件机制
  • 2018一半小结一波
  • 345-反转字符串中的元音字母
  • Android开源项目规范总结
  • LeetCode18.四数之和 JavaScript
  • Linux中的硬链接与软链接
  • maven工程打包jar以及java jar命令的classpath使用
  • PAT A1120
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Zepto.js源码学习之二
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 计算机常识 - 收藏集 - 掘金
  • 免费小说阅读小程序
  • 软件开发学习的5大技巧,你知道吗?
  • 算法-插入排序
  • 王永庆:技术创新改变教育未来
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Android开发者必备:推荐一款助力开发的开源APP
  • elasticsearch-head插件安装
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 第二十章:异步和文件I/O.(二十三)
  • #define,static,const,三种常量的区别
  • #Linux(权限管理)
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)STL算法之遍历容器
  • (javascript)再说document.body.scrollTop的使用问题
  • (定时器/计数器)中断系统(详解与使用)
  • (排序详解之 堆排序)
  • (算法)Game
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)Sublime Text3配置Lua运行环境
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET框架
  • @Autowired和@Resource装配
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Query中countQuery的介绍
  • @RequestMapping处理请求异常
  • []T 还是 []*T, 这是一个问题