javascript - 当迭代数组并打印键和值时,还包括 __proto__ 函数,为什么?

标签 javascript arrays json object prototype

<分区>

我做了一个小脚本,迭代并打印一个JSON对象的值,如果对象的值是另一个对象或数组,就会调用这个工作来迭代值(数组或对象) .

这是我在打印数组的值时出现的问题,打印的值也在 __ proto__ 中添加值,就像数组的一部分 请注意,您需要有一个 <ul> HTML 中 ID 为 jsonUls 的元素让这段代码工作。 代码:

   var json = '{"jsonObject":{"value1":"value2", "array1" : ["value1","value2","value3"]}}'; /* Create Json */
   var element = $('#jsonUls');

        var object = JSON.parse(json);  /* Create object */

        /* call the function*/
        recursivePrintObjectValues(object, element); 


        function recursivePrintObjectValues(object, element) {


            for(key in object) { /* Iterate the object */
               var value = object[key]; /*Get the object value */

               /* Verify if value is of type object or an array */
               if(typeof value === 'object' || Array.isArray(value)){

                        /*Generate random */
                        var random = new Date().valueOf() * Math.random() + 351;

                        /* Append Li with key */
                        appendLi(key, '', element);

                        /*Append UL and get the selector*/
                        var ul = appendUl(random, element);

                        /*Call the function with the object and the selector to append (to iterate childs of this object)*/
                        recursivePrintObjectValues(value, ul);
                } else {
                    appendLi(key, value, element);
                }
            }
        }
        function appendUl(random, element) {
            var ul = $('<ul></ul>', {
                        id: random
                     })
                ul.appendTo(element);
            return ul;

        }
        function appendLi(key, value, element) {

            if(value == '[object Object]') {
                value = '';
            }
            $('<li></li>', {
                text: key + ' : '+ value
            }).appendTo(element);
        }

结果如下,我不知道为什么以及如何避免它,希望任何人都可以解释我。

<pre>
    <ul id="jsonUls">
        <li>jsonObject : </li>
        <ul id="448773395479.7797">
            <li>value1 : value2</li>
            <li>array1 : </li>
            <ul id="295240780591.31195">
                <li>0 : value1</li>
                <li>1 : value2</li>
                <li>2 : value3</li>
                <li>$pnmap$ : function $$JSCompiler_prototypeAlias$$$$pnmap$$($f$$30$$,$opt_obj$$28$$){return $goog$array$map$$.apply($JSCompiler_alias_NULL$$,$pn$aargs_$$(this,arguments))}</li>
                <li>$pnforEach$ : function $$JSCompiler_prototypeAlias$$$$pnforEach$$($f$$32$$,$opt_obj$$30$$){$goog$array$forEach$$.apply($JSCompiler_alias_NULL$$,$pn$aargs_$$(this,arguments));return this}</li>
                <li>$pnequals$ : function $$JSCompiler_prototypeAlias$$$$pnequals$$($arr2$$13$$,$opt_equalsFn$$2$$){return $goog$array$equals$$.apply($JSCompiler_alias_NULL$$,$pn$aargs_$$(this,arguments))}</li>
                <li>$pnfindIndex$ : function $$JSCompiler_prototypeAlias$$$$pnfindIndex$$($f$$41$$,$opt_obj$$43$$){return $goog$array$findIndex$$.apply($JSCompiler_alias_NULL$$,$pn$aargs_$$(this,arguments))}</li>
                <li>$pnindexOf$ : function $$JSCompiler_prototypeAlias$$$$pnindexOf$$($obj$$76$$,$opt_fromIndex$$10$$){return $goog$array$indexOf$$.apply($JSCompiler_alias_NULL$$,$pn$aargs_$$(this,arguments))}</li>
            </ul>
        </ul>
    </ul>
</pre>

最佳答案

那是因为 for...in 也会迭代从对象原型(prototype)继承的属性。

避免这种情况的一种方法是使用 hasOwnProperty 检查并拒绝他们:

for(key in object) {
    if (!object.hasOwnProperty(key)) continue;
    // your other code follows
}

另一种选择是使用 defineProperty定义 non-enumerable properties在原型(prototype)上,但这也可能会改变代码其他部分的行为。

关于javascript - 当迭代数组并打印键和值时,还包括 __proto__ 函数,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24048092/

相关文章:

python - 从 numpy 数组的一列中减去

javascript - 数组碰撞检测中的 p5.js 对象

python - 如何使用 JSON 中前一个值的最后一个数字继续新值?

在 Java 中使用 Play Twirl 的 Json 自定义模板

javascript - 当 x 来自提示函数时,为什么 typeof x 永远不会是 'number'?

javascript - 正则表达式: Extract Dates From String

javascript - 在 Javascript 中从数组创建新的对象数组

javascript - 我如何检查这些双重正则表达式

java - 将多个字符串数组合并为一个

javascript - Node.js JSON 解析