Передайте строку ссылкой в JavaScript

Другая функция, что шаблоны C++ имеют тот Java дженерики, не делает специализация. Это позволяет Вам иметь другую реализацию для определенных типов. Таким образом, у Вас может, например, быть высоко оптимизированная версия для интервал , все еще имея универсальную версию для остальной части типов. Или у Вас могут быть различные версии для указателя и неуказательных типов. Это пригождается, если Вы хотите воздействовать на разыменованный объект при вручении указателя.

42
задан Jeff Meatball Yang 20 August 2009 в 21:04
поделиться

5 ответов

Строки в Javascript уже передаются «по ссылке» - вызов процедуры со строкой не включает копирование содержимого строки. Здесь есть две проблемы:

  • Строки неизменяемы. В отличие от строк C ++, созданная строка JavaScript не может быть изменена.
  • В JavaScript переменным не назначаются статические слоты, как в C ++. В вашем коде метрика - это метка, которая применяется к двум совершенно отдельным строковым переменным.

Вот один из способов добиться желаемого, используя замыкания для реализации динамической области видимости метрики :

function Report(a, b) {
    this.ShowMe = function() { alert(a() + " of " + b); }
}

var metric = "count";
var metric_fnc = function() { return metric; }
var a = new Report(metric_fnc, "a"); 
var b = new Report(metric_fnc, "b"); 
a.ShowMe();  // outputs:  "count of a";
metric = "avg";
b.ShowMe();  // outputs:  "avg of b";
55
ответ дан 26 November 2019 в 23:30
поделиться

Вы можете заключить строку в объект и изменить поле, в котором она хранится. Это похоже на то, что вы делаете в последнем примере, только без необходимости изменять функции.

var metric = { str : "count" } 
metric.str = "avg";

Теперь metric.str будет содержать «avg»

34
ответ дан 26 November 2019 в 23:30
поделиться

Закрытие?

var metric = new function() {
    var _value = "count";

    this.setValue = function(s) { _value = s; };
    this.toString = function() { return _value; };
};

// snip ...
a.ShowMe();

metric.setValue("avg");
b.ShowMe();
c.ShowMe();

или сделать его немного более универсальным и производительным:

function RefString(s) {
    this.value = s;
}

RefString.prototype.toString = function() { return this.value; }
RefString.prototype.charAt = String.prototype.charAt;

var metric = new RefString("count");

// snip ...

a.ShowMe();

metric.value = "avg";
b.ShowMe();
c.ShowMe();

Если вы не закрываете нужную строковую переменную, то я полагаю, что единственным другим способом будет измените функцию ShowMe, как в ответе @John Millikin, или измените архитектуру базы кода.

10
ответ дан 26 November 2019 в 23:30
поделиться

Если вы передадите переменную как объект, она будет работать, поскольку объекты передаются по ссылке в Javascript.

http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

function modifyVar(obj,newVal){
obj.value=newVal;
}
var m={value: 1};
alert(x);
modifyVar("x",321);
alert(x);
3
ответ дан 26 November 2019 в 23:30
поделиться

В JavaScript строки неизменяемы. Вы не можете изменить саму строку, если у экземпляров Report есть дескриптор.

ваше решение работает, но это может быть проще:

function Report(a, b) {
  this.showMe = function() { alert(a.str + " of " + b); }
}

var metric = {};
metric.str = "count";

a.Showme();
metric.str = "avg";
b.ShowMe();
0
ответ дан 26 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: