Ex 1:
this.total = ko.computed<number>(() =>{
return this.baseSave() * 1 + (this.ability.modifier() * 1) + this.magic() *1 + this.miscellaneous()* 1 + this.temporary()*1;
});
前2:
this.total = ko.computed<number>(() =>{
return this.baseSave() + this.ability.modifier() + this.magic() + this.miscellaneous() + this.temporary();
});
我正在使用打字稿和打字稿
鉴于(0,10,0,0,10)
Ex 1工作返回20,ex 2工作失败0100010作为字符串
所讨论的属性都被声明并初始化为
export class someClass{
baseSave: KnockoutObservable<number>;
constructor(){
baseSave = ko.observable<number>(0);
}
}
,但是能力除外,它是在包含计算值的类的构造函数中传递的类。 关于为什么会发生这种情况的任何想法/建议?
答案 0 :(得分:2)
当您绑定到UI时,您将根据用户键入的内容返回字符串。乘以1会使它成为一个数字(这是您认为的应该)。
答案 1 :(得分:0)
JavaScript是松散类型的,而'+'运算符是重载的。这意味着它可以用于添加数字并连接字符串。通过查看参数的类型,可以解决该问题。
值得一般阅读:http://en.wikipedia.org/wiki/Operator_overloading
在Ex 2中,KO observable正在返回字符串,所以+正在努力连接字符串。
在例1中,(* 1)将字符串转换为int,然后+正在添加它们。
然而,使用parseInt更加“正确”,所以理想情况下你的代码将是:
this.total = ko.computed<number>(() =>{
return parseInt(this.baseSave()) +
parseInt(this.ability.modifier()) +
parseInt(this.magic()) +
parseInt(this.miscellaneous()) +
parseInt(this.temporary());
});
习惯parseInt非常方便,因为如果你需要处理包含二进制文件的字符串等,你可以使用它。请阅读:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
例如
parseInt("10")
返回一个10的int,因为它假设我们默认是在十进制系统中,但是如果你提供2的基数:
parseInt("10", 2)
然后10被解释为二进制,并返回一个2的int。