【问题标题】:Setting up an array in the parameters of a function在函数的参数中设置数组
【发布时间】:2011-07-18 04:14:09
【问题描述】:

只是想通过我的参数设置一个数组。看看下面这个伪代码,看看我在做什么:

function someFunction(x = new Array()){
 for (a in x){
  some action with x[a];
 }
}

someFunction([value a, value b, value c]);

所以我正在尝试做一些可能与此类似的事情。提前谢谢各位!

【问题讨论】:

  • 不要使用new Array;只是做[] 的工作方式相同,而且更简单。

标签: javascript arrays parameters for-loop


【解决方案1】:

如果我理解正确,您想使用空数组以防没有参数传递给函数。你可以通过下面的代码来实现。

function someFunction(x){
    x = x || [];
    //...    
}

someFunction([value a, value b, value c]);

【讨论】:

  • 哦,哇,我已经很接近了,不是吗?所以 x = x || [];将参数(在本例中为 x)声明为数组呢?
  • x = x || [] 表示如果 x 有值(不是未定义或 false 或 null),则将 x 的值分配给 x。如果x 没有值,则将其设为空数组。这是处理可选参数的一种非常有用的方法。
  • 等一下,不过滤hasOwnProperty,您将获得数组的所有成员函数以及实际的数组值。 Here's a jsfiddle that demonstrates。每当您执行for-in 循环时,理所当然地应该过滤hasOwnProperty。
  • 实际上最好避免使用for ... in ... 对数组进行迭代。我只想演示使用参数的技术。编辑了 sn-p。
【解决方案2】:

这基本上是each的特例:

function each(a, f) {
    a = a || [];
    for (var i=0; i < a.length; ++i) {
        f(a[i]);
    }
}

虽然each 通常与mapfilterreduce/fold 一起实现为Array 的方法:

Array.prototype.each = function(f) {
    for (var i=0; i < this.length; ++i) {
        f(this[i], i);
    }
};

Array.prototype.map = function(f) {
    var result = [];
    for (var i=0; i < this.length; ++i) {
        result[i] = f(this[i], i);
    }
    return result;
};

Array.prototype.map = function(keep) {
    var result = [];
    for (var i=0; i < this.length; ++i) {
        if (keep(this[i], i)) {
            result.push(this[i]);
        }
    }
    return result;
};

Array.prototype.foldl = function(f) {
    var result = this[0];
    for (var i=1; i < this.length; ++i) {
        result = f(result, this[i]);
    }
    return result;
};

Array.prototype.foldr = function(f) {
    var i=this.length-1
    var result = this[i];
    for (--i; i >= 0; --i) {
        result = f(this[i], result);
    }
    return result;
};

Array.prototype.reduce = Array.prototype.foldl;

请注意,将for (... in ...) 与数组一起使用可能会导致问题,因为它会拾取除整数索引之外的数组上定义的属性。

【讨论】:

  • 请注意,更改全局 Array 原型存在缺陷。
【解决方案3】:

试试这个:

function someFunction() {
    for(var i = 0; i < arguments.length; i+=1) {
       // some action with arguments[i]
    }
}

// usage
someFunction(a, b, c);
someFunction.apply(window, [a, b, c]);

arguments 属性在函数内部自动定义,每个函数范围都有一个新属性。它几乎是一个数组,但不完全是。不过,在 99% 的情况下,您可以像使用数组一样使用它。

第二个用法示例是如果您有一个要传入的数组,但它不是静态定义的。函数对象的 apply 方法可以让你传入一个上下文和一个参数数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 2017-05-04
    • 2011-11-06
    • 2019-07-30
    • 1970-01-01
    • 2013-11-17
    • 2015-02-11
    • 2014-11-11
    相关资源
    最近更新 更多