3

オンラインでいくつかの例を見た後、2 つの異なる説明を集めました。

例: var x = A || B;

  1. A が存在し、B が存在しない場合、左側が返されます。
  2. A が存在し、B が存在する場合、右辺 (最後に評価された値) を返します。

その論理に基づいて、 x が返すと仮定します: v.item(0).click()。しかし、それをテストするとき、x は最初に B を返し、次に A を返しました。なんで?( http://jsfiddle.net/nysteve/QHumL/59/ )

HTML:

<div class="indeed-apply-button" onclick="alert('BOOM BUTTON');">boo</div>
<div class='view_job_link' onclick="alert('BOOM LINK');">boo</div>

JavaScript

var v = document.getElementsByClassName('view_job_link');
var i = document.getElementsByClassName('indeed-apply-button');
var x = v.item(0).click() || i.item(0).click();

編集 1:02 PM 10/10/2013

私の本当の意図については言及しませんでしたが、回答と議論に基づいて、私の目標は基本的に次のコードを最初に言及した JavaScript コードに変換することでした。

var v = document.getElementsByClassName('view_job_link');
var i = document.getElementsByClassName('indeed-apply-button');
if(v){v.item(0).click();}
else if(i){i.item(0).click();}
else{}

if(v){v.item(0).click();}上記のコードでは、短絡に対してどのように読みますか?

4

1 に答える 1

6

あなたの 2 つの説明はどちらも正確ではありません。

var x = A || B;

それが行うことは次のとおりです。

  1. 「A」を評価します。結果を V A とします。
  2. V Aが 、 、 、 、または空の文字列でないnull場合undefined0NaN全体のfalse値はV Aになり、評価は停止します。
  3. 「B」と評価します。結果を V Bと呼びます。その値V Bが式の値です。

テスト コードは、最初の要素で「クリック」関数を呼び出したときの戻り値を最初にテストし、次に 2 番目の要素をテストします。これらの関数は両方とも を返すundefinedため、 の両側の部分式||が評価されます。つまり、最初の呼び出しはV Aを取得し、それは でundefinedあるため、反対側も評価され、それが式の値になります。(出てきundefinedます。)

編集—答えにさらに追加したので、あなたが何をしているのかがわかると思います。

実際のコード (または、より現実に近いサンプル コード) では、次のようになります。

if(v){v.item(0).click();}
else if(i){i.item(0).click();}
else{}

これは、次のものとはまったく異なることを意味します。

var x = v.item(0).click() || i.item(0).click();

ifステートメント バージョンでは、明示的に "v" をチェックしていることに注意してください。そのようなテストは、「v」の値に対して「真偽」テストを実行します。nullこの場合、「v」がまたはでないことを確認するために実際にチェックしていますundefined。ただし、この||バージョンでは、変数「v」の「良さ」に関する明示的なテストはありません。直接使用するだけです。(たまたまnullそこにあると、実行時エラーが発生します。)

||と を使用した実際のコードのバージョン&&は可能ですが、私の意見では、既存のコードの方が明確です。ただし、議論の目的で、ifバージョンを次のように置き換えることができます。

v && (v.item(0).click(), true) || i && i.item(0).click();

個人的には、それはちょっと醜いように見えると思います。

于 2013-10-10T16:06:05.157 に答える