Pertanyaan Apa perbedaan antara nol dan tidak didefinisikan dalam JavaScript?


Saya ingin tahu apa perbedaannya null dan undefined di JavaScript.


826
2018-02-22 10:30


asal


Jawaban:


Di JavaScript, undefined berarti variabel telah dinyatakan tetapi belum diberi nilai, seperti:

var TestVar;
alert(TestVar); //shows undefined
alert(typeof TestVar); //shows undefined

null adalah nilai tugas. Ini dapat ditugaskan ke variabel sebagai representasi tanpa nilai:

var TestVar = null;
alert(TestVar); //shows null
alert(typeof TestVar); //shows object

Dari contoh sebelumnya, sudah jelas itu undefined dan null dua tipe berbeda: undefined adalah tipe sendiri (tidak terdefinisi) sementara null adalah sebuah objek.

null === undefined // false
null == undefined // true
null === null // true

dan

null = 'value' // ReferenceError
undefined = 'value' // 'value'

825
2018-02-22 10:31



Saya memilih ini dari sini 

Nilai tidak terdefinisi adalah nilai primitif yang digunakan ketika variabel tidak   diberi nilai.

Nilai nol adalah nilai primitif yang mewakili nol, kosong,   atau referensi tidak ada.

Ketika Anda mendeklarasikan variabel melalui var dan tidak memberinya nilai, ia akan memiliki nilai yang tidak terdefinisi. Dengan sendirinya, jika Anda mencoba untuk WScript.Echo () atau alert () nilai ini, Anda tidak akan melihat apa pun. Namun, jika Anda menambahkan string kosong, tiba-tiba ia akan muncul:

var s;
WScript.Echo(s);
WScript.Echo("" + s);

Anda dapat mendeklarasikan variabel, setel ke null, dan perilaku identik kecuali bahwa Anda akan melihat "null" dicetak versus "tidak terdefinisi". Ini memang perbedaan kecil.

Anda bahkan dapat membandingkan variabel yang tidak terdefinisi menjadi null atau sebaliknya, dan kondisinya akan benar:

undefined == null
null == undefined

Mereka, bagaimanapun, dianggap sebagai dua jenis yang berbeda. Meskipun tidak terdefinisi adalah tipe untuk dirinya sendiri, null dianggap sebagai nilai objek khusus. Anda dapat melihat ini dengan menggunakan typeof () yang mengembalikan string yang mewakili tipe umum dari variabel:

var a;
WScript.Echo(typeof(a));
var b = null;
WScript.Echo(typeof(b));

Menjalankan skrip di atas akan menghasilkan output berikut:

undefined
object

Apa pun jenisnya yang berbeda, mereka akan tetap bertindak sama jika Anda mencoba mengakses salah satu anggota, misalnya artinya mereka akan melempar pengecualian. Dengan WSH Anda akan melihat "varname" yang ditakuti adalah null atau bukan objek "dan itu jika Anda beruntung (tapi itu topik untuk artikel lain).

Anda dapat secara eksplisit mengatur variabel menjadi tidak terdefinisi, tetapi saya sangat menyarankan untuk tidak melakukannya. Saya merekomendasikan hanya menyetel variabel ke null dan meninggalkan nilai yang tidak ditentukan untuk hal-hal yang Anda lupa tetapkan. Pada saat yang sama, saya sangat mendorong Anda untuk selalu mengatur setiap variabel. JavaScript memiliki rantai lingkup yang berbeda dari bahasa C-style, dengan mudah membingungkan bahkan programmer veteran, dan menetapkan variabel ke null adalah cara terbaik untuk mencegah bug berdasarkan itu.

Contoh lain di mana Anda akan melihat pop up tidak terdefinisi adalah ketika menggunakan operator hapus. Mereka dari C-world mungkin salah menginterpretasikan ini sebagai menghancurkan objek, tetapi tidak demikian. Apa yang dilakukan operasi ini adalah menghapus subskrip dari Array atau anggota dari suatu Objek. Untuk Array itu tidak mempengaruhi panjang, melainkan subscript yang sekarang dianggap tidak terdefinisi.

