在NodeJS中处理未定义的变量简单条件

Sam*_*duc 2 javascript

鉴于此功能:

var test = function(param1, param2_maybe_not_set) {
  var my_object = {};
  // code here...
}
Run Code Online (Sandbox Code Playgroud)

在您看来,最好的是什么?

my_object.new_key = (param2_maybe_not_set === undefined) ? null : param2_maybe_not_set;
Run Code Online (Sandbox Code Playgroud)

要么

my_object.new_key = (param2_maybe_not_set === void 0) ? null : param2_maybe_not_set;
Run Code Online (Sandbox Code Playgroud)

要么

my_object.new_key = (typeof param2_maybe_not_set === 'undefined') ? null : param2_maybe_not_set;
Run Code Online (Sandbox Code Playgroud)

或者,这个缩短的表达式是否正确?

my_object.new_key = param2_maybe_not_set || null;
Run Code Online (Sandbox Code Playgroud)

所有四种方法都有效(至少在NodeJS控制台中).jsPerf也没有显示出任何这些差距(http://jsperf.com/typeof-performance/8)

应该使用哪一种,作为一种良好做法

voi*_*hos 9

它们不是严格等同的,但通常可以互换使用.以下是它们之间的主要区别:

  • x === undefined:此执行值之间的严格平等比较和undefined,这意味着的实际值undefined将是true的,而像相似的值null0将是假的.

    在函数调用的情况下,此检查不区分f(a)f(a, undefined)(实际上,没有示例;要区分,您必须查看arguments).

  • x === void 0:这使用void关键字,它评估任何表达式并返回undefined.这主要是在以前完成的,以防止人们重新定义全局undefined变量的惊喜,但现在不是那么有用(ECMAScript 5强制要求undefined只读)

  • typeof x === 'undefined':这使用typeof关键字,它具有唯一的能力 - 即操作数未被评估.这意味着,类似typeof foobarbaz的回报'undefined',即使没有这样的变量foobarbaz存在于所有.将此与之对比foobarbaz === undefined,如果从未声明过变量名,则抛出ReferenceError.

  • x || null:这是最简单且可能最具可读性的替代方案.该||操作通常被用来在参数"设置默认值",并可以链接像x || y || z || null.

    在大多数情况下,这是使用的惯用技术.然而,请注意,||执行隐式转换,这意味着,任何"falsy"值将触发的下一个值(这意味着它不能区分undefined,false,null,0,'',和NaN).因此,如果您的函数希望接收伪值作为参数,则显式检查可能更为谨慎undefined.