2016-07-08 3 views
0

Я читал somewhere, что, когда мы передаем объект в функцию «... JavaScript всегда использует объект по ссылке, когда он проходит как аргумент ...» Я думаю, что это подразумевает (исправьте меня, если я ошибаюсь) заключается в том, что если функция должна каким-то образом изменить объект, это изменит исходный определенный объект. Я попытался проиллюстрировать это с помощью некоторого кода, и он делает то, что я думаю, но когда я пытаюсь привести пример в сообщение в блоге с номером obj, он не изменяет исходное значение этого объекта. Пожалуйста, смотрите мой jsbin: https://jsbin.com/wociro/edit?js,console,outputЧисло объектов, переданных в функции по ссылке

console.clear(); 
 
/**myobject Object**/ 
 
function myobject() { 
 
    this.value = 5; 
 
} 
 
var o = new myobject(); 
 
console.log("Original value of o: " + o.value); // o.value = 5 
 

 
function objectchanger(fnc) { 
 
    fnc.value = 6; 
 
} 
 

 
objectchanger(o); 
 
console.log("New value of o: " + o.value); // o.value is now equal to 6 
 

 
/*Number Object*/ 
 

 
var num2 = new Number(2); 
 
console.log("Original value of num2: " + num2); 
 

 
function numberChanger(fnc) { 
 
    return fnc + 1; 
 
} 
 
console.log("num2 after running numberChanger: " + numberChanger(num2)); 
 

 
console.log("New value of num2: " + num2); //looks the same

я упускаю что-то?

+1

Номер есть, whatchamacallit ... [примитив.] (Https://developer.mozilla.org/en-US/docs/Glossary/Primitive) – nullpotent

+0

В будущем, пожалуйста, включите весь код в сам вопрос, а не на другом сайте. –

ответ

0

В Javascript объекты ссылаются на массив, обозначенный [] или объектом {}. Вы можете проверить тип переменной с помощью typeof. Они передаются по ссылке.

typeof [2, 5, 3] //object 
typeof { a: 10} // object 

Если передать литерал объекта в функцию и изменить значение свойства «а», то в результате значение модифицируется.

+0

Хмм, но когда я запускаю typeof a. Я получаю «объект» назад – leyu

+0

Извиняюсь, не запускал мой пример через консоль. Мой ответ был неправильным. –

2

Число объектов по-прежнему объектов. Поэтому их значение является ссылкой, и если функция изменяет свойство объекта, переданного в качестве аргумента, этот объект будет затронут вне функции.

function changer(obj) { 
 
    obj.foo = 'bar'; 
 
} 
 
var num = new Number(123); 
 
console.log(num.foo); // undefined 
 
changer(num); 
 
console.log(num.foo); // 'bar'

Однако значение обернуты внутри объекта номер не сохраняется в качестве свойства. Он хранится во внутреннем слоте [[NumberData]]. ECMAScript не дает возможности изменить этот слот, поэтому вы не можете изменить номер.

Ваша попытка fnc+1 разворачивает объект числа, чтобы получить его [[NumberData]], и добавляет 1 к этому. Но результат просто отбрасывается, он не сохраняется в слоте [[NumberData]] fnc.

Если вы хотите, чтобы быть в состоянии достичь чего-то аналогичное изменению [[NumberData]], вы можете

function MyNumber(num) { 
 
    this.__number__ = +num; 
 
} 
 
MyNumber.prototype = Object.create(Number.prototype); 
 
Object.getOwnPropertyNames(Number.prototype).forEach(function(prop) { 
 
    var desc = Object.getOwnPropertyDescriptor(Number.prototype, prop); 
 
    if(desc && desc.value && typeof desc.value == 'function') { 
 
    var native = desc.value; 
 
    desc.value = function() { 
 
     return native.apply(this.__number__, arguments); 
 
    }; 
 
    Object.defineProperty(MyNumber.prototype, prop, desc); 
 
    } 
 
}); 
 
var num = new MyNumber(123); 
 
console.log(+num, num+'', num.toFixed(2)); // 123, "123", "123.00" 
 
num.__number__ = 456; 
 
console.log(+num, num+'', num.toFixed(2)); // 456, "456", "456.00"

+0

Спасибо за ваш ответ. Не знал внутренних деталей. –

+0

Все это и вы не принесли «неизменность» к столу. Я так впечатлен. – nullpotent

+0

Хм, который имеет большой смысл. спасибо – leyu

0

Я на самом деле было много вопросов, когда я начал выход в объектная сторона JavaScript. Лучший пример, который я могу объяснить, - это эти примеры.

Объекты ссылки.

var obj = {a: 5}; 
var b = obj.a; 
b = 2; 
// obj.a: 2 
// b: 2 

Это будет ссылаться на значение объекта, я считаю. Поэтому, если вы измените b, он также изменит obj.a.

HTML объект DOM связь с нечетным поведением

var x = document.getElementById("some_div_id"); 
x.innerHTML = "example"; // this works 

var x = document.getElementById("some_div_id").innerHTML; 
x = "example"; // this doesn't, it thinks that it's document.getElementById("some_div_id"); 

Принял меня время, чтобы понять, что случилось, когда я первый сделал второй метод DOM.

Переменные не связаны, а копируются.

var a = 5; 
var b = a; 
b = 2; 
// a: 5 
// b: 2 

Как вы можете видеть, это не связывает значение, но и создает новую, основанную от него.

Глубокое копирование с объектов трюк.

function deepCopy(objValue) { 
    return JSON.parse(JSON.stringify(objValue)); 
} 
var obj = {a: 5}; 
var b = deepCopy(obj.a); 
b = 2; 
// obj.a: 5 
// b: 2 

Это был трюк дал мне некоторое время назад, когда я вопросы желающих значение объекта хранится в переменной и отредактирован, но без его связан со значением объекта. Через некоторое время я обнаружил, что мне никогда не понадобилось это после улучшения моих навыков кодирования.

Также последнее примечание. Я читал где-то в чистом кодировании JavaScript, что вам не нужно использовать метод объекта new, если он не является объектомили имитированным классом, или вы можете столкнуться с проблемами проверки типов и значений с помощью ===.

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

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