どうすれば次のように書くことができます&&
か?
if(a == 1 && b == 2) { ... }
オペレーター用の関数を作成できますか?
あなたはこれを次のように行うことができます
if(a==1){
if(b==2){
JS function
}
}
どちらも同じように機能if(a==1 && b==2)
しますが、まったく同じことを行うには良いアプローチです。
操作をカプセル化する関数を作成します。
function compare(a, b, value1, value2) {
if(a === value1) {
if(b === value2) {
return true;
}
}
return false;
}
そして、あなたはそれを次のように使うことができます:
if(compare(a, b, 1, 2)) {
// Your action..
}
なぜこれを実行したいかはわかりませんが、if
ステートメントをネストすることはできます。
if(a == 1){
if(b == 2){
...
}
}
または、本当に考慮する必要がある場合は、ビット演算子を使用できます2
。1
if(b >> a === 1){
...
}
それを行う方法はたくさんありますが、それは本当にあなたのデータに依存します。
プロトタイプの継承を利用して、プロトタイプをメソッドで拡張したコンストラクターを作成できます。
function Comparer(a, b) {
if (!(this instanceof Comparer))
return new Comparer(a, b);
this.assign(a, b);
this.compare();
}
Comparer.prototype.result = false;
Comparer.prototype.compare = function() {
this.result = this.a == this.b;
};
Comparer.prototype.assign = function(a, b) {
this.a = a;
this.b = b;
};
Comparer.prototype.and = function(a, b) {
this.assign(a, b);
if (this.result !== false)
this.compare();
return this;
};
Comparer.prototype.or = function(a, b) {
this.assign(a, b);
if (this.result !== true)
this.compare();
return this;
};
そして、次のように使用します。
var a = 1,
b = 2;
if (Comparer(a, 1).and(b, 2).result)
console.log("pass");
else
console.log("fail");
if
ステートメントを取り除くためにそれを拡張することさえできます。
Comparer.prototype.then = function(fn) {
if (this.result === true)
fn();
return this;
};
Comparer.prototype.otherwise = function(fn) {
if (this.result === false)
fn();
return this;
};
そして、次のように使用します。
var a = 1,
b = 2;
Comparer(a, 1)
.and(b, 2)
.then(function() { console.log("pass"); })
.otherwise(function() { console.log("fail"); });
または、次のように短くします。
var log = Function.bind.bind(console.log, console);
var a = 1,
b = 2;
Comparer(a, 1)
.and(b, 2)
.then(log("pass"))
.otherwise(log("fail"));
*
あなたの質問はちょっと無意味ですが、:の代わりに乗算演算子を使用することができます&&
:
if(a==1 * b==2){
//do something
}
&&
演算子を関数として実装したい場合、副作用による短絡を気にするときはいつでも、条件をクロージャとして渡す必要があるため、醜くなります。
例:
if(condition && changeTheWorld()) { ... }
// Cannot be translated into a function call of this nature:
if(land(condition, changeTheWorld()) { ... }
代わりに、クロージャを作成する必要があります。
if(land(condition, function() {return changeTheWorld()}) {...}
ご覧のとおり、利点はありませんが、非常に面倒で冗長です。
これが機能として本当に必要な場合は、ここにあります
&&
この関数は、評価されてはならない条件(短絡の場合)を式ではなく関数として渡した場合に、のセマンティクスを正しくエミュレートします。
つまり、関数は引数を順番に調べます。関数の場合は最初に評価します。それ以外の場合は値を取得します。偽の場合はfalseを返し、それ以外の場合は次のパラメーターを続行します。
function land(){
for(var i = 0; i < arguments.length; i++) {
var operand = arguments[i];
var value = (typeof operand === 'function') ? operand() : operand;
if (!value) {
return false;
}
}
return true;
}
例:
function evaluateTo(result) {
return function() {
console.log("Evaluating " + result);
return result;
};
}
if(land(true, evaluateTo(1))) {
console.log("All truthy");
}
// Outputs:
// Evaluating 1
// All truthy
if(land(evaluateTo(1), evaluateTo(0), evaluateTo(true))) {
console.log("All truthy");
}
// Outputs:
// Evaluating 1
// Evaluating 0
義務的なミサイルの例
function changeTheWorld() {
console.log("Missiles away!");
// Firing 3 missiles
return nukeTheGlobe(3);
}
if(false && changeTheWorld() == 3) { ... }
// we survived, missiles not fired
if(naiveLand(maybe, changeTheWorld() == 3) { ... }
// Missiles away! no matter what value `maybe` has
if(land(false, function(){ return changeTheWorld() == 3; })) {...}
// we survived, missiles not fired