Thursday, November 11, 2010

JavaScripti omistamislause

Ja nüüd midagi, mis on mul huvitaval kombel siiani kahe silma vahele jäänud, aga mida lugesin Stoyan Stefanovi raamatust JavaScript Patterns ja mis tagantjärele tundub täiesti loogiline.

var a = b = c = 5;

Ei ole sugugi sama, mis

var a = 5;
var b = 5;
var c = 5;

Vaid hoopis

var a = 5;
b = 5;
c = 5;

Ehk et muutujatest b ja c saavad lokaalsete asemel hoopis globaalsed muutujad!

Samal teemal veel

Igaks juhuks märgin ära veel samasse teemasse kuuluva, aga juba tuntud probleemi

a = b = [];
c = d = {};
e = f = 5;

Sellise omistamise korral ei saa me mitte 2 massiivi-, kaks objekti- ja kaks numbriväärtust, vaid kaks numbriväärtust (e ja f, mõlema väärtuseks nr 5) ja ühe massiivi- ning ühe objektiväärtuse.

a ja b ei ole mitte eraldi väärtused, vaid kaks muutujat, mis viitavad ühele ja samale massiiviväärtusele. JavaScriptis on objektide edastamine (ka massiiv on objekt) alati BY REFRENCE.

Seega lause

a = b = [];

võib lahti kirjutada ka kui

a = (b=[]);

ehk

b = [];
a = b; // BY REFRENCE!