◆ プロパティや配列はキーがあるかをチェック
◆ null や undefined など未定義値を自分で入れたのを無視(存在しない扱い)したいなら
  ◆ PHP → isset
  ◆ JavaScript → typeof xxx !== "undefined"
◆ PHP の isset に $$var_name とすれば変数に入ってる文字列を変数名としてチェックできる

JavaScript

プロパティ


JavaScript ではオブジェクト(配列も一緒)にプロパティがあるかのチェックは簡単です
key in obj

と書くだけ
var obj = {
    a: 1,
    b: undefined
}
console.log("a" in obj)
console.log("b" in obj)
console.log("c" in obj)
true
true
false
var arr = [100]
arr[2] = undefined

console.log(0 in arr)
console.log(1 in arr)
console.log(2 in arr)
true
false
true

undefined であってもキーが存在すれば true になります
delete 削除じゃなくて undefined 代入してるから undefined は存在しない扱いにしたいというのなら
console.log(obj.b !== undefined)

とすれば キーがない未定義も undefined も undefined なので判定できます


すごく簡単

グローバル

では 次はプロパティ以外のとき

グローバル変数は window オブジェクトのプロパティなのでさっきの例の obj を window にするだけです
var x = 10
console.log(x in window) // true
console.log(y in window) // false

ローカル

ローカルスコープはたしか Call オブジェクト?のプロパティとかだったような記憶がありますがそのオブジェクトは JavaScript 上で扱えないのでプロパティとして考える方法はできません

ということで typeof を使います
!function(){
    var a = 1
    var b = undefined
    console.log(typeof a !== "undefined")
    console.log(typeof b !== "undefined")
    console.log(typeof c !== "undefined")
}()
true
false
false

typeof は 「!」 みたいに右側を評価した結果を扱う演算子なので 未定義な c とかエラーでるんじゃないの?? って思いそうですが なんとエラーはでずに型チェックできるんです
おどろきですよね

ただこれは未定義でも undefined でも同じ扱いになります
また スコープチェーンのせいでローカルの外側で定義されてる場合と区別できないという欠点はあります
その変数にエラー出さずにアクセス可能かという使い方なら問題ないはずです

JavaScript (文字列)

今度は JavaScript でチェックしたい変数名を文字列で持っている場合の方法です

プロパティの場合は上で書いた in を使ってキーの有無をチェックする方法が文字列なのでそのままです

なので ローカル変数の場合について
var var_name = "xxxx"

var_name に入ってる変数名の変数があるか知りたいという時です

typeof をしたいのですが ローカル変数は文字列からその変数を参照できないので普通にはできなそうです
ということでちょっとむりやり
console.log(eval(`typeof ${var_name}`) !== "undefined")

eval 使って文字列からローカル変数を参照します
!function(){
    var var_name = "xxxx"
    var xxxx = 100
    console.log(eval(`typeof ${var_name}`) !== "undefined")
    var_name = "yyyy"
    console.log(eval(`typeof ${var_name}`) !== "undefined")
}()
true
false

文字列からローカル変数って eval でもしないと取れないんだから必要がない気もします

PHP

プロパティ

PHP でもプロパティ・連想配列のキーのときは JavaScript と同じような感じです
キーが存在するかを見れば null を入れていても true で null かチェック (isset) すれば未定義か null でなければ true です
$obj = new StdClass();

$obj->a = 1;
$obj->b = null;

var_dump(property_exists($obj, "a"));
var_dump(property_exists($obj, "b"));
var_dump(property_exists($obj, "c"));

var_dump(isset($obj->a));
var_dump(isset($obj->b));
var_dump(isset($obj->c));
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

$assoc = ["a" => 1, "b" => null];

var_dump(array_key_exists("a", $assoc));
var_dump(array_key_exists("b", $assoc));
var_dump(array_key_exists("c", $assoc));

var_dump(isset($assoc["a"]));
var_dump(isset($assoc["b"]));
var_dump(isset($assoc["c"]));
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

グローバル・ローカル

JavaScript と違ってグローバルがオブジェクトのプロパティでないのでグローバルもローカルも同じになります

PHP の typeof は JavaScript みたいなことはできませんが 単純に isset するだけで存在するか確認できます
$a = 1;
$b = null;

var_dump(isset($a));
var_dump(isset($b));
var_dump(isset($c));
bool(true)
bool(false)
bool(false)

isset なので null を入れていても false になってしまう欠点があります

null もしくは未定義かのチェックではなく 変数が存在するかを知りたいときは get_defined_vars で宣言されてる変数一覧を取得できるのでここから array_key_exists を行います
$a = 1;
$b = null;

var_dump(array_key_exists("a", get_defined_vars()));
var_dump(array_key_exists("b", get_defined_vars()));
var_dump(array_key_exists("c", get_defined_vars()));
bool(true)
bool(true)
bool(false)

PHP (文字列)

PHPの場合は typeof がなくてどれもプロパティや連想配列のキーとしてチェックしているので文字列で変数名が入っていてもそのままです

isset をしたいときはちょっと特殊で $$var_name のように $$ になります
$a = 1;
$b = null;

$var_name = "a";
var_dump(isset($$var_name));
$var_name = "b";
var_dump(isset($$var_name));
$var_name = "c";
var_dump(isset($$var_name));
bool(true)
bool(false)
bool(false)

めったに使わないので忘れがちですが PHP では $ をいっぱいつけると 変数に入ってる文字列を変数名に使えるというわかりやすいようなわかりにくいような機能があるんですよね
http://var.blog.jp/archives/27827447.html