JavaScriptでnull
がobject
とみなされるのはなぜですか?
チェックしています
if ( object == null )
Do something
と同じ
if ( !object )
Do something
?
そしてまた:
null
とundefined
はどう違いますか?
(name is undefined)
あなた: name
とは何ですか? (*)
JavaScript: name
? name
とは何ですか?私はあなたが何について話しているのかわかりません。あなたは今までname
について言及したことがありません。あなたは(クライアント)側に他のスクリプト言語を見ていますか?
name = null;
あなた: name
とは何ですか?
JavaScript: 知りません。
要するに; undefined
は事の概念が存在しないところです。型はなく、その範囲内でこれまでに参照されたことはありません。 null
は存在することがわかっている場所ですが、値が何であるかはわかりません。
覚えておくべき1つのことは、null
は概念的には、false
や""
などと同じではありません。
name = false;
あなた: name
とは何ですか?
JavaScript: Booleanブール値。
name = '';
あなた: name
とは何ですか?
JavaScript: 空の文字列
*:この文脈でのname
は定義されたことがない変数として意味されます。未定義の変数でもかまいません。ただし、nameはほぼすべてのHTMLフォーム要素のプロパティです。それは道を辿って行き、idの前に設立されました。 IDは一意である必要がありますが、名前は一意である必要はないため、これは便利です。
違いはこのスニペットにまとめることができます:
alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(null !== undefined) //true
alert(null == undefined) //true
確認中
object == null
はif ( !object )
をチェックするのとは異なります。
単項の!
演算子は自動的に右のオペランドをブール値にキャストするので、後者は! Boolean(object)
と同じです。
Boolean(null)
はfalseに等しいので!false === true
。
あなたのオブジェクトが nullではない 、 だが false または 0 または "" の場合、チェックはパスします
alert(Boolean(null)) //false
alert(Boolean(0)) //false
alert(Boolean("")) //false
null
は オブジェクトではありません 、 プリミティブ値 です。たとえば、プロパティを追加することはできません。 typeof null
が"object"
を返すので、時々人々はそれがオブジェクトであると誤って仮定します。しかし、それは実際にはバグです(ECMAScript 6でも修正される可能性があります)。
null
とundefined
の違いは次のとおりです。
undefined
:JavaScriptによって使用され、「値なし」を意味します。初期化されていない変数、欠けているパラメータ、未知の変数はその値を持ちます。
> var noValueYet;
> console.log(noValueYet);
undefined
> function foo(x) { console.log(x) }
> foo()
undefined
> var obj = {};
> console.log(obj.unknownProperty)
undefined
ただし、未知の変数にアクセスすると例外が発生します。
> unknownVariable
ReferenceError: unknownVariable is not defined
null
:プログラマが「値なし」を示すために使用します。関数へのパラメータとして。
変数を調べる:
console.log(typeof unknownVariable === "undefined"); // true
var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true
var bar = null;
console.log(bar === null); // true
一般的な規則として、JavaScriptでは常に===を使用し、==を使用しないでください(==を実行すると あらゆる種類の変換が行われます /予期しない結果が生じる可能性があります)。 null
とundefined
の両方に機能するので、x == null
のチェックはEdgeのケースです。
> null == null
true
> undefined == null
true
変数に値があるかどうかを確認する一般的な方法は、それをブール値に変換し、それがtrue
であるかどうかを確認することです。その変換はif
ステートメントとブール演算子によって実行されます。 (「しない」)。
function foo(param) {
if (param) {
// ...
}
}
function foo(param) {
if (! param) param = "abc";
}
function foo(param) {
// || returns first operand that can't be converted to false
param = param || "abc";
}
このアプローチの欠点:以下の値はすべてfalse
と評価されるため、注意が必要です(たとえば、上記のチェックではundefined
と0
を区別できません)。
undefined
、null
false
+0
、-0
、NaN
""
Boolean
を関数として使用することで、ブール値への変換をテストできます(通常、これはnew
と共に使用されるコンストラクタです)。
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
Nullと未定義の違いは何ですか?
定義がない場合のプロパティは未定義です。 nullはオブジェクトです。その型はオブジェクトです。 nullは "値がないことを意味する特別な値です。undefinedはオブジェクトではなく、型は未定義です。
あなたは変数を宣言し、それをnullに設定することができ、そしてその動作は "null"が "undefined"に対して表示されることを除いて同じです。未定義の変数とnullまたはその逆を比較することもできます。その場合、条件は真になります。
undefined == null
null == undefined
詳細は JavaScriptとnullと未定義の違い を参照してください。
そしてあなたの新しい edit yes
if (object == null) does mean the same if(!object)
objectがfalseかどうかをテストするとき、両方ともif false をテストするときの条件を満たすだけですが、trueのときは満たさない
ここでチェックしてください: Javascript gotcha
質問の最初の部分:
なぜnullはJavaScriptのオブジェクトと見なされるのですか?
これは、現在修正できないJavaScriptの設計エラーです。オブジェクト型ではなく、null型にするか、まったく使用しないでください。実際のオブジェクトを検出する際には、追加のチェック(忘れられていることもあります)が必要であり、バグの原因となっています。
質問の第二部:
チェックしています
if (object == null)
Do something
と同じif (!object)
Do something
次の場合を除いて、2つのチェックは常に両方ともfalseです。
objectが未定義またはnullです。両方ともtrueです。
objectがプリミティブで、0、""
、またはfalseの場合、最初にfalse、2番目にtrueをチェックします。
オブジェクトがプリミティブではなく実際のオブジェクト(new Number(0)
、new String("")
、またはnew Boolean(false)
)の場合、両方のチェックは偽です。
したがって、「オブジェクト」が実際のオブジェクトを意味すると解釈された場合、両方のチェックは常に同じです。プリミティブが許可されている場合、チェックは0、""
、およびfalseで異なります。
object==null
のような場合、明白でない結果がバグの原因になる可能性があります。 ==
の使用はこれまで推奨されていませんが、代わりに===
を使用してください。
質問の第三部:
そしてまた:
nullと未定義の違いは何ですか?
JavaScriptでは、1つの違いは、nullはオブジェクト型で、undefinedは未定義型です。
JavaScriptでは、null==undefined
はtrueで、typeが無視された場合は等しいと見なされます。なぜ彼らがそれを決めたのですが、0、""
とfalseは等しくありません、私は知りません。それは恣意的な意見のようです。
JavaScriptでは、null===undefined
の型は同じでなければならないため、===
は真実ではありません。
実際には、nullと未定義は、どちらも存在しないことを表すため、同一です。そのため、0と""
を実行してください。空のコンテナ[]
と{}
も同様です。だから何も同じものの多くの種類はバグのレシピです。 1つのタイプかまったくない方が良いです。私はできるだけ使用しないようにします。
'false'、 'true'、および '!'たとえばif(!x)
とif(x)
だけで十分です。あなたはtrueとfalseを必要としません。
値が指定されていない場合、宣言されたvar x
は型未定義ですが、xがまったく宣言されていない場合と同じになります。もう1つのバグの原因は空のnothingコンテナです。ですから、var x=1
のように一緒に宣言して定義するのが最善です。
人々は、これらのさまざまなタイプのものをすべて見つけようとして、輪になって回っていますが、複雑な異なる服装でもまったく同じことです。現実は
undefined===undeclared===null===0===""===[]==={}===nothing
そして、おそらくすべてが例外を投げるべきです。
var x = null;
xはnullとして定義されています
yは定義されていません。 //定義しなかったため
if (!x)
nullはfalseと評価されます
JavaScriptでのさまざまなnullチェックの比較
http://jsfiddle.net/aaronhoffman/DdRHB/5/ /
// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;
...trim...
http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html
Nullおよび未定義を理解するための1つの方法は、それぞれが発生する場所を理解することです。
以下の状況では、nullの戻り値が必要です。
DOMを問い合わせるメソッド
console.log(window.document.getElementById("nonExistentElement"));
//Prints: null
Ajaxリクエストから受け取ったJSONレスポンス
{
name: "Bob",
address: null
}
流動的な状態にある新機能。以下はnullを返します。
var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));
// But this returns undefined:
Object.getOwnPropertyDescriptor({}, "a");
存在しない他のすべてのケースは未定義で示されます(@Axelで示されるように)。以下のそれぞれは "undefined"を表示します。
var uninitalised;
console.log(uninitalised);
var obj = {};
console.log(obj.nonExistent);
function missingParam(missing){
console.log(missing);
}
missingParam();
var arr = [];
console.log(arr.pop());
もちろん、あなたがvar unitialised = nullと書くことにしたのであれば。または自分でメソッドからnullを返すと、他の状況でnullが発生することになります。しかし、それはかなり明白なはずです。
3番目のケースは、変数にアクセスしたいが宣言されているかどうかさえわからない場合です。その場合は、参照エラーを避けるためにtypeofを使用してください。
if(typeof unknown !== "undefined"){
//use unknown
}
要約すると、DOMを操作しているとき、Ajaxを処理しているとき、または特定のECMAScript 5機能を使用しているときは、nullをチェックします。他のすべての場合には、未定義を厳密な等価性でチェックするのが安全です。
if(value === undefined){
// stuff
}
nullとundefinedは、値が等しい場合は両方ともfalseです(null == undefined)。両方ともfalseにブール値になります。それらは同じオブジェクトではありません(null!==未定義)。
undefinedはグローバルオブジェクト(ブラウザでは "window")のプロパティですが、プリミティブ型でオブジェクトそのものではありません。これは、初期化されていない変数および関数がreturn文なしで終了する場合のデフォルト値です。
nullはObjectのインスタンスです。コレクションオブジェクトを返すDOMメソッドでは空が返されることを示すためにnullが使用され、エラーを示すことなくfalseの値が返されます。
の答えに追加するには、JavaScript定義ガイド のこのページの から、undefined
とnull
の違いは何ですか - /:
undefined
はシステムレベル、予期しない、またはエラーのような値の不在を表し、null
はプログラムレベル、通常の、または予想される値の不在を表すと考えるかもしれません。これらの値の1つを変数またはプロパティに代入するか、これらの値の1つを関数に渡す必要がある場合は、null
がほとんどの場合正しい選択です。
いくつかの精度:
nullおよび未定義 は 2つの異なる値です。 1つは名前の値が存在しないことを表し、もう1つは名前が存在しないことを表します。
if
name__で何が起こるかは、if( o )
に対して以下のようになります。
括弧oの中の式が評価され、それからif
name__が括弧の中の式の値を型強制的に型指定します。ここではo
name__です。
JavaScriptの偽造(それは偽に強制されるでしょう)値は次のとおりです: ''、null、未定義、0、および偽 。
null
はオブジェクトです。その型はnullです。 undefined
はオブジェクトではありません。その型は未定義です。
例えばwindow.someWeirdProperty
は未定義なので、
"window.someWeirdProperty === null"
はfalseに評価されますが
"window.someWeirdProperty === undefined"
はtrueと評価されます。
さらに、checkif if (!o)
は、o
がfalse
であることについてif (o == null)
をチェックするのと同じではありません。
未定義と比較してnullについてのもう一つのおもしろいことは、それが増加することができるということです。
x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0
これは、カウンタにデフォルトの数値を設定するのに役立ちます。その宣言で何回変数を-1に設定しましたか。
これを見てください。
<script>
function f(a){
alert(typeof(a));
if (a==null) alert('null');
a?alert(true):alert(false);
}
</script>
//return:
<button onclick="f()">nothing</button> //undefined null false
<button onclick="f(null)">null</button> //object null false
<button onclick="f('')">empty</button> //string false
<button onclick="f(0)">zero</button> //number false
<button onclick="f(1)">int</button> //number true
<button onclick="f('x')">str</button> //string true
Javascript null
はobject
型ではなく、primitave
型です。
違いはなんですか? 未定義 設定されていないポインタを参照します。 NULL はNULLポインタを参照します。たとえば、何かが手動で変数をnull
型に設定しました。
次の関数は、その理由を示し、違いを解決することができます。
function test() {
var myObj = {};
console.log(myObj.myProperty);
myObj.myProperty = null;
console.log(myObj.myProperty);
}
電話した場合
test();
あなたはなっています
undefined
ヌル
最初のconsole.log(...)
は、まだ定義されていない状態でmyProperty
からmyObj
を取得しようとしています - したがって、 "undefined"に戻ります。 nullを代入した後、myProperty
が存在するため、2番目のconsole.log(...)
は明らかに "null"を返しますが、null
という値が割り当てられています。
この違いを調べることができるように、JavaScriptにはnull
とundefined
があります。null
は - 他の言語と同じようにオブジェクトですが、undefined
はオブジェクトにできないためです。利用可能なインスタンスがありません(null
インスタンスでなくても)。
'null'について考える最良の方法は、データベースで同様の概念がどのように使用されているかを思い出すことです。ここで、フィールドに「まったく値がない」ことが示されています。
これはより簡単にデバッグされるプログラムを書くのに非常に便利なテクニックです。 'undefined'変数はバグの結果である可能性があります... (どうやってわかりますか?) ...しかし、変数に 'null'という値が含まれている場合は、このプログラムでは、 それを に設定して 'null'にします。したがって、変数の値を削除する必要がある場合は、「削除」しないでください。 'nullに設定してください。 」古い値は孤立し、すぐにガベージコレクションされます。新しい値は「今は値がない」ということです。どちらの場合も、変数の状態は確実です。「明らかに、意図的に、そのようにしました。」
Nicholas C. Zakasによる「オブジェクト指向のJavaScriptの原理」より
しかし、なぜ型がnullであるオブジェクトなのでしょうか。 (実際、これはJavaScriptを設計および管理する委員会であるTC39によってエラーとして認識されています。nullは空のオブジェクトポインタであり、「オブジェクト」は論理的な戻り値になりますが、それでも混乱します。)
Zakas、Nicholas C.(2014-02-07)。オブジェクト指向JavaScriptの原理(Kindle Locations 226-227)。いいえ澱粉プレス。キンドル版。
それは言った:
var game = null; //typeof(game) is "object"
game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {};
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;
未定義の場合
var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.
2.Undefinedは型そのもので、Nullはオブジェクトです。
3.Javascriptは、割り当てられていない変数を未定義に初期化することはできますが、変数の値をnullに設定することはできません。これはプログラム的に行わなければなりません。