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
相关产品推荐
相关产品推荐

