Поврежденные атрибуты JSON - PullRequest
1 голос
/ 12 марта 2012

У меня проблемы с пониманием поведения Javascript.

Код:

function getPosition(element){
    var position = {
        x:$(".line div").has(element).index(),
        y:$(".line").has(element).index()
    };
    console.log(position.y);
    console.log(position)
    return position;
}

Теперь, когда я вызываю его из функции, я получаю следующие результаты:

0

Object
x: 8
y: 3

Что я не понимаю, так это как можно изменить атрибуты объекта при попытке доступа к нему через ссылку на объект, но не напрямую.

Но когда я вызываю ту же функцию из консоли, я получаю следующее:

0

Object
x: 8
y: 0

Это тот же элемент, который передан функции.И кажется, что он всегда терпит неудачу, когда X или Y равен 0 (нулю), когда это другое число, это нормально.

Может кто-нибудь объяснить, что я делаю неправильно?Или это какая-то ошибка JS?О_о

РЕДАКТИРОВАТЬ:

Итак, я наконец-то выяснил, в чем проблема.Я всегда думал, что я передаю ценности, но, к сожалению, я все время ошибался.Во время некоторых поисков в stackoverflow я нашел topic о значениях JS и ссылках.

Если кому-то интересно и лень читать эту тему, вы можете посмотреть этот пример.Это в значительной степени говорит само за себя.

function test(){
    var a = 5;
    var b = a; //b now has value of 5
    console.log("a:"+a+":b:"+b);
    b = 4;//a still has value of 5 and b is assinged to 4
    console.log("a:"+a+":b:"+b);
    var c = {val:1};
    var d = c; //d now has reference to c
    d.val = 2; //c.val changes because it is a reference
    console.log(c);
}

РЕДАКТИРОВАТЬ2: о, кстати, как я могу пометить мой вопрос как ответ?

Ответы [ 2 ]

3 голосов
/ 12 марта 2012

console.log задерживает преобразование значений в строку до тех пор, пока приложение не замедлится, чтобы регистрация не замедляла приложение без необходимости.

Если console.log(position) показывает значение, отличное от того, которое было вызвано во время вызова console.log, потому что position был изменен между вызовом и временем, когда консольный виджет решил отформатировать значение для отображения .

Вы можете увидеть это, попробовав следующий HTML:

<script>
// Emits the JSON form when converted to a string.
var obj = {
  x: 1,
  toString: function () {
    return JSON.stringify(this);
  }
};

console.log(obj);  // Often {x:2}
console.log("" + obj);  // Reliably {x:1}  

obj.x = 2;
</script>

Ищите код, который делает что-то вроде

obj = getPosition(...);
...
obj.y = <expression that evaluates to zero>

В качестве альтернативы, вы можете принудительно форматировать, изменив

 console.log(position)

до

 console.log("" + position)
0 голосов
/ 06 сентября 2012

Итак, я наконец выяснил, в чем проблема.Я всегда думал, что я передаю ценности, но, к сожалению, я все время ошибался.Во время некоторых поисков в stackoverflow я нашел тему о значениях JS и ссылках.

Если кому-то интересно и лень читать эту тему, вы можете посмотреть этот пример.Это говорит само за себя.

function test(){
    var a = 5;
    var b = a; //b now has value of 5
    console.log("a:"+a+":b:"+b);
    b = 4;//a still has value of 5 and b is assinged to 4
    console.log("a:"+a+":b:"+b);
    var c = {val:1};
    var d = c; //d now has reference to c
    d.val = 2; //c.val changes because it is a reference
    console.log(c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...