-3

どうすれば次のように書くことができます&&か?

if(a == 1 && b == 2) { ... }

オペレーター用の関数を作成できますか?

4

6 に答える 6

4

あなたはこれを次のように行うことができます

if(a==1){
  if(b==2){
    JS function
  }
}

どちらも同じように機能if(a==1 && b==2)しますが、まったく同じことを行うには良いアプローチです。

于 2012-12-08T16:46:42.367 に答える
4

操作をカプセル化する関数を作成します。

function compare(a, b, value1, value2) {
    if(a === value1) {
        if(b === value2) {
            return true;
        }
    }
    return false;
}

そして、あなたはそれを次のように使うことができます:

if(compare(a, b, 1, 2)) {
    // Your action..
}
于 2012-12-08T16:55:35.647 に答える
1

なぜこれを実行したいかはわかりませんが、ifステートメントをネストすることはできます。

if(a == 1){
    if(b == 2){
        ...
    }
}

または、本当に考慮する必要がある場合は、ビット演算子を使用できます21

if(b >> a === 1){
    ...
}

それを行う方法はたくさんありますが、それは本当にあなたのデータに依存します。

于 2012-12-08T16:46:55.940 に答える
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"));
于 2012-12-08T17:12:56.130 に答える
0

*あなたの質問はちょっと無意味ですが、:の代わりに乗算演算子を使用することができます&&

if(a==1 * b==2){
    //do something
}
于 2012-12-08T17:00:09.677 に答える
0

&&演算子を関数として実装したい場合、副作用による短絡を気にするときはいつでも、条件をクロージャとして渡す必要があるため、醜くなります。

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
于 2012-12-08T16:50:23.317 に答える