2013-09-26 3 views
2

Я хочу, чтобы иметь возможность иметь две ссылки на то же примитивное значение, и любое изменение сделано через одно должно быть отражено в другой «волшебно» - то есть с помощью кода C в качестве примера:Javascript: две ссылки на один и тот же примитив, изменяющийся в одно и то же время?

// (C code): 
int value = 0; 
int *p1 = &value; 
... 
int *p2 = &value; 
*p2 = 1; 
... 
printf("%d", *p1); // gives 1, not 0 

только Кстати, я догадался об этом, используя дополнительное объектное направление:

var a = { valueWrapper: { num: 1, str: 'initial' } }; 
var b = a; 

// change a 

a.valueWrapper.num = 2; 
a.valueWrapper.str = 'changed'; 

// show b 

console.log(b.valueWrapper.num); 
console.log(b.valueWrapper.str); 

// outputs: 
// 
// $ node test.js 
// 2 
// changed 

Есть ли более чистый способ?

+0

Ваш 'valueWrapper' Посредник не требуется. Если объектный литерал присваивается 'a', а' a' присваивается 'b', обе переменные будут разделять ссылку на тот же объект. –

+0

Я спрашиваю про примитивы, хотя: «две ссылки на один и тот же примитив». – angularJsNewbie

+0

Действительно, но что было бы неправильно с 'a = {num: 1, str:" initial "}'? Оба примитива будут разделяться между всеми переменными, которые относятся к тому же объекту, что и 'a'. Другими словами, вам нужна только одна обертка. –

ответ

2

В Javascript примитивные типы, такие как целые числа и строки, передаются по значению. Нет способа построить метод, чтобы изменить это.

Вы можете избавиться от «valueWrapper», если это не дизайн:

var a = {num : 1, str : "initial"}; 
var b = a; 
a.num = 2; 
console.log(b.num); // display 2 
0

Существует только один случай - параметр и объект аргумента функции - они волшебным образом меняют друг друга, даже когда значение является примитивным типом (это не работает в строгом режиме).

function magicLink(a,b) { 
     arguments[0] = 5; 
     arguments[1] = 10; 
     console.log([a,b]); 
    } 

    magicLink(1); // [5, undefined] 

Это работает только для параметров, заданных во время вызова.

+0

Можете ли вы привести пример? – angularJsNewbie

+0

@angularJsNewbie здесь вы;) – magyar1984

Смежные вопросы