为何JavaScript构造函数显式返回原始值不生效?
为什么JavaScript构造函数返回原始值时,实际返回的是隐式创建的对象?
你遇到的问题本质是JavaScript中new操作符的运行规则导致的,先看你的代码示例:
function Run() { this.isRunning = () => { return this; } return 100; } const obj = new Run(); console.log(obj === 100); // 实际输出false,而非预期的true
当用new关键字调用构造函数时,JS引擎会按固定逻辑执行:
- 隐式创建一个空对象,并将这个对象绑定到构造函数内部的
this - 执行构造函数内部的代码(比如你这里给
this添加了isRunning方法) - 检查构造函数的返回值类型:
- 如果返回的是对象类型(包括普通对象、数组、函数、正则等),就直接返回这个对象
- 如果返回的是原始类型(number、string、boolean、null、undefined、symbol、bigint),则会忽略这个返回值,转而返回第一步中隐式创建的那个对象
你的代码里,Run构造函数返回的100属于number原始类型,所以这个返回值被直接忽略了,obj拿到的是new操作符创建的绑定了this的对象,自然obj === 100会返回false。
如果确实想让函数返回原始值100,不要用new调用,直接执行const result = Run()即可,这时result就是100,但这种情况下构造函数内部的this不会指向新对象(非严格模式下指向全局对象,严格模式下为undefined)。
内容的提问来源于stack exchange,提问作者DecPK
相关产品推荐
相关产品推荐

