Sti*_*ube 6 javascript arguments
考虑以下:
foo打算获取参数对象并重新排列顺序,将arg1移动到arg2的位置
function foo (args) {
args[2] = args[1];
args[1] = undefined;
}
Run Code Online (Sandbox Code Playgroud)
bar 用它的参数调用foo
function bar (a, b, c) {
foo(arguments);
console.log(arguments);
}
Run Code Online (Sandbox Code Playgroud)
我希望下面的结果是这样的 { 0: 'hello', 1: undefined, 2: 'world' }
bar('hello', 'world');
Run Code Online (Sandbox Code Playgroud)
但是,我得到:
{
0: 'hello',
1: undefined,
2: 'world',
3: undefined,
4: undefined,
5: undefined,
6: undefined,
7: undefined,
8: undefined,
9: undefined,
10: undefined,
11: undefined,
12: undefined,
13: undefined,
14: undefined,
15: undefined,
16: undefined,
17: undefined,
18: undefined,
19: undefined
}
Run Code Online (Sandbox Code Playgroud)
我完全不知道为什么会这样.有人有主意吗?
我在node.js环境中运行它
不是arguments object一个数组。它是一个具有内部类型的列表Arguments,具有length属性和属性的 getters/setters,其中0是函数声明的参数数量和调用该函数的元素数量中的较小者。一旦这个对象被创建,当你对其属性进行操作时,系统将不会增加/减少,并且尝试设置它不会添加/删除键。属性的 getter/setter确实是函数中参数名称的别名(即,当您设置时,您将看到)。len - 1lenlengthlength0len - 1b = 1arguments[1] === 1
foo当尝试设置时发生的情况args[2]是,添加一个整型属性会触发 V8 将底层数组存储大小调整为 20 个元素(它应该以某种方式知道这是一种Arguments类型,因此它可能可以将其设置为哈希属性)。如果设置,args[20] = 1它将调整大小为 47,args[100] = 1将调整大小为 167,但设置args[1026] = 1将使其成为稀疏数组(但先设置args[1025] = 1然后args[2048]不会使其稀疏)等。
调整大小后,Object.keys将所有内容报告0为19属性,因此console.log(调用util.format)仅打印所有内容。
(function (a, b, c) { (function (args) { args[2] = 1; })(arguments); console.log(Object.keys(arguments)); })("hello", "world")
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"]
Run Code Online (Sandbox Code Playgroud)
这绝对是一个 V8 错误,尽管它非常尖锐。
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |