2017-01-31 13 views
0

Так что это немного вопрос о проблемах с новичком. Я занимаюсь freecodecamp, и у меня возникает проблема с анализом ввода моей функции. Это короткое, и я думаю, что я могу сократить до погони, если я просто покажу вам код:Javascript VArgs - непонимание аргументов объектов с неизвестным вводом

function destroyer(arr) { 
    // Remove all the values 
    console.log("---"); 
    console.log("arr: " + arr); 
    var args = Array.from(arr); 
    console.log(args); 
    var in_i = arr[0]; 

    return in_i.filter(function (x) { 
    if (args.indexOf(x) !== -1) { 
     return true; 
    } else { 
     return false; 
    } 
    }); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

, который дает мне в консоли (и я думаю, что это странная часть):

--- 
arr: 1,2,3,1,2,3 
[1, 2, 3, 1, 2, 3] 

Ясно, что я ничего не понимаю о arguments objects, иначе что-то сломано. По моему опыту, последнее чрезвычайно необычно. Я бы ожидал, что Array.from(arr) предоставит объект массива: [[1, 2, 3, 1, 2, 3], 2, 3].

ответ

1

Функция function destroyer(arr) принимает только один параметр в функции разрушителя который является массивом [1, 2, 3, 1, 2, 3] и игнорировать другие аргументы 2, 3. Таким образом, arr - [1, 2, 3, 1, 2, 3].

Если вам нужно получить доступ ко всем параметрам, переданным функции, то вы можете использовать объект arguments, который является массивом , например. arguments будет указывать на массив [[1, 2, 3, 1, 2, 3], 2, 3]. Следующий код должен отображать переданные аргументы.

function destroyer(arr, param2, param3) { 
 
    // Remove all the values 
 
    console.log(arguments); 
 
} 
 

 
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

Если функция принимает 3 параметра, как показано ниже, param2, param3 были добавлены, то вы можете получить доступ к значению 2, 3 внутри вашей функции.

function destroyer(arr, param2, param3) { 
    // Remove all the values 
    console.log("---"); 
    console.log("arr: " + arr); 
    var args = Array.from(arr); 
    console.log(args); 
    var in_i = arr[0]; 

    return in_i.filter(function (x) { 
    if (args.indexOf(x) !== -1) { 
     return true; 
    } else { 
     return false; 
    } 
    }); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
+0

Взгляните на мой ответ. Я не уверен, что вы на 100% получили то, что я пытался сказать, но ваше наблюдение за остальными проигнорируемыми аргументами было действительно полезно. Благодаря :) – NotAnAmbiTurner

0

В самом деле, та часть, которая меня смутило, что на MDN, использование переменной arguments не только иллюстративный, это встроенная переменная. После @Agalo указала, что значения, которые я получал на консоли, были всего лишь массивом, он щелкнул меня.

Решение заключалось в доступе к дополнительным аргументам через встроенный arguments object, который автоматически имеет (зарезервированное) имя arguments. Код, как так (для полноты картины, я должен отметить, что я также был ложные и истинные переключился в формулировках возвратных):

function destroyer(arr) { 
    // Remove all the values 
    var args_l = arguments.length; 
    var args = Array.from(arguments); 
    console.log(args); 
    var in_i = args.shift(); 

    return in_i.filter(function (x) { 
    if (args.indexOf(x) !== -1) { 
     return false; 
    } else { 
     return true; 
    } 
    }); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

Чтобы рифф прочь Agalo, вы заметите, вы на самом деле не нужно param2 , param3 аргументов в определении функции, чтобы получить тот же результат:

function destroyer(arr) { 
 
    // Remove all the values 
 
    console.log(arguments); 
 
} 
 

 
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

на риске положить слишком мелкую точку на ней:

function args_tester(a) { 
 
    console.log("a: " + a); 
 
    console.log("arguments: " + arguments); 
 
    console.log("arguments_as_array: " + Array.from(arguments)); 
 
    for (var i = 0; i < arguments.length; i++) { 
 
    console.log(arguments[i]); 
 
    } 
 
} 
 

 
args_tester("a", "b", "c");