0

我从以前在这里工作的程序员那里“继承”了一个 JS 函数。我注意到在他的代码中有两个函数做同样的事情,它们只是略有不同。

第一个函数不接受任何参数,在它的主体内部,他以这种方式测试条件:

function parseAll() {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0) {
            // do many other things I omit
        }
    }
}

第二个功能:

function parseOne(stringOne) {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && obj.str = stringOne) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

现在,我想将这些函数转换为一个函数,传递null第一个函数所涵盖的情况何时传递,并传递一个string何时应该调用第二个函数。

因此,两者之间的差异只是要测试的条件。

如何根据传递给函数的参数以编程方式更改要测试的条件?我想测试obj.flag==0我是否通过null以及obj.flag==0 && obj.str=stringOne是否通过string. 这可能吗?如何?

4

1 回答 1

1

您可以通过多种方式轻松检测是否传入了参数。如果stringOne永远不会""在您真正想将它用于“一个”案例时,那么:

function parseOne(stringOne) {
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && (!stringOne || obj.str === stringOne)) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

(我把你改成obj.str = stringOneobj.str === stringOne。只有一个=,这是一个作业,我假设这是一个错字。)

然后,对于“全部”情况,您可以parseOne完全不带参数调用(甚至不需要传入)。null

请注意,上面假设stringOneto be永远没有意义"",因为""是假的,所以!stringOne是真的,我们将其视为“全部”情况。如果传入有意义""并且只想处理一个字符串,则必须进行一些更改:

function parseOne(stringOne) {
    var one = typeof stringOne !== "undefined";
    for (var i = 0; i < 100; i++) {
        if (obj.flag == 0 && (!one || obj.str === stringOne)) {
            // do other things I omit (same identical things as in the function parseAll
        }
    }
}

还有第三种选择,即检查arguments.length实际传递给函数的参数数量(所有函数arguments在调用期间都有一个对象在作用域内),但在某些 JavaScript 引擎上会显着减慢调用速度(尽管通常不会在一种真正重要的方式),这里并不需要它。

于 2013-02-16T10:07:31.327 回答