美文网首页
js中的可枚举属性

js中的可枚举属性

作者: 这个大叔有丶冷 | 来源:发表于2017-04-28 17:02 被阅读0次

思考这样一个问题,假如你定义了一个Array

var a = [1,2,3,4,5];

然后你对这个数组进行了for...in循环求和操作

var total = null;
for (var i in a) {
   total += a[i];
}
cosole.log(total); //15

过了一段时间,你的teammate为了解决一个排序问题,像Array函数添加了一个原型方法order

Array.prototype.order = function() {
    //排序操作
};

这时候你再去执行你的求和操作,会发现结果不再是15了而是



原因是Array数组的原型方法也被遍历出来了,这里就涉及到js可枚举属性了。

js中什么是可枚举属性######

js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性)。

js中哪些属性可枚举,哪些不可枚举?######
  1. js基本数据类型自带的原型属性不可枚举。
  2. 通过Object.defineProperty()方法指定enumeralbe为false的属性不可枚举。
js中哪些方法会访问到enumerable为true的对象属性?######
  1. for...in操作
  2. Object.keys()方法(和for...in的区别就是Object.keys()不会返回对象原型链上的属性)
  3. JSON.stringify()方法。
    虽然enumerable为false的属性上述三个方法不能访问到,但是你要是直接获取的话,还是能直接获取到的。

回过头来看最开始的情形,你总不能要求别人把它定义的原型方法删除,这时候就要用到object.hasOwnProperty()方法了。
该方法会判断一个对象是否含有指定的属性,但是会忽略从原型链上继承的属性。

将开头的代码改成如下:

var total = null;
for (var i in a) {
    if (a.hasOwnProperty(i)) {
        total += a[i];
    }
}
cosole.log(total); //15

现在就没有原先那样奇怪的结果了。

相关文章

  • js中的可枚举属性

    思考这样一个问题,假如你定义了一个Array 然后你对这个数组进行了for...in循环求和操作 过了一段时间,你...

  • JS学习笔记之对象属性遍历

    属性类型 JS中,对象的属性包括两类:自身属性(实例属性)以及继承属性(原型属性)。在这两类属性中,又有可枚举属性...

  • 说说JS中的可枚举属性

    在学习Typescript的过程中,接触到枚举这个类型,一开始不太理解枚举的意思,为了深入理解它,就顺带去了解了一...

  • js中对象的可枚举属性

    使用for...in来遍历对象的时候,不仅会遍历自身的,也会遍历通过原型继承而来的,要判断一个对象是否是自身的属性...

  • JS中的可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性...

  • JavaScript中的可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性...

  • JavaScript中的可枚举属性与不可枚举属性

    在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性...

  • JS可枚举属性和不可枚举属性

    最近在学习《深入理解ES6》,例子中有一个Object.keys(obj)方法,如果对这个方法不太熟悉可以看Obj...

  • JS遍历属性

    可枚举属性 对象属性可枚举,表示该属性的值不可修改,可认为该属性是常量。如何定义不可枚举的属性? 获取对象所有可枚...

  • Object.defineProperty()讲解

    由可枚举属性引起的 JavaScript属性分为可枚举属性和不可枚举属性?什么是“枚举”,它又有什么用呢? 我们知...

网友评论

      本文标题:js中的可枚举属性

      本文链接:https://www.haomeiwen.com/subject/sffazttx.html