618

PHPでは、次のことができますif(isset($array['foo'])) { ... }。JavaScriptif(array.foo) { ... }では、同じことを行うことがよくありますが、これはまったく同じステートメントではありません。array.foo存在するがfalseorである場合0(およびおそらく他の値も)、条件はfalseと評価されます。

issetJavaScriptのPHPに完全に相当するものは何ですか?

広い意味では、JavaScriptが存在しない変数、値のない変数などを処理するための一般的で完全なガイドが便利です。


更新:11年11か月前にこの質問を投稿しましたが、まだ多くのアクティビティがあります。さて、これを書いたとき、連想配列(別名辞書)にプロパティが存在するかどうかを確認する方法だけを知りたかったので、正しい(私にとっては)答えにはhasOwnPropertyまたはin演算子が含まれると確信しています。ローカル変数またはグローバル変数をチェックすることに興味はありませんでした。

しかし、私はそれをよく覚えていますが、その意図は、書かれている質問では完全に明確ではなく、直接矛盾していることさえあります!連想配列については触れませんでしたが、PHPissetは他のことも行います。これを、質問で要件を適切に述べることがいかに重要であるか、また、グローバル変数、ローカル変数、オブジェクトプロパティ、辞書キー、および何を持っているかについてのレッスンにしましょう-あなたはヒューイ、デューイ、とルーイ。

その間(ええ)、多くの人がその効果についても答えてくれたので、グーグルでこの質問を見つけた人たちにとっては、私の漠然としたことが私が推測する方法で助けてくれてうれしいです。とにかく、それを明確にしたかっただけです。

4

28 に答える 28

1040

私は通常、typeof演算子を使用します。

if (typeof obj.foo !== 'undefined') {
  // your code here
}

"undefined"プロパティが存在しないか、値が。の場合に返されますundefined

(参照:定義されているものと定義されていないものの違いundefined

hasOwnPropertyメソッドのように、プロパティがオブジェクトに存在するかどうかを判断する方法は他にもあります。

if (obj.hasOwnProperty('foo')) {
  // your code here
}

そしてinオペレーター:

if ('foo' in obj) {
  // your code here
}

最後の2つの違いは、hasOwnPropertyメソッドがプロパティがオブジェクトに物理的に存在するかどうかをチェックすることです(プロパティは継承されません)。

inオペレーターは、プロトタイプチェーンで到達可能なすべてのプロパティをチェックします。例:

var obj = { foo: 'bar'};

obj.hasOwnProperty('foo'); // true
obj.hasOwnProperty('toString'); // false
'toString' in obj; // true

ご覧のとおり、メソッドをチェックすると、 hasOwnPropertyreturnsfalsein演算子が戻ります。formを継承するため、このメソッドはプロトタイプチェーンで定義されています。truetoStringobjObject.prototype

于 2010-02-17T14:57:51.550 に答える
25

ソースへの参照

    module.exports = function isset () {
  //  discuss at: http://locutus.io/php/isset/
  // original by: Kevin van Zonneveld (http://kvz.io)
  // improved by: FremyCompany
  // improved by: Onno Marsman (https://twitter.com/onnomarsman)
  // improved by: Rafał Kukawski (http://blog.kukawski.pl)
  //   example 1: isset( undefined, true)
  //   returns 1: false
  //   example 2: isset( 'Kevin van Zonneveld' )
  //   returns 2: true

  var a = arguments
  var l = a.length
  var i = 0
  var undef

  if (l === 0) {
    throw new Error('Empty isset')
  }

  while (i !== l) {
    if (a[i] === undef || a[i] === null) {
      return false
    }
    i++
  }

  return true
}

phpjs.orgは、locutusを優先してほとんど廃止されました。新しいリンクは次のとおりです。http://locutus.io/php/var/isset

于 2012-11-20T01:48:20.137 に答える
21
if (!('foo' in obj)) {
  // not set.
}
于 2010-02-17T14:59:43.120 に答える
8
//
//  tring to reference non-existing variable throws ReferenceError 
//  before test function is even executed
//
//  example, if you do:
//    
//     if ( isset( someVar ) ) 
//        doStuff( someVar );
//   
//  you get a ReferenceError ( if there is no someVar... ) 
//  and isset fn doesn't get executed.
//
//  if you pass variable name as string, ex. isset( 'novar' );, 
//  this might work:
//
function isset ( strVariableName ) { 

    try { 
        eval( strVariableName );
    } catch( err ) { 
        if ( err instanceof ReferenceError ) 
           return false;
    }

    return true;

 } 
//
//
于 2013-08-21T13:23:17.967 に答える
8

この単純な解決策は機能しますが、詳細なオブジェクト チェックでは機能しません。

function isset(str) {
    return window[str] !== undefined;
}
于 2014-06-21T16:33:58.517 に答える
5

このソリューションは私にとってはうまくいきました。

function isset(object){
    return (typeof object !=='undefined');
}
于 2015-05-18T13:18:26.483 に答える
4
window.isset = function(v_var) {
    if(typeof(v_var) == 'number'){ if(isNaN(v_var)){ return false; }}
    if(typeof(v_var) == 'undefined' || v_var === null){ return false;   } else { return true; }
};

プラス テスト:

https://gist.github.com/daylik/24acc318b6abdcdd63b46607513ae073

于 2016-12-08T01:31:42.077 に答える
2

オブジェクト パスを文字列として指定すると、この文字列をパスに分割してhasOwnProperty各ステップで解決し、各反復でオブジェクト自体を上書きできます。

ES6 環境でコーディングしている場合は、この stackoverflow Quesをご覧ください。

var a;

a = {
    b: {
        c: 'e'
    }
};

function isset (obj, path) {
    var stone;

    path = path || '';

    if (path.indexOf('[') !== -1) {
        throw new Error('Unsupported object path notation.');
    }

    
    path = path.split('.');
    
    do {
        if (obj === undefined) {
            return false;
        }

        stone = path.shift();
        
        if (!obj.hasOwnProperty(stone)) {
            return false;
        }
        
        obj = obj[stone];
        
    } while (path.length);

    return true;
}

console.log(
    isset(a, 'b') == true,
    isset(a, 'b.c') == true,
    isset(a, 'b.c.d') == false,
    isset(a, 'b.c.d.e') == false,
    isset(a, 'b.c.d.e.f') == false
);

于 2014-11-18T08:29:16.613 に答える
1

要素が存在するかどうかを確認したい場合は、次のコードを使用してください。

if (object) {
  //if isset, return true
} else {
  //else return false
}

これはサンプルです:

function switchDiv() {
    if (document.querySelector("#divId")) {
        document.querySelector("#divId").remove();
    } else {
        var newDiv = document.createElement("div");
        newDiv.id = "divId";
        document.querySelector("body").appendChild(newDiv);
    }
}

document.querySelector("#btn").addEventListener("click", switchDiv);
#divId {
    background: red;
    height: 100px;
    width: 100px;
    position: relative;
    
}
<body>
  <button id="btn">Let's Diiiv!</button>
