使用 object.keys(arguments).length VS arguments.length
Using object.keys(arguments).length VS arguments.length
我是 JS 的新手,我试图理解我在几个地方读到的东西:
在尝试获取函数接收到的参数数量时,使用了
Object.keys(arguments).length
。但是,据我所知,这没有任何好处,更短的方法是只使用 arguments.length
这是因为 arguments
持有 .length
属性。
(MDN doc - The arguments object)
有什么我想念的吗?
在性能或安全方面,是否存在优先使用 object.keys()
的情况?
谢谢。
Object.keys(arguments).length
如果 arguments
是一个对象也可以工作:
let arguments = ['foo', 'bar', 'baz'];
console.log('Array', Object.keys(arguments).length);
arguments = { 1: 'foo', 2: 'bar', 3: 'baz' }
console.log('Object', Object.keys(arguments).length);
也就是说,如果已知输入值是一个数组(arguments
是),则完全没有必要使用 Object.keys
。
arguments
是一个“类似数组”的“奇异对象”——它具有数字属性和 .length
。使用 Object.keys
与 Object.keys(someArray)
一样有意义,即 none.
在新代码中,最好完全避免 arguments
,因为它的阴暗特征,比如参数变量的不可见突变。示例:
function someFunctionThatMutatesArray(a) {
a[0] = 'hey'
}
function func(xyz) {
someFunctionThatMutatesArray(arguments)
console.log(xyz) // surprise
}
func(100)
没有理由使用 Object.keys(arguments).length
来获取函数传入参数的计数。该值始终与 arguments.length
相同,因此充其量只是多余的。
因为你有 performance 标签,我想补充一点 Object.keys().length
可能会更慢。 但是,它也不太可能对整体产生太大影响。
function test() {
const keysLength = Object.keys(arguments).length;
const argsLength = arguments.length;
console.log( `keys: [${keysLength}] arguments: [${argsLength}] equal: [${keysLength === argsLength}]` );
}
test();
test(1);
test(1, 2);
test(1, 2, null);
test(1, 2, undefined, 4);
test(1, 2, undefined, 4, ["a", "b", "c"]);
test({foo: "hello", bar: "world"});
test({foo: "hello", bar: "world"});
.as-console-wrapper { max-height: 100% !important; }
我是 JS 的新手,我试图理解我在几个地方读到的东西:
在尝试获取函数接收到的参数数量时,使用了
Object.keys(arguments).length
。但是,据我所知,这没有任何好处,更短的方法是只使用 arguments.length
这是因为 arguments
持有 .length
属性。
(MDN doc - The arguments object)
有什么我想念的吗?
在性能或安全方面,是否存在优先使用 object.keys()
的情况?
谢谢。
Object.keys(arguments).length
如果 arguments
是一个对象也可以工作:
let arguments = ['foo', 'bar', 'baz'];
console.log('Array', Object.keys(arguments).length);
arguments = { 1: 'foo', 2: 'bar', 3: 'baz' }
console.log('Object', Object.keys(arguments).length);
也就是说,如果已知输入值是一个数组(arguments
是),则完全没有必要使用 Object.keys
。
arguments
是一个“类似数组”的“奇异对象”——它具有数字属性和 .length
。使用 Object.keys
与 Object.keys(someArray)
一样有意义,即 none.
在新代码中,最好完全避免 arguments
,因为它的阴暗特征,比如参数变量的不可见突变。示例:
function someFunctionThatMutatesArray(a) {
a[0] = 'hey'
}
function func(xyz) {
someFunctionThatMutatesArray(arguments)
console.log(xyz) // surprise
}
func(100)
没有理由使用 Object.keys(arguments).length
来获取函数传入参数的计数。该值始终与 arguments.length
相同,因此充其量只是多余的。
因为你有 performance 标签,我想补充一点 Object.keys().length
可能会更慢。 但是,它也不太可能对整体产生太大影响。
function test() {
const keysLength = Object.keys(arguments).length;
const argsLength = arguments.length;
console.log( `keys: [${keysLength}] arguments: [${argsLength}] equal: [${keysLength === argsLength}]` );
}
test();
test(1);
test(1, 2);
test(1, 2, null);
test(1, 2, undefined, 4);
test(1, 2, undefined, 4, ["a", "b", "c"]);
test({foo: "hello", bar: "world"});
test({foo: "hello", bar: "world"});
.as-console-wrapper { max-height: 100% !important; }