Are objects immutable?

I am trying to create something from a tree structure.

I want to access my data as follows:

data[key1][key2]

However, key1 and key2 have a symmetrical relationship; The following is always true:

data[key1][key2] == data[key2][key1]

In particular, I have data[key1][key2]and data[key2][key1]pointing to the same object, so changes in one affect the other.

My problem arises from the fact that I want to delete the base object. I know if I use:

delete data[key1][key2];

data[key2][key1] still refers to the object.

My question is this: is there a way to remove the underlying object or rewrite it with something false so that both properties above evaluate to false?

+5
source share
3 answers

Think of it this way:

data[key1][key2] -----> object1
                          ^
data[key2][key1] ---------+

(, ) , :

data[key1][key2] -----> object1

data[key2][key1] -----------> object2

( , :)

data[key1][key2] -----> object1

data[key2]

, . . :

a) , :

data[key1][key2] -----> object2
                          ^
data[key2][key1] ---------+

( :)

data[key1][key2]       object1 (no references, will be garbage collected)

data[key2][key1]

b) . , , - . , , .

data[key1][key2] -----> object1 with 'isDeleted'=true
                          ^
data[key2][key1] ---------+

a), , , . , / ?

+3

valueOf() . , valueOf Boolean. , , , x...

> x = {}
Object
> (x == false ? 'yes' : 'no')
"no"
> x.valueOf = function() {return false;}
function () {return false;}
> (x == false ? 'yes' : 'no')
"yes"

... .. data[key1][key2] == data[key2][key1] == x, x.valueOf = function() {return false;} , x, . , data[key1][key2] == false, x .

, x , . . Of, , - ...

(x ? 'yes' : 'no')
"yes"
+1

, , , :

:

. , . ( - ), .

- , falsey?

. , false (false, null, undefined, 0 ..). , , " ". , .

, , (, "" ), . , "private", :

function Foo() {
  var obsolete = false;

  this.obsolete = function (){
    return obsolete;
  };

  this.delete = function (){
    obsolete = true;
  };
}

var foo = new Foo();
var bar = new Foo();

alert(foo.obsolete() + ', ' + bar.obsolete()); // false, false

foo.delete();

alert(foo.obsolete() + ', ' + bar.obsolete()); // true, false

, . , :

if ( data[key1][key2] ) {
  // do stuff
}

:

if ( !data[key1][key2].obsolete() ) {
  // do stuff
}

, . , if (obj.current()), if (!obj.obsolete()). .

+1

All Articles