js中拥有相同值的两个基本数据类型的变量,它们的内存地址相同吗?

举例:

let a = 12
let b = 12

问:a 和 b 的内存地址相同吗?

回复
阅读 1.1k
1 个回答

JS 不能直接操作地址,所以讨论地址是否相同似乎没啥意义。

let a = 12;
let b = 12;
a === b;  // true

这并不能说明什么问题,只能说在 JS 引擎里,a 和 b 的值相同。

如果 a 和 b 是对象引用,用 a === b 来比较是可以判断它们是否指向同一个对象的,说起来这是地址相同,但实际上,a 和 b 这两个变量中只是保存了相同的引用,他们的本身的地址其实是不同的……

在 JS 里要用“地址”来解释问题很难,毕竟它没提供操作地址的相关 API。基本上还是对于基础数据类型用值相等,对象类型用引用相同来解释比较好(注:数组、函数等都可以看作是对象类型)。

// 以下代码在最新的 Chrome 核心和 Node 中测过,一样

let a = new Number(12);
let b = new Number(12);
a === b;   // false
a === 12;  // false
typeof a;  // object
Object.prototype.toString.call(a);  // "[object Number]"

let c = 12;
typeof c;  // number
Object.prototype.toString.call(c);  // "[object Number]"
c.constructor === Number;  // true
c.constructor === a.constructor;  // true

let d = Number(12);
d === c;   // true

补充一个可以直接在 chrome 和 node 中跑的代码

let a = new Number(12);
let b = new Number(12);
let c = 12;

const cases = [
    () => a === b,
    () => a === 12,
    () => typeof a,
    () => Object.prototype.toString.call(a),
    () => typeof c,
    () => Object.prototype.toString.call(c),
    () => c.constructor === Number,
    () => c.constructor === a.constructor,
];

cases.forEach(fn => console.log(fn.toString().slice(6).padEnd(36, " "),  JSON.stringify(fn())));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