在对象中使用数学运算

问题描述:

这是JS中的单位转换器。当有人转换音量时,输入音量首先转换为升,然后转换为其他任何单位。计算值自动显示在输入栏中。为此目的,我创建了一个对象来存储转换值,就像这样:在对象中使用数学运算

var volumes={ 
    cbm: 1000, 
    ltr: 1, 
    ml: 0.001, 
    barrel: 158.9873, 
    gal: 3.785411784, 
    pint: 0.473176473, 
    floz: 0.0295735295625, 
    //and so on 
}; 

而对于一个系统的单位之间的转换,我想这一点:

var volumes={ 
    impfloz: 0.0284130642624675, 
    imppint: this.impfloz*20, 
    impbarrel: this.impfloz*5600, 
    impgal: this.impfloz*160 
}; 

但它没有工作。当我输入一个值时,例如在输入字段“Imperial-Barrel”中,所有其他输入字段显示:NaN。我真的必须为每个函数编写函数吗?这会使代码更复杂,更难以阅读。有没有办法让对象成员自动应用所需的数学运算?

+0

请参阅[对象字面声明中的自引用](http://stackoverflow.com/a/4616273/218196) – 2014-09-05 17:42:56

不,你不能这样做。但是如果你担心污染与impfloz变量全局命名空间中有什么错

var impfloz = 0.0284; 
var volumes={ 
    impfloz: impfloz, 
    imppint: impfloz*20, 
    impbarrel: impfloz*5600, 
    impgal: impfloz*160 
}; 

,你可以包住整个事情在IIFE。

this仅在一个函数中有意义,它指的是函数被调用的对象。

+0

感谢您的信息。它的作品,但我认为它不是很优雅...但你能解释我为什么,当我在桶字段中输入1000亿,加仑字段显示34999999999999.99.99而不是35000000000000?我的意思是这就是我试图这样做的原因。 JS会自动切断一些小数,如果是的话,有什么办法来防止这种情况? – quaductas 2014-09-05 18:00:24

+0

@quaductas JS数字是“双精度浮点数”,它们的上限约为2^53,如果你需要更高的值,你必须使用一个库。 – 2014-09-05 19:56:37