为什么我无法在`console.log`输出中看到参数对象的`length`属性?

时间:2015-04-15 15:16:23

标签: javascript

我只能看到索引和值。不显示其他属性,如length或callee。如何从console.log()隐藏属性?以及如何查看所有属性?

例如:

function test(){
    console.log(arguments);
    console.log(arguments.length);
}

test(1,2,3,4,5);

输出为{ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }5

实际上参数中有length属性,但我无法在console.log(arguments)中看到。

1 个答案:

答案 0 :(得分:2)

因为arguments.length属性是不可枚举的。

您可以在对象上定义属性,并将其enumerable属性设置为false,就像这样

var obj = {};

Object.defineProperty(obj, "name", {
    "value": "a",
    enumerable: false
});

console.log(obj);
// {}

您可以使用Object.prototype.propertyIsEnumerable功能检查相同内容,例如

function testFunction() {
    console.log(arguments.propertyIsEnumerable("length"));
}

testFunction();

将打印false,因为length特殊对象的arguments属性不可枚举。

如果您想查看所有属性,请使用此question中提到的答案。基本上, Object.getOwnPropertyNames甚至可以枚举不可枚举的属性。所以,你可以像这样使用

function testFunction() {
    Object.getOwnPropertyNames(arguments).forEach(function (currentProperty) {
        console.log(currentProperty, arguments[currentProperty]);
    });
}

testFunction();

这将打印lengthcallee属性。