Как вставить новый аргумент в объект аргументов javascript - PullRequest
2 голосов
/ 30 ноября 2011

Получился странный случай, когда на объект аргументов javascript сильно полагались.У меня проблема «решена», но мне было интересно, может ли кто-нибудь объяснить мне некоторые из действий, которые вытекают из этого кода:

function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    console.log(arguments);
}
function argstest() {
    arguments[arguments.length++] = 3;
    console.log(arguments);
}
whatweget(1,2);
whatweget(1,2,3);
whatweget(1,2,3,4);
argstest(3);

Выводы в Chrome:

[1, 2, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
[1, 2, 3]
[1, 2, 3, 4]
[3, 3]

Изучение объекта arguments в whatweget console.log показывает, что в нем 20 элементов, первые 3 выделены жирным шрифтом, а последние 17 слегка поблекли.При проверке аргументов в argstest console.log эти «призрачные» параметры не отображаются.Это не проблема, так как последующим сценариям будут передаваться аргументы и они будут использовать параметр length, который установлен правильно, но интересно, есть ли у кого-нибудь понимание этого поведения?

Да, и между прочим, Firefox 8 абсолютно крут с таким поведением.Что ж, он делает все как положено, за исключением того, что он не показывает объект arguments в инспекторе Watch, хотя он будет отображать его как массив, когда вы наводите на него курсор мыши.Плохой Firefox, плохой плохой Firefox.

1 Ответ

1 голос
/ 30 ноября 2011

Если вы тестируете в консоли разработчика, я думаю, что это ошибка отображения консоли.

Если вы делаете for-in для объекта arguments, чтобы перечислить все его свойства, вы получаете только3, который вы ожидаете.

function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    for( var n in arguments ) console.log(n, arguments[n]);
}

0 1
1 2
2 undefined

Или, если я возвращаю объект аргументов и проверяю свойства, используя in, он показывает, что свойства отсутствуют.

function whatweget(arg1,arg2,arg3) {
    while(arguments.length<3) { arguments[arguments.length++] = undefined; }
    return arguments;
}

var args = whatweget(1,2);

console.log( '2' in args );  is true
console.log( '5' in args );  is false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...