在Javascript中进行空融合?

时间:2012-03-26 01:16:34

标签: javascript

在C#中,您可以执行以下操作:

string y = null;
string x = y ?? "sup stallion"; //x = "sup stallion" since y is null.

??运算符是空合并运算符。

在Javascript中,我见过类似的东西:

var headers;
var myHeader = headers || {'Content-type':'text/plain'}; //myHeaders = {'Content...

I've also seen: (The 2nd code snippet on the page)

var headers;
var myHeader = headers | {'Content-type':'text/plain'};

这两者有区别吗?这个模式叫做什么...默认参数?

5 个答案:

答案 0 :(得分:36)

||logical or。它返回第一个真值操作数*(评估的最后一个值)。所以

var myHeader = headers || {'Content-type':'text/plain'};

如果它是真实的,则返回“headers”(如果它为null或未定义,则该值被核心化为“false”)。如果它是假的,它返回第二个操作数。我不相信这在javascript中有一个非常具体的名称,只是像“默认参数值”这样的通用名称。

|bitwise or。这是一个数学运算,做了一些完全不同的事情。那个运算符在这里甚至没有意义(结果通常会产生0)。无论你在哪里看到,它肯定是一个错字,他们的意思是使用逻辑或。

所以请使用第一种方法(a = b || c)。

*“逻辑或”也称为“逻辑分离”或“包含分离”。与所有编程语言一样,Javascript使用short-circuit evaluation评估逻辑语句。使用逻辑或表达式,它会评估每个操作数的真实性,并在第一个真实的操作数上停止(并返回该值)。如果没有真正的操作数,它仍然必须遍历所有操作数,因此它返回最后一个操作数,仍然是它评估的最后一个操作数。逻辑和(&&)同样通过停在第一个虚假操作数上而短路。

答案 1 :(得分:3)

我不熟悉第二种模式。我知道的两种模式:

1)您的第一个模式是基本逻辑或运算符。如果第一个值是假,则分配第二个值。

2)第二种模式称为三元赋值,逻辑上与基本if条件相似,但语法略有不同。

var test = (typeof myTest === "string") ? firstValue : secondValue;

在此模式中,问号将条件与值分开,冒号分隔值。可以嵌套高级分配,以便其中一个值包含另一个高级分配。

答案 2 :(得分:2)

这不是真正的专家,但||Logical Operator|Bitwise Operator

答案 3 :(得分:1)

ES2020将无效的合并运算符(??)引入到javascript中。

const foo = null ?? 'default string';
console.log(foo);
// expected output: "default string"

了解更多:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

答案 4 :(得分:1)

javascript(es2020)现在支持

空的合并运算符

如Mozilla文档所述:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

无效的合并运算符(??)是一个逻辑运算符, 当其左侧操作数为时,返回其右侧操作数 null或undefined,否则返回其左侧操作数。

与逻辑OR(||)运算符相反,返回左操作数 如果它是不为null或未定义的虚假值。换一种说法, 如果使用||为另一个变量foo提供一些默认值, 如果您认为某些虚假行为,可能会遇到意想不到的行为 可用的值(例如“''或0)。有关更多示例,请参见下面。

def change_friends(request, operation, pk):
    new_friend = CustomUser.objects.get(pk=pk)
    if operation == 'add':
        # here you should use request.user instead of request.CustomUser
        Friends.make_friend(request.user, new_friend)
    elif operation == 'remove':
        # here also
        Friends.lose_friend(request.user, new_friend)
    return redirect('posts:all')

有关更多信息,请阅读kent c dods过去和现在提供的有关// Assigning a default value to a variable (old way but in some cases we need this) let count = 0; let text = ""; let qty = count || 42; let message = text || "hi!"; console.log(qty); // 42 and not 0 console.log(message); // "hi!" and not "" // Assign default value when we want to skip undefined/null only // in most cases we need this, because (0,"",false) are valid values to our programs const foo = null ?? 'default string'; console.log(foo); // expected output: "default string" const baz = 0 ?? 42; console.log(baz); // expected output: 0 的示例: https://kentcdodds.com/blog/javascript-to-know-for-react#nullish-coalescing-operator