35

Railsでは、これを行うことができます:

 x = user.try(:name)

このメソッドはnilif useris nilelseを返しますuser.namenameオブジェクトで定義されたメソッドを次に示しますuser

Javascriptで使用できることは知っていますがif..then..else、Javascriptで同じことを行う同等のコンパクトな方法はありますか?

tryグーグルは、私が探しているものではないJavascriptのコマンドを指しています。

4

6 に答える 6

47

それを行う方法が組み込まれていないため、次の方法で行うことができます。

var x = (user || {}).name;
  • ユーザーが定義されていない/nullの場合、未定義になります
  • user が定義されている場合、name プロパティを取得します (設定または未定義の場合があります)。

ユーザーが定義されていない (null) 場合、これはスクリプトを壊しません。

ただし、ユーザー変数は、その値が定義されていなくても、スコープ内のどこかで宣言する必要があります。そうしないと、ユーザーが定義されていないというエラーが表示されます。

同様に、 がグローバル スコープ内にある場合、上記のエラーを回避するために、この変数をグローバル スコープのプロパティとして明示的にチェックできます。

元:

 var x = (window.user || {}).name; // or var x = (global.user || {}).name;

機能を安全に実行するために、

 var noop = function(){}; //Just a no operation function

 (windowOrSomeObj.exec || noop)(); //Even if there is no property with the name `exec` exists in the object, it will still not fail and you can avoid a check. However this is just a truthy check so you may want to use it only if you are sure the property if exists on the object will be a function.
于 2013-10-10T01:18:24.390 に答える
8

論理 AND ( &&) 演算子を使用できます。結果がbooleanではないため、ほとんどの言語とは動作が異なります。例えば:

const x = user && user.name;

以下の表は、この演算子を使用した場合に考えられるすべての結果を示しています。

+--------------+-----------------------+
|    user      | x = user && user.name |
+--------------+-----------------------+
| undefined    | undefined             |
| null         | null                  |
| {}           | undefined             |
| {name:''}    | ''                    |
| {name:'Jon'} | 'Jon'                 |
+--------------+-----------------------+
于 2017-01-30T00:27:47.723 に答える
2

これはJavascriptであなたに与えるものと同じではありません:

user['name']
user.name

undefinedこれは代わりに返されますnilが、ほとんどの場合は同等です。Rails がtryメソッドを必要とする理由は、アクセス可能にしないとインスタンス変数にアクセスできないためだと思います。

@PSLのアプローチに追加するために、私は通常次のようなことをします:

var x = user || {},
    y = x.name || {},
    z = y.first_name;
于 2013-10-10T01:26:06.327 に答える
0

私はそうは思わない。自分で巻いてみませんか?まったく同等ではありませんが、仕事をします。

function tryMe(obj) {
  return obj === null || obj === undefined ? null : obj;
}
于 2013-10-10T01:18:26.397 に答える