我“继承了”以前在这里工作的程序员的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
这可能吗?怎么样?
答案 0 :(得分:1)
您可以通过几种方式轻松检测参数是否被传入。如果stringOne
永远不会""
,那么当您真正想要将其用于&#34;一个&#34;案件,然后:
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 = stringOne
更改为obj.str === stringOne
。只有一个=
,这是一项任务,而且我认为这是一个错字。)< / p>
然后你可以根本没有任何参数致电parseOne
(甚至不需要传递null
)&#34; all&#34;情况下。
请注意,上述内容假定stringOne
""
永远不会有意义,因为""
是假的,所以!stringOne
为真,我们&# 39; d像对待&#34;所有&#34;案件。如果传入""
并且只想处理那个字符串是有意义的,那么你必须稍微改变一下:
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引擎上可以大大减慢通话速度(虽然通常不是真正重要的方式),而且这里并不需要它。