911

JavaScriptでnullと見なされるのはなぜですか?object

チェック中

if ( object == null )
      Do something

と同じ

if ( !object )
      Do something

?

また:

nullとはどう違いundefinedますか?

4

22 に答える 22

1524
(name is undefined)

あなた:とは何nameですか? (*)
JavaScript: name ? とはname? 何を言っているのかわからない。あなたは今まで何も言及していませんname。(クライアント) 側で他のスクリプト言語を見ていますか?

name = null;

あなた:とは何nameですか?
JavaScript:わかりません。

要するに; undefinedものの概念が存在しない場所です。タイプがなく、そのスコープで以前に参照されたことがない。null物が存在することが知られている場所ですが、値が何であるかは不明です。

覚えておくべきことの 1 つnullは、概念的には、型キャスト後に同等であるとしても、またはそのようなものではないということです。つまりfalse""

name = false;

あなた:とは何nameですか?
JavaScript:ブール値 false。

name = '';

あなた:とは何nameですか?
JavaScript:空の文字列


*:nameこのコンテキストでは、定義されていない変数を意味します。これは未定義の変数である可能性がありますが、name はほぼすべての HTML フォーム要素のプロパティです。それはずっと前にさかのぼり、IDのかなり前に制定されました。ID は一意である必要がありますが、名前は一意である必要がないため便利です。

于 2009-04-29T13:31:20.257 に答える
146

違いは次のスニペットに要約できます。

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 then に等しいので!false === true

したがって、オブジェクトがnullではなく、 falseまたは0または""の場合、次の理由によりチェックに合格します。

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false
于 2009-04-29T06:44:13.370 に答える
132

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 では常に === を使用し、決して == を使用しないでください (== は、予期しない結果をもたらす可能性のあるあらゆる種類の変換を実行します)。このチェックは、 と の両方でx == null機能するため、エッジ ケースです。nullundefined

> 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

  • undefinednull
  • ブール値:false
  • 数字: +0-0NaN
  • 文字列:""

関数として使用することにより、ブール値への変換をテストできBooleanます(通常はコンストラクターであり、 で使用されますnew):

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
于 2011-11-01T15:06:10.093 に答える
26

null と undefined の違いは何ですか??

定義がない場合のプロパティはundefinedです。anullはオブジェクトです。そのタイプはobjectです。null は「値なし」を意味する特別な値です。 undefined はオブジェクトではなく、その型は未定義です。

変数を宣言して null に設定することができます。動作は同じですが、"null" と "undefined" が表示される点が異なります。未定義の変数を null と比較したり、その逆を比較したりすることもでき、条件は true になります。

 undefined == null
 null == undefined

詳細については、null と未定義の JavaScript の違いを参照してください。

そしてあなたの新しい編集で はい

if (object == null)  does mean the same  if(!object)

if が false かどうかをテストするとき、 falseobjectかどうかをテストするときのみ条件を満たしますが、 true のときは条件を満たしません

ここを確認してください:Javascriptの落とし穴

于 2009-04-29T05:52:17.350 に答える
21

質問の最初の部分:

JavaScriptでnullがオブジェクトと見なされるのはなぜですか?

これはJavaScriptの設計エラーであり、現在修正することはできません。オブジェクト型ではなく、null型であるか、まったくないはずです。実際のオブジェクトを検出するときに追加のチェック(場合によっては忘れられる)が必要であり、バグの原因になります。

質問の2番目の部分:




if (object == null)
Do something

と同じようにチェックしています

if (!object)
Do something

次の場合を除いて、2つのチェックは常に両方ともfalseです。

  • オブジェクトが未定義またはnull:両方ともtrue。

  • オブジェクトはプリミティブであり、0 、、、""またはfalseです。最初にfalseをチェックし、次にtrueをチェックします。

オブジェクトがプリミティブではなく、、、、、などの実際のオブジェクトである場合new Number(0)、両方のチェックはfalseです。new String("")new Boolean(false)

したがって、「オブジェクト」が実際のオブジェクトを意味すると解釈される場合、両方のチェックは常に同じです。プリミティブが許可されている場合、チェックは0、、、""およびfalseで異なります。

のような場合object==null、明らかでない結果がバグの原因となる可能性があります。の使用==は推奨されていません===。代わりに使用してください。

質問の3番目の部分:

また

、nullとundefinedの違いは何ですか?

JavaScriptでは、1つの違いは、nullはobject型であり、undefinedはundefined型であるということです。

JavaScriptでは、null==undefinedはtrueであり、typeが無視された場合は等しいと見なされます。なぜ彼らがそれを決めたのか、しかし0""とfalseは等しくない、私にはわかりません。恣意的な意見のようです。

JavaScriptではnull===undefined、タイプはで同じでなければならないため、trueではありません===

実際には、nullとundefinedはどちらも存在しないことを表すため、同一です。したがって、0を実行します。""さらに言えば、空のコンテナ[]{}。同じものの非常に多くの種類は、バグのレシピです。1つのタイプまたはまったくない方が良いです。できるだけ少なくしようと思います。

「false」、「true」、および「!」たとえば、単純化できるワームのもう1つのバッグであり、if(!x)それif(x)だけで十分であるため、真と偽は必要ありません。

値が指定されていない場合、宣言されたvar xタイプは未定義ですが、xがまったく宣言されていない場合と同じである必要があります。もう1つのバグの原因は、空の何もないコンテナです。したがって、のように、一緒に宣言して定義するのが最善var x=1です。