</body>

于 2019-07-20T11:54:34.477 に答える
1

PHPマニュアルは言う:

isset — 変数が設定されていて NULL でないかどうかを判断する

そして、次のようなインターフェースをとります:

bool isset ( mixed $var [, mixed $... ] )

パラメータ$varは、チェックする変数です。ただし、任意の数のパラメーターを持つことができます。

isset() はTRUE、var が存在し、 以外の値を持つ場合に戻りますNULLFALSEそれ以外は。

いくつかの例:

$foo = 'bar';
var_dump(isset($foo));        -> true

$baz = null;
var_dump(isset($baz));        -> false

var_dump(isset($undefined));  -> false

これを念頭に置いて、明らかに、phpisset()関数とまったく同等のものを書くことはできません。たとえば、次のように呼び出すと:

if (isset(some_var)) {

}

function issset() {
    // function definition
}

Javascript トリガーUncaught ReferenceError: some_var is not defined at (file_name):line_number。この動作の重要かつ注目すべき点は、存在しない変数を通常の関数に渡そうとすると、エラーが発生することです。

しかし、PHP ではisset()、実際には通常の関数ではなく、言語構造です。つまり、それらは PHP 言語自体の一部であり、関数の通常のルールに従っていないため、存在しない変数に対してエラーをトリガーすることなく回避できます。これは、変数が存在するかどうかを把握しようとするときに重要です。しかし、javascript では、そもそも存在しない変数を使用した関数呼び出しなどのエラーが発生します。

私のポイントは、同等のjavascript関数として書くことはできませんが、このようなことはできるということです

if (typeof some_var !== 'undefined') {
   // your code here
}

まったく同じ効果が必要な場合は、PHP も変数がチェックされていないことを確認してくださいNULL

例えば

$baz = null;
var_dump(isset($baz));        -> false

したがって、これを JavaScript に組み込むと、次のようになります。

if (typeof some_var !== 'undefined' && some_var !== null) {
   // your code here
}
于 2017-10-26T04:17:59.203 に答える