【问题标题】:Does Javascript have functions for use instead of binary operators?Javascript 是否有用于代替二元运算符的函数?
【发布时间】:2018-09-25 11:28:12
【问题描述】:

我的问题最好用一个例子来说明。

有没有办法使用类似的语法

array.reduce(and)

而不是

array.reduce((a, b) => a && b)

在 Javascript 中?

类似的问题也适用于其他二元运算符,例如 || + - * 和许多其他运算符。 ! 运算符也存在类似的问题,例如 array.map(not)

编辑:

抱歉,如果不够清楚。我的意思是问 JS 是否像其他一些语言一样为上述运算符提供了实际的 内置 别名。我很清楚我可以定义自己的函数来做到这一点。

【问题讨论】:

  • 简而言之:不,但您可以使用自己的函数。
  • => 不是二元运算符,而是返回
  • 不,它没有。但是在 ES6 中编写它们很容易。一些库也包含它们。
  • @AbdeslemCharif:这里的运算符是&& 运算符,而不是箭头。
  • @NinaScholz 如果这是常识,请发表明确的否决作为答案,我会接受。

标签: javascript function logical-operators binary-operators


【解决方案1】:

实际上,是的——它们被称为函数。 :-)

const and = (a, b) => a && b;
let array = [true, false, true];
console.log(array.reduce(and)); // false
array = [true, true, true];
console.log(array.reduce(and)); // true

我在那里使用了箭头函数,但它可以是任何类型的函数。

JavaScript 没有任何其他 方法可以做到这一点,但函数可以很好地完成这项工作,为常见操作提供可重用的语义。

重新编辑

我的意思是问 JS 是否像其他一些语言一样为上述运算符提供了实际的内置别名。

不——但您显示的代码无论如何都不会使用别名。别名应该是这样的:array.reduce((a, b) => a and b)

【讨论】:

  • 谢谢,我知道这一点。我想知道是否有内置插件。例如。在 Mathematica 中,a && bAnd[a, b] 的简写,它是一个内置函数。
  • @LLlAMnYP:明白了。不,一些预定义的函数有时对操作的子集有用,但主要用于强制(例如,Boolean 用于将真值转换为 true 并将假值转换为 false -- [0, 1, 2].map(Boolean) 是 @987654330 @)。
  • 对于我的普通教育,您知道我正在寻找的东西的正确术语吗?显然,别名是错误的词。
  • @LLlAMnYP:我不知道是否有通用。我会联系我认识的可能认识的人......我不认为“别名”距离一百万英里,它只是一个如此广泛的术语,以至于它通过了​​人们。但请注意,在 Mathematic 中,表达式也是如何重写的,所以不是 只是 一个别名。嗯。
  • 我自己发现了这个 C++ 参考 cplusplus.com/reference/functional/plus,它命名了这个“附加函数对象类”。哦,好吧……
【解决方案2】:

唯一具有等效内置函数的二元运算符是 ** (Math.pow) 和 in (Reflect.has)。

关于array.reduce(and, true)array.reduce(or, false),你可以使用everysome作为回调函数,或者Boolean使用内置函数。

【讨论】:

  • 我猜Math.imul 不算数。
  • 我不会称Reflect.has 为接线员。我认为运算符是封闭的类型,:: a -> a -> a。但是has:: Object -> String -> Bool。 (也许String | Symbol
  • @ScottSauyet 这是 operatormathematical definition,而不是 programming language one。我们对赋值运算符 (Ref a -> a -> a)、yield (a -> b) 之类的控制流、+ (Any -> number) 之类的一元类型转换或条件运算符 ? (Bool -> a -> b -> a|b) 都做得很好。 in 关键字从其语法用法上绝对是一个运算符。
  • 我想这是有道理的。我来自数学背景,所以一些编程问题被旧记忆所掩盖。感谢您的指点。 (哦,等等!:-))
【解决方案3】:

实际上&&||只有两种方法,使用Array#everyArray#some加上Boolean作为回调。

对于所有其他操作,您需要一个自己的函数。

function checkAnd(array) {
    return array.every(Boolean);
}

function checkOr(array) {
    return array.some(Boolean);
}

console.log(checkAnd([true, true, true]));
console.log(checkAnd([true, false, true]));
console.log(checkAnd([false, false, false]));

console.log(checkOr([true, true, true]));
console.log(checkOr([true, false, true]));
console.log(checkOr([false, false, false]));

【讨论】:

  • "...或Array#sortBoolean 作为回调。" Array#some 会更直接。
  • 谢谢,感谢您的意见。我会给线程一些时间来安顿下来,然后选择最能明确这一点的答案。
  • @T.J.Crowder,这是一个错字,但代码是正确的。
【解决方案4】:

你可以定义函数:

function and(x, y) {
	return x && y;
}

function or(x, y) {
	return x || y;
}


bool_values = [true, true, false];
console.log("and", bool_values.reduce(and));
console.log("or", bool_values.reduce(or));

function add(x, y) {
	return x + y;
}

function multiply(x, y) {
	return x + y;
}

num_values = [1, 2.5, 3]
console.log("and", num_values.reduce(add));
console.log("or", num_values.reduce(multiply));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-24
    • 2012-10-16
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    相关资源
    最近更新 更多