通过引用传递给函数的数字对象

时间:2016-07-08 19:33:30

标签: javascript object

我正在阅读somewhere,当我们将一个对象传递给一个函数时......“当它作为参数传递时,JavaScript总是通过引用使用它......”我认为这意味着(如果我正确的话)我错了)如果函数是以某种方式修改对象,它将改变原始定义的对象。我尝试用一​​些代码来说明这一点,它确实做了我认为它做的事情但是当我在博客文章中使用Number 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

我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

数字对象仍然是对象。所以它们的值是一个引用,如果函数改变作为参数传递的对象的属性,那么该对象将在函数外部受到影响。



fnc+1




但是,数字对象中包含的值不会存储为属性。它存储为[[NumberData]]内部插槽。 ECMAScript无法改变该插槽,因此您无法更改该数字。

您尝试1解包数字对象以获取其[[NumberData]],并将fnc添加到该数据对象中。但是结果被丢弃了,它没有存回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"的[[NumberData]]广告位。

如果您希望能够实现类似于更改[[NumberData]]的内容,您可以



$test = array('test1', 'test2', 'test3', 'test4', 'test5');

foreach ($test as $value){  
    $secondValue = '';
    if ($value == "test2"){
        $secondValue = "value";
}   

echo $value . $secondValue . "<br />";
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

在Javascript中,对象引用由[]或对象{}表示的数组。您可以使用typeof验证变量的类型。这些都是通过引用传递的。

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

如果将对象文字传递给函数并修改属性“a”的值,则会导致修改该值。

答案 2 :(得分: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对象方法的地方,除非它是Date()对象或模拟类,或者您可能遇到类型和值检查===的问题。

无法确定这是否没有错误,但希望这有助于更好地解释。