JavaScript中,如何将数字类型传递地址给函数,而不是复制过去?

新手上路,请多包涵

在JS中,对象是以内存地址传参的,但是numberstring类型是直接复制传递,如代码:

let a = {name:"Jhon",age: 18};
function birthday (person) {
    person.age ++;
    console.log(person.age);
}
birthday(a);
console.log(a.age);

打印结果如下:

19
19

但是如果我传递的是number类型的数据,结果却超出预期:

let a = 10;
function add(num) {
    num++;
    console.log(num);
}
add(a);
console.log(a);

打印结果如下:

11
10

请问:我需要如何做,才能让第二个代码片段均输出11?

阅读 2k
3 个回答
let a = 10;
function add(num) {
    return ++num;
}
a = add(a);
console.log(a);
let a = 10;
function add(num) {
  num++;
  console.log(num);
  return num
}
a = add(a);
console.log(a);

很不幸,没有办法。那么只有依赖下面两个可选方案。

  1. 传对象
  2. 传出来重新赋值。

  1. 试了覆盖 valueOf,
  2. 试了 Proxy 都不能满足

无法获取到 set、也无法获取到 ++

var a = {_number: 10, valueOf:()=>a._number, toString:()=>a._number};

// function add(num) {
//     num++;
//     console.log(num);
// }
// add(a);
// console.log(a == 10, a);

var monster1 = { eyeCount: 4 };

var handler1 = {
  get(target, prop, receiver) {
      console.log('get',target, prop, receiver)
      // console.log(target[prop])
      // return 1
      return function(){
          console.log('arguments', arguments)
          return monster1.eyeCount
      }
  },
  set(obj, prop, value) {
      console.log('set',obj, prop, value)
  }
};

var proxy1 = new Proxy(monster1, handler1);
// console.log(proxy1);
// console.log(proxy1.eyeCount++, proxy1.eyeCount);
proxy1+=2
// proxy1++
// expected output: 2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题