【问题标题】:in javascript, how to distinguish between no arg passed and undefined arg passed在javascript中,如何区分未传递的arg和未定义的arg传递
【发布时间】:2011-10-13 07:09:03
【问题描述】:

在函数中,如何区分非参数和未定义参数?

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中捕获Case ACase B的正确方法是什么?

【问题讨论】:

  • 你什么时候会传递undefined 作为函数参数?这不寻常,是吗?
  • 这是一个图书馆。如果有人误用它,例如,传递一个未定义的,希望引发错误。
  • 为什么说arguments.length没有帮助?见jsfiddle.net/4V7FY
  • 无论如何提出的论点,每次都只用你的案例 A(或你的一个案例)处理 undefined 不是更好吗? undefined?
  • 其实传递 undefined 应该和不传递参数一样对待,你不应该在两者之间做区分。

标签: javascript function syntax arguments


【解决方案1】:

尝试类似:

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);

【讨论】:

    【解决方案2】:

    我相信没有跨浏览器兼容的方式可以完全按照您的意愿行事。此外,我认为当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()。在所有其他情况下,应调用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') { ... }     
       ...
     }
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 2018-11-27
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2019-08-05
      • 2019-12-30
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多