// 以下代码在最新的 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())));
JS 不能直接操作地址,所以讨论地址是否相同似乎没啥意义。
这并不能说明什么问题,只能说在 JS 引擎里,a 和 b 的值相同。
如果 a 和 b 是对象引用,用
a === b
来比较是可以判断它们是否指向同一个对象的,说起来这是地址相同,但实际上,a 和 b 这两个变量中只是保存了相同的引用,他们的本身的地址其实是不同的……在 JS 里要用“地址”来解释问题很难,毕竟它没提供操作地址的相关 API。基本上还是对于基础数据类型用值相等,对象类型用引用相同来解释比较好(注:数组、函数等都可以看作是对象类型)。
补充一个可以直接在 chrome 和 node 中跑的代码