是否有一个空结合运营商在Javascript?

例如,在C#我可以这样做:

String someString = null;
var whatIWant = someString ?? "Cookies!";

最好的逼近我可以找出Javascript是使用条件经营者:

var someString = null;
var whatIWant = someString ? someString : 'Cookies!';

这么恶心恕我直言。我可以做的更好?

有帮助吗?

解决方案

中的JavaScript相当于C#空合并运算符(??)用逻辑OR(||)的:

var whatIWant = someString || "Cookies!";

有例(下面澄清),该行为将不匹配的C#,但是这是在JavaScript分配默认/替代值的一般情况下,简洁的方式。


澄清

不管所述第一操作数的类型的,如果它浇铸于false布尔结果,分配将使用第二操作数。当心以下所有的情况:

alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)

这意味着:

var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"

其他提示

function coalesce() {
    var len = arguments.length;
    for (var i=0; i<len; i++) {
        if (arguments[i] !== null && arguments[i] !== undefined) {
            return arguments[i];
        }
    }
    return null;
}

var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);

// xyz.val now contains 5

此溶液的工作方式类似于SQL聚结功能,它接受任何数量的参数,并且如果他们都没有的值返回null。它的行为就像C#?运营商在这个意义上说,“”,false和0被认为是NOT NULL,因此算作实际值。如果你来自一个.NET的背景下,这将是最自然的感觉的解决方案。

如果||作为替代C#的??的是不是你的情况不够好,因为它吞下空字符串和零,你总是可以编写自己的功能:

 function $N(value, ifnull) {
    if (value === null || value === undefined)
      return ifnull;
    return value;
 }

 var whatIWant = $N(someString, 'Cookies!');

没有人提到这里NaN的潜力,这 - 我 - 也是空肥胖型值。所以,我想我会加入我的两分钱。

对于给定的代码:

var a,
    b = null,
    c = parseInt('Not a number'),
    d = 0,
    e = '',
    f = 1
;

如果你使用的||操作,你得到的第一个非假值:

var result = a || b || c || d || e || f; // result === 1

如果您使用典型的聚结的方法,因为这里发布,你会得到c,其值为:NaN

var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'

<强>的既不这些似乎我的权利。在聚结逻辑,可以从你的世界不同的我自己的小世界里,我认为不确定,无效和NaN为所有被“空十岁上下的”。所以,我希望找回从聚结方法d(零)。

如果任何人的大脑就像我的,要排除NaN,则此方法将实现这一目标:

function coalesce() {
    var i, undefined, arg;

    for( i=0; i < arguments.length; i++ ) {
        arg = arguments[i];
        if( arg !== null && arg !== undefined
            && (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
            return arg;
        }
    }
    return null;
}

对于那些谁想要的代码尽可能短,并且不介意一点点不够清晰,也可以使用这一功能,@impinball的建议。这需要的是,NaN的是永远等于NaN的优势。你可以更多的在这里读了起来:为什么是NaN不等于NaN的“? / A>

function coalesce() {
    var i, arg;

    for( i=0; i < arguments.length; i++ ) {
        arg = arguments[i];
        if( arg != null && arg === arg ) { //arg === arg is false for NaN
            return arg;
        }
    }
    return null;
}

当心JavaScript具体定义空。有两个定义为"无价值"在javascript。1.Null:当一个变量是空的,它意味着它没有包含在它的数据,但是可变已经是定义的代码。是这样的:

var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts

在这种情况下,这种类型的变量是实际的对象。测试它。

window.alert(typeof myEmptyValue); // prints Object
  1. 定义:当一个变量没有被定义之前在码,并且正如预期的那样,它不含有任何价值。是这样的:

    if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); }
    // alerts
    

如果这种情况下,这种类型的你可变是不确定的'.

请注意,如果您使用的类型转换的比较操作员(==),JavaScript会法》同样对于这两个空空的价值观。来区分他们之间始终使用类型的比较严格的操作员(===).

阅读您的澄清后,@Ates古拉尔的答案提供了如何执行你在JavaScript做在C#中相同的操作。

@甘博的回答提供了检查空的最佳方式;然而,需要注意的===== JavaScript中的差异是很重要的尤其的,当涉及到检查undefined和/或null的问题。

有是关于两个方面这里的区别一个真正的好文章。基本上,明白,如果你使用==代替===的,JavaScript的会尽量合并你比较值和返回什么的这个合并后的比较的的结果。

现在

JS是得到一个空合并运算符! 目前阶段,3搬入阶段-4,耶! https://github.com/tc39/proposal-nullish-coalescing

示例中提案:

const response = {
  settings: {
    nullValue: null,
    height: 400,
    animationDuration: 0,
    headerText: '',
    showSplashScreen: false
  }
};

const undefinedValue = response.settings.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings.showSplashScreen ?? true; // result: false
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top