在javascript中,如何区分没有arg传递和未定义的arg传递

时间:2011-10-13 07:09:03

标签: javascript function syntax arguments

在一个函数中,如何识别非arg和未定义的arg?

myFunc( 'first' );

var obj = { a: 123 };
myFunc( 'first', obj.b );
_or_
myFunc( 'first', undefined )

arguments.length指的是参数过去命名的参数,所以没有帮助可以用arguments.length轻松解决 - 抱歉大脑放屁!

function myFunc( a, b ) {

  // Case A: if no second arg, provide one
  // should be: if( arguments.length < 2 ) ...
  if( b === undefined ) b = anotherFunc;

  // Case B: if b is not resolved - passed but undefined, throw
  else if( b === undefined ) throw( 'INTERNAL ERROR: undefined passed' );

  // Case C: if b not a function, resolve by name
  else if( typeof b != 'function' ) { ... }

  ...
}

myFunc中捕获案例A 案例B 的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

尝试类似:

function myFunc() {
  var a, b;

  if (arguments.length === 1) {
    a = arguments[0];
    console.log('no b passed');
  }
  else if (arguments.length > 1) {
    a = arguments[0];
    b = arguments[1];
    if (b === undefined) {
      console.log('undefined passed as parameter');
    }
  }

  console.log(a, b);
}

myFunc(1);
myFunc(1, undefined);

答案 1 :(得分:1)

我认为此问题的accepted answer会为您提供有关此问题的更多信息:How to check a not-defined variable in JavaScript

答案 2 :(得分:1)

我相信没有跨浏览器兼容的方式可以完全按照您的意愿行事。此外,我认为一个函数在显式传递undefined时改变其行为(而不是完全传递)是令人困惑的。也就是说,通过稍微改变协议可以实现您的总体目标。

让我们来看看你希望如何使用my_func:

my_func(1) // case A
my_func(1, undefined) // case B
my_func(1, {}.b) // case B
my_func(1, "blah") // case C

看到我的观点?仅当调用者传递单个参数时,才会发生情况A.

因此,如果将my_func()分成两个函数:my_funcA,采用单个参数,my_funcBC,取两个参数,您将能够正确实现逻辑。

这对函数调用者造成的唯一变化是,如果调用者传递一个参数,则需要调用my_funcA()。在所有其他casses中,应调用my_funcBC()

 function my_funcA(a) {
   my_funcBC(a, anotherFunc);
 }

 function my_funcBC(a, b) {
   if (b === undefined) 
     throw( 'INTERNAL ERROR: undefined passed' );

   if (typeof b != 'function') { ... }     
   ...
 }