Javascript VArgs - 不了解具有未知输入的参数对象

时间:2017-01-31 05:08:58

标签: javascript arguments variadic-functions

所以这是一个新手故障排除问题。我正在做freecodecamp的练习,我在解析我的函数输入时遇到了问题。这很简短,如果我只是告诉你代码,我想我可以切入追捕:

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]

2 个答案:

答案 0 :(得分:1)

函数function destroyer(arr)只接受函数驱逐舰中的1个参数,这是一个数组[1, 2, 3, 1, 2, 3]忽略其他参数{{1} }。因此,2, 3arr

如果您需要访问传递给函数的所有参数,那么您可以使用[1, 2, 3, 1, 2, 3]对象,这是数组,如对象。 arguments会指向数组arguments。以下代码应显示传递的参数。



[[1, 2, 3, 1, 2, 3], 2, 3]




如果您的函数采用如下所示的3个参数,则添加了function destroyer(arr, param2, param3) { // Remove all the values console.log(arguments); } destroyer([1, 2, 3, 1, 2, 3], 2, 3);,那么您可以在函数内访问值2,3。

param2, param3

答案 1 :(得分: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); 。代码是这样的(为了完整性,我应该注意到我在return语句中也有错误和真实的切换):

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

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

为了Ag离开Agalo,你会注意到你实际上并不需要函数定义中的param2,param3参数来获得完全相同的输出:



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");
&#13;
&#13;
&#13;

冒着过分指责的风险:

&#13;
&#13;
(function () {
    'use strict'
    angular.module('MainApp').factory('GetData', ['$http', function ($http) {
        return {
            getCountries: function (url, No) {
                return $http({
                    method: "GET",
                    url: url,
                    DNo: No,
                    
                });
            }
        }

    }]);
})();

I have injected this factory to my controller and used as below.

GetData.getCountries('/General/API/GetDetails', $scope.No).then(function (res) {
                   
                    console.log(res.data);
                }, function (res) {

                });

            }

and here is my API.

 public JsonResult GetDetails(string DNo)
        {
            var allCntry = entity.spGetCountries(DNo).ToList();

            return Json(allCntry, JsonRequestBehavior.AllowGet);
        }
&#13;
&#13;
&#13;