You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS对象方法执行减法返回NaN,typeof显示为数字,求排查解决

问题分析与解决方案

嘿,我立刻就发现你代码里的问题啦!核心问题出在对象字面量初始化时的this指向错误。

你在定义Sam对象的时候,尝试用this.currentYear来计算birthYear,但这时候的this根本不是指向Sam对象本身!在对象字面量的创建过程中,this的指向是当前的执行上下文(浏览器环境下就是全局的window对象),而window里并没有currentYear这个属性,所以birthYear会被赋值为undefined。

哪怕你用typeof检测age和currentYear都是数字,但当你用undefined和数字做减法运算时,结果必然是NaN——这就是你遇到的问题根源!

修复方案

这里给你两种可行的修复方式:

方式一:先创建对象,再补全属性

等对象完全创建好之后,再用对象本身来计算birthYear,这时候就能正确引用到对象的属性了:

var today = new Date();
var year = today.getFullYear();
var Sam = {
  age: 27,
  birthMonth: "March",
  currentYear: year,
  // 如果你需要方法来计算的话:
  getBirthYear: function() {
    return this.currentYear - this.age;
  }
};
// 直接赋值birthYear的话:
Sam.birthYear = Sam.currentYear - Sam.age;

方式二:直接使用外层作用域的变量

因为year已经是你在对象外层定义好的变量,完全可以直接用它来计算birthYear,不用依赖this:

var today = new Date();
var year = today.getFullYear();
var Sam = {
  age: 27,
  birthMonth: "March",
  currentYear: year,
  birthYear: year - 27,
  // 方法里的this是没问题的,因为调用方法时this会指向Sam
  calculateBirthYear: function() {
    return this.currentYear - this.age;
  }
};

额外提醒

要记住:只有当你调用对象的方法时,方法内部的this才会指向该对象本身。在对象字面量初始化阶段,this的指向和对象无关,千万别在这个时候用this去引用对象还没创建好的属性哦!

内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:10:10