zoukankan      html  css  js  c++  java
  • [转] JavaScript中的属性:如何遍历属性

    在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从一个或多个的上层原型上继承一些属性.第二个原因是,JavaScript中的属性不光有值,它还有一些除了值以外的其他特性,其中一个影响属性遍历的特性就是[[Enumerable]],如果该值为true,则称这个属性是可枚举的,否则反之.

    知道了这些,我们就可以把属性的遍历分为四种情况.

    注:示例代码中,我们要遍历的对象是浏览器中的window,环境为Firefox 19,代码运行在空白页面中的script标签里.没有Firebug或者其他调试工具的影响(会导入一些全局变量,console等).

    1.遍历可枚举的自身属性

    可枚举的意思就是该属性的[[Enumerable]]特性为true,自身属性的意思就是该属性不是从原型链上继承下来的.

    (function () {
        var propertys = Object.keys(window);
        alert(propertys.length);         //3
    alert(propertys.join(" ")); //window,document,InstallTrigger,除了最后一个是火狐私有的属性,原来window对象只有两个可枚举的自身属性.window属性指向window对象自身,一般没什么用. })()

    2.遍历所有的自身属性

    特性为不可枚举的属性也并不是遍历不到,ES5给我们提供了getOwnPropertyNames方法,可以获取到一个对象的所有自身属性.

    (function () {
        var propertys = Object.getOwnPropertyNames(window);
        alert(propertys.length);       //72
        alert(propertys.join("
    "));   //Object,Function,eval等等
    })()

    3.遍历可枚举的自身属性和继承属性

    继承属性怎么遍历,你应该知道,就是最常用的for in遍历

    (function () {
        var getEnumPropertyNames = function (obj) {
            var props = [];
            for (prop in obj) {
                props.push(prop);
            }
            return props;
        }
        var propertys = getEnumPropertyNames(window);
        alert(propertys.length);       //185
        alert(propertys.join("
    "));   //addEventListener,onload等等
    })()

    4.遍历所有的自身属性和继承属性

    这种遍历主要用在各种js调试工具的代码补全功能上.比如Firebug的.

    (function () {
        var getAllPropertyNames = function (obj) {
            var props = [];
            do {
                props = props.concat(Object.getOwnPropertyNames(obj));
    } while (obj = Object.getPrototypeOf(obj)); return props;
    } var propertys = getAllPropertyNames(window); alert(propertys.length); //276 alert(propertys.join(" ")); //toString等 })()
  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/qiangxia/p/5532043.html
Copyright © 2011-2022 走看看