Он всегда проходит по значению, но для объектов значение переменной является ссылкой. Из-за этого, когда вы передаете объект и меняете его членов , эти изменения сохраняются вне функции. Это делает выглядеть как пропуск по ссылке. Но если вы действительно измените значение переменной объекта, вы увидите, что это изменение не сохраняется, доказывая, что оно действительно передается по значению.
Пример:
function changeObject(x) {
x = {member:"bar"};
alert("in changeObject: " + x.member);
}
function changeMember(x) {
x.member = "bar";
alert("in changeMember: " + x.member);
}
var x = {member:"foo"};
alert("before changeObject: " + x.member);
changeObject(x);
alert("after changeObject: " + x.member); /* change did not persist */
alert("before changeMember: " + x.member);
changeMember(x);
alert("after changeMember: " + x.member); /* change persists */
Выход:
before changeObject: foo
in changeObject: bar
after changeObject: foo
before changeMember: foo
in changeMember: bar
after changeMember: bar
var str = "some text{index:1}{id:2}{value:3}";
var index = str.match(/{index:(\d+)}/);
index = index && index[1]*1;
JavaScript не поддерживает утверждения look-behind. Используйте этот шаблон вместо:
/{index:(\d+)}/g
Затем извлеките значение, зафиксированное в группе.
\d+
; целое число фиксируется в группе # 1.
– Alan Moore
17 November 2010 в 01:37
"some text{index:1}{id:2}{value:3}".match(/{index:(\d+)}/g)[0]
возвращает {index:1}
И "some text{index:1}{id:2}{value:3}".match(/{index:(\d+)}/g)[1]
возвращает «undefined».
– Maksim Vi.
17 November 2010 в 01:56
(?<= )
- это положительный lookbehind. JavaScript-код RegEx не поддерживает lookbehind (но он поддерживает lookaheads).
/g
действительно помогает =) – Maksim Vi. 17 November 2010 в 03:41