var a = [ 'a', 'b', 'c' ];
delete a[1];
for (var i = 0; i < a.length; i++)
WScript.Echo((i+".) "+a[i]);

Hasil dari skrip di atas adalah:

0.) a
1.) undefined
2.) c

Anda juga akan mendapatkan undefined ketika membaca subscript atau member yang tidak pernah ada.

Perbedaan antara nol dan tidak terdefinisi adalah: JavaScript tidak akan pernah mengatur apa pun ke nol, itulah biasanya yang kita lakukan. Meskipun kami dapat menetapkan variabel menjadi tidak terdefinisi, kami memilih nol karena itu bukan sesuatu yang pernah dilakukan untuk kami. Ketika Anda melakukan debugging ini berarti bahwa apa pun yang diatur ke null adalah milik Anda sendiri dan bukan JavaScript. Di luar itu, kedua nilai khusus ini hampir setara.


58
2018-02-22 10:34



batal adalah kata kunci khusus yang menunjukkan tidak adanya nilai.

pikirkan tentang itu sebagai nilai, seperti:

  • "foo" adalah string,
  • benar adalah boolean,
  • 1234 adalah angka,
  • null tidak terdefinisi.

tidak terdefinisi properti menunjukkan bahwa variabel belum diberi nilai termasuk nol juga. Seperti

var foo;

variabel kosong yang didefinisikan adalah null dari datatype undefined


Keduanya mewakili a nilai variabel tanpa nilai

DAN null tidak mewakili a tali yang tidak memiliki nilai - string kosong-


Seperti

var a = ''; 
console.log(typeof a); // string 
console.log(a == null); //false 
console.log(a == undefined); // false 

Sekarang jika

var a;
console.log(a == null); //true
console.log(a == undefined); //true 

TAPI

var a; 
console.log(a === null); //false 
console.log(a === undefined); // true

BEGITU masing-masing memiliki cara sendiri untuk digunakan

tidak terdefinisi menggunakannya untuk membandingkan tipe data variabel

batal gunakan untuk mengosongkan nilai variabel

var a = 'javascript';
a = null ; // will change the type of variable "a" from string to object 

27
2017-10-25 20:58



batal: tidak adanya nilai untuk variabel; tidak terdefinisi: tidak adanya variabel itu sendiri;

Variabel ..where adalah nama simbolis yang dikaitkan dengan nilai.

JS dapat berbaik hati secara implisit memasukkan variabel yang baru dideklarasikan batal, tetapi tidak.


13
2017-07-03 13:59



Silakan baca hal berikut dengan seksama. Ini akan menghapus semua keraguan Anda perbedaan antara batal dan tidak terdefinisi di JavaScript. Anda juga dapat menggunakan fungsi utilitas yang diberikan di bawah ini untuk menentukan jenis.

Dalam JavaScript kita bisa memiliki tipe variabel berikut.

  1. Variabel yang Tidak Dinyatakan
  2. Dideklarasikan tetapi Variabel yang Tidak Ditetapkan
  3. Variabel yang ditetapkan dengan literal tidak terdefinisi
  4. Variabel yang ditetapkan dengan literal batal
  5. Variabel yang ditugaskan dengan apa pun selain tidak terdefinisi atau batal