人々はこれらのさまざまな種類の何もないものすべてを理解しようと円を描いてぐるぐる回っていますが、それは複雑な異なる服ですべて同じことです。現実は

undefined===undeclared===null===0===""===[]==={}===nothing

そして多分すべてが例外を投げるべきです。

于 2011-07-14T22:15:36.360 に答える
12
typeof null;      // object
typeof undefined; // undefined

値 null は、オブジェクト値が意図的に存在しないことを表します。これは JavaScript のプリミティブ値の 1 つであり、ブール演算では偽として扱われます。

var x = null;
var y;

x が宣言され、null として定義されている

y は宣言されていますが、定義されていません。値なしで宣言されているため、未定義です。

z は宣言されていないため、z を使用しようとすると未定義になります。

于 2009-04-29T05:56:27.403 に答える
9

null と undefined を理解する 1 つの方法は、それぞれがどこで発生するかを理解することです。

次の状況では、null の戻り値が予想されます。

  • DOM を照会するメソッド

    console.log(window.document.getElementById("nonExistentElement"));
    //Prints: null
    
  • Ajax リクエストから受け取った JSON レスポンス


    {
      name: "Bob",
      address: null
    }
  • RegEx.exec .

  • 流動的な状態にある新しい機能。以下は null を返します。


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

存在しない他のすべてのケースは、未定義で示されます(@Axelで指摘されているように)。次の各出力は「未定義」です。

    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 unitialized = null; と書くことにした場合。または自分でメソッドからnullを返すと、他の状況でnullが発生します。しかし、それはかなり明白なはずです。

3 番目のケースは、変数にアクセスしたいが、それが宣言されているかどうかさえわからない場合です。その場合、 typeof を使用して参照エラーを回避します。

if(typeof unknown !== "undefined"){
    //use unknown
}

要約すると、DOM を操作している場合、Ajax を処理している場合、または特定の ECMAScript 5 機能を使用している場合は、null をチェックします。他のすべてのケースでは、 undefined を厳密に同等にチェックするのが安全です:

if(value === undefined){
  // stuff
}
于 2012-05-07T10:06:37.917 に答える
8

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

JavaScript Null チェック比較表

于 2013-04-29T15:23:52.407 に答える
6

このページの JavaScript Definitive Guide 6th Edition、p.41から、との違いは何ですかundefinednullの回答に追加するには:

undefinedシステムレベル、予期しない、またはエラーのような値の欠如nullを表し、プログラムレベル、通常、または予期される値の欠如を表すと考えることができます。これらの値の 1 つを変数またはプロパティに割り当てたり、これらの値の 1 つを関数に渡したりする必要がある場合nullは、ほとんどの場合正しい選択です。

于 2012-10-07T14:47:03.740 に答える
5

null と undefined は、値が等しい場合 (null==undefined) はどちらも false です。どちらも boolean false に折りたたまれます。それらは同じオブジェクトではありません (null!==未定義)。

undefined はグローバル オブジェクト (ブラウザでは「ウィンドウ」) のプロパティですが、プリミティブ型であり、オブジェクト自体ではありません。これは、return ステートメントなしで終了する、初期化されていない変数と関数の既定値です。

null は Object のインスタンスです。null は、空の結果を示すコレクション オブジェクトを返す DOM メソッドに使用されます。これは、エラーを示さずに false 値を提供します。

于 2009-04-29T05:58:37.083 に答える
2

たとえば、window.someWeirdProperty未定義な​​ので、

"window.someWeirdProperty === null"false と評価される

"window.someWeirdProperty === undefined"true と評価されます。

さらに、checkifはbeingのチェックとif (!o)同じではありません。if (o == null)ofalse

于 2009-04-29T05:55:49.947 に答える
1
  1. 未定義は、変数が宣言されているが値が割り当てられていないことを意味し、Null は「値なし」を表す変数に割り当てることができます (Null は代入演算子です)。

2.Undefined は型そのものですが、Null はオブジェクトです。

3.Javascript自体は、割り当てられていない変数を未定義に初期化できますが、変数の値をnullに設定することはできません。これはプログラムで行う必要があります。

于 2016-03-11T12:27:18.837 に答える
1

nullはオブジェクトです。その型は null です。undefinedオブジェクトではありません。その型は未定義です。

于 2009-04-29T05:51:14.200 に答える
1

未定義と比較して、null のもう 1 つの楽しい点は、インクリメントできることです。

x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

これは、カウンターのデフォルトの数値を設定するのに役立ちます。宣言で変数を -1 に設定したことが何回ありますか?

于 2016-02-10T15:45:31.233 に答える
1

Nicholas C. Zakas 著「The Principles of Object-Oriented Javascript」より

しかし、型が null の場合、なぜオブジェクトなのでしょうか? (実際、これは JavaScript の設計と保守を行う委員会である TC39 によってエラーとして認められています。null は空のオブジェクト ポインターであり、"object" は論理的な戻り値であると考えることができますが、それでも混乱を招きます。)

ザカス、ニコラス 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.
于 2014-08-28T19:49:50.180 に答える
0

null を使用して何かを値を持たないと定義し、何かがまったく定義されていない可能性があると予想される場合は undefined を使用します。

たとえば、変数に値がない場合は、null として割り当てます。

var weDontHaveAValue = null;

オプションのオプション引数など、何かがまったく定義されていないことが予想される場合は、undefined を使用してください。

if (typeof args.optionalParam !== 'undefined') { }
于 2020-10-02T06:14:27.130 に答える