Berikut menjelaskan masing-masing kasus ini satu per satu

  1. Variabel yang Tidak Dinyatakan: Mengikuti berlaku untuk variabel tidak diungkapkan

    • Hanya dapat diperiksa oleh jenis() yang mengembalikan string 'tidak terdefinisi'
    • Tidak bisa diperiksa == atau === atau dengan jika atau operator bersyarat ?         (melempar Kesalahan Referensi)
  2. Dideklarasikan tetapi Variabel yang Tidak Ditetapkan

    • jenis mengembalikan string 'tidak terdefinisi'
    • == periksa dengan batal kembali benar
    • == periksa dengan tidak terdefinisi kembali benar
    • === periksa dengan batal kembali Salah
    • === periksa dengan tidak terdefinisi kembali benar
    • jika atau operator bersyarat ? kembali Salah
  3. Variabel yang ditetapkan dengan literal  tidak terdefinisi: Variabel-variabel ini diperlakukan sama dengan Dideklarasikan Tapi Variabel yang Tidak Ditetapkan.

  4. Variabel yang ditetapkan dengan literal  batal

    • jenis mengembalikan string 'obyek'
    • == periksa dengan batal kembali benar
    • == periksa dengan tidak terdefinisi kembali benar
    • === periksa dengan batal kembali benar
    • === periksa dengan tidak terdefinisi kembali Salah
    • jika atau operator bersyarat ? mengembalikan salah
  5. Variabel yang ditugaskan dengan apa pun selain  tidak terdefinisi atau batal

    • typeof mengembalikan salah satu dari string berikut: 'tali','jumlah','boolean','fungsi', 'obyek','simbol'

Berikut menyediakan algoritma untuk pengecekan tipe yang benar dari suatu variabel:

  1. Cek untuk tidak dideklarasikan/tidak ditugaskan/ditugaskan dengan  tidak terdefinisi menggunakan jenis. kembali jika string 'tidak terdefinisi' dikembalikan.
  2. Cek untuk batal menggunakan ===. kembali 'batal' jika benar.
  3. Periksa jenis yang sebenarnya menggunakan jenis. jenis kembali jika tidak sama dengan 'obyek'
  4. Panggilan Object.prototype.toString.call (o) untuk menentukan jenis objek sebenarnya. Ini akan mengembalikan seutas jenis '[objek ObjectType]'untuk semua yang dibangun di Javascript atau DOM Objek yang ditentukan. Untuk objek yang ditentukan pengguna, ia kembali '[Objek Obyek]'

Anda juga dapat menggunakan fungsi utilitas berikut untuk menentukan jenis. Saat ini mendukung semua tipe ECMA 262 2017.

function TypeOf(o,bReturnConstructor)
 {
   if(typeof o==='undefined') return 'undefined'
   if(o===null) return 'null'   
   if(typeof o!=='object') return typeof o

   var type=Object.prototype.toString.call(o)
  switch(type)
  {
     //Value types:4
     case '[object Number]': type='number';break;
     case '[object String]': type='string';break;
     case '[object Boolean]': type='boolean';break;
     case '[object Date]': type='date';break;


   //Error Types:7
     case '[object Error]': type='error';break;
     case '[object EvalError]': type='evalerror';break;
     case '[object RangeError]': type='rangeerror';break;
     case '[object ReferenceError]': type='referenceerror';break;
     case '[object SyntaxError]': type='syntaxerror';break;
     case '[object TypeError]': type='typeerror';break;
     case '[object URIError]': type='urierror';break;


    //Indexed Collection and Helper Types:13
     case '[object Array]': type='array';break;
     case '[object Int8Array]': type='int8array';break;
     case '[object Uint8Array]': type='uint8array';break;
     case '[object Uint8ClampedArray]': type='uint8clampedarray';break;
     case '[object Int16Array]': type='int16array';break;
     case '[object Uint16Array]': type='uint16array';break;
     case '[object Int32Array]': type='int32array';break;
     case '[object Uint32Array]': type='uint32array';break;
     case '[object Float32Array]': type='float32array';break;
     case '[object Float64Array]': type='float64array';break;
     case '[object ArrayBuffer]': type='arraybuffer';break;
     case '[object SharedArrayBuffer]': type='sharedarraybuffer';break;
     case '[object DataView]': type='dataview';break;

    //Keyed Collection Types:2
     case '[object Map]': type='map';break;
     case '[object WeakMap]': type='weakmap';break;

    //Set Types:2
     case '[object Set]': type='set';break;
     case '[object WeakSet]': type='weakset';break;

    //Operation Types
    case '[object RegExp]': type='regexp';break;
    case '[object Proxy]': type='proxy';break;
    case '[object Promise]': type='promise';break;

    case '[object Object]': type='object';
             if(bReturnConstructor && o.constructor) type=o.constructor.toString().match(/^function\s*([^\s(]+)/)[1];
         break;
    default:
        type=type.split(' ')[1]
        type=type.substr(0,type.length-1)   

   }
    return type 
}

10
2017-09-21 13:05



Tidak terdefinisi berarti suatu variabel telah dideklarasikan tetapi tidak memiliki nilai:

var var1;
alert(var1); //undefined
alert(typeof var1); //undefined

Null adalah tugas:

var var2= null;
alert(var2); //null
alert(typeof var2); //object

7
2018-02-22 10:34



Anda mungkin menganggap tidak terdefinisi untuk merepresentasikan tingkat ketidakhadiran nilai sistem, tidak terduga, atau seperti kesalahan dan nol untuk merepresentasikan tingkat nilai program, normal, atau tidak ada yang diharapkan.

melalui JavaScript: Panduan Definitif


7
2018-06-29 08:37



Saya akan menjelaskan undefined, null dan Uncaught ReferenceError:

1 - Uncaught ReferenceError : variabel belum diumumkan dalam naskah Anda, tidak ada referensi untuk varaible ini
2 - undefined: Variabel dideklarasikan tetapi tidak diinisialisasi
3 - null : Variabel menyatakan dan merupakan nilai kosong


7
2018-02-10 15:09



batal dan tidak terdefinisi dua jenis objek berbeda yang memiliki kesamaan berikut:

  • keduanya hanya dapat memiliki satu nilai, batal dan tidak terdefinisi masing-masing;
  • keduanya tidak memiliki properti atau metode dan upaya untuk membaca properti apa pun dari keduanya akan menghasilkan kesalahan run-time (untuk semua objek lainnya, Anda mendapatkan nilai tidak terdefinisi jika Anda mencoba membaca properti yang tidak ada);
  • nilai-nilai batal dan tidak terdefinisi dianggap sama satu sama lain dan tidak ada yang lain == dan != operator.

Namun persamaannya berakhir di sini. Untuk sekali ini, ada perbedaan mendasar dalam cara bagaimana kata kunci batal dan tidak terdefinisi diimplementasikan. Ini tidak jelas, tetapi perhatikan contoh berikut:

var undefined = "foo";
WScript.Echo(undefined); // This will print: foo

tidak terdefinisi, NaN dan Infinity hanya nama-nama variabel "superglobal" yang diinisialisasi awal - mereka diinisialisasi pada saat run-time dan dapat diganti oleh variabel global atau lokal normal dengan nama yang sama.

Sekarang, mari kita coba hal yang sama batal:

var null = "foo"; // This will cause a compile-time error
WScript.Echo(null);

Ups! batal, benar dan Salah adalah kata kunci yang dipesan - kompilator tidak akan membiarkan Anda menggunakannya sebagai variabel atau nama properti

Perbedaan lainnya adalah itu tidak terdefinisi adalah tipe primitif, sementara batal adalah jenis objek (menunjukkan tidak adanya referensi objek). Pertimbangkan yang berikut ini:

WScript.Echo(typeof false); // Will print: boolean
WScript.Echo(typeof 0); // Will print: number
WScript.Echo(typeof ""); // Will print: string
WScript.Echo(typeof {}); // Will print: object
WScript.Echo(typeof undefined); // Will print: undefined
WScript.Echo(typeof null); // (!!!) Will print: object

Juga, ada perbedaan penting dalam hal ini batal dan tidak terdefinisi diperlakukan dalam konteks numerik:

var a; // declared but uninitialized variables hold the value undefined
WScript.Echo(a === undefined); // Prints: -1

var b = null; // the value null must be explicitly assigned 
WScript.Echo(b === null); // Prints: -1

WScript.Echo(a == b); // Prints: -1 (as expected)
WScript.Echo(a >= b); // Prints: 0 (WTF!?)

WScript.Echo(a >= a); // Prints: 0 (!!!???)
WScript.Echo(isNaN(a)); // Prints: -1 (a evaluates to NaN!)
WScript.Echo(1*a); // Prints: -1.#IND (in Echo output this means NaN)

WScript.Echo(b >= b); // Prints: -1 (as expected)
WScript.Echo(isNaN(b)); // Prints: 0 (b evaluates to a valid number)
WScript.Echo(1*b); // Prints: 0 (b evaluates to 0)

WScript.Echo(a >= 0 && a <= 0); // Prints: 0 (as expected)
WScript.Echo(a == 0); // Prints: 0 (as expected)
WScript.Echo(b >= 0 && b <= 0); // Prints: -1 (as expected)
WScript.Echo(b == 0); // Prints: 0 (!!!)

batal menjadi 0 ketika digunakan dalam ekspresi aritmatika atau perbandingan numerik - serupa dengan Salah, pada dasarnya ini hanya jenis khusus "nol". tidak terdefinisi, di sisi lain, adalah "tidak ada" yang sejati dan menjadi NaN ("bukan angka") saat Anda mencoba menggunakannya dalam konteks numerik.

Perhatikan itu batal dan tidak terdefinisi menerima perawatan khusus dari == dan != operator, tetapi Anda dapat menguji persamaan numerik yang benar Sebuah dan b dengan ekspresi (a >= b && a <= b).


7
2018-03-16 04:20



tl; dr

Menggunakan null untuk menetapkan variabel yang Anda tahu itu adalah Objek.

Menggunakan undefined untuk menetapkan variabel yang jenisnya dicampur.


Ini adalah penggunaan saya dari 5 primitif dan tipe Object, dan itu menjelaskan perbedaan antara «use case» dari undefined atau null.

Tali

Jika Anda tahu variabel hanya string sementara semua siklus hidup, dengan konvensi, Anda dapat menginisialisasi, ke "":

("") ? true : false; // false
typeof ""; // "string";
("Hello World") ? true : false; // true
typeof "Hello World"; // "string"

Jumlah

Jika Anda tahu variabel hanya angka sementara semua siklus hidup, dengan konvensi, Anda dapat menginisialisasi, ke 0 (atau NaN jika 0 adalah nilai penting dalam penggunaan Anda):

(0) ? true : false; // false
typeof 0; // "number";
(16) ? true : false; // true
typeof 16; // "number"

atau

(NaN) ? true : false; // false
typeof NaN; // "number";
(16) ? true : false; // true
typeof 16; // "number"

Boolean

Jika Anda tahu variabel hanya boolean sementara semua siklus hidup, dengan konvensi, Anda dapat menginisialisasi, ke false:

(false) ? true : false; // false
typeof false; // "boolean";
(true) ? true : false; // true
typeof true; // "boolean"

Obyek

Jika Anda tahu sebuah variabel hanyalah Object sementara semua siklus hidup, dengan konvensi, Anda dapat menginisialisasi, ke null:

(null) ? true : false; // false
typeof null; // "object";
({}) ? true : false; // true
typeof {}; // "object"

Catatan: penggunaan pintar dari nol adalah menjadi falsy versi Objek karena Objek selalu ada true, dan karena typeof null kembali object. Itu berarti typeof myVarObject mengembalikan nilai yang konsisten untuk Object dan null type.

Semua

Jika Anda tahu variabel memiliki tipe campuran (jenis apa pun selama semua siklus hidup), dengan konvensi, Anda dapat menginisialisasi, untuk undefined.


5
2018-01-19 18:15



null adalah nilai spesial yang berarti "tidak bernilai". null adalah objek khusus karena typeof null mengembalikan 'objek'.

Di samping itu, undefined berarti bahwa variabel belum dinyatakan, atau belum diberi nilai.

Sumber.


4
2018-02-22 10:35