我想知道为什么以下有效:
oldversion = "1.3.52";
newversion = "1.3.54";
if (newversion > oldversion) {
console.log('test');
}
但这不是:
if (1.3.54 > 1.3.52) {
console.log('test');
}
我知道最后一个例子不起作用,因为它们不是实际数字。但我试图找出JavaScript在遇到带有数字的字符串时正在做什么。
这是我在W3Schools' JavaScript Comparison and Logical Operators page上找到的:
将字符串与数字进行比较时,JavaScript会转换 在进行比较时将字符串转换为数字。
那么为什么它将字符串转换为数字然后突然间我不再获得Uncaught SyntaxError: Unexpected number
了?
答案 0 :(得分:3)
您可以使用迭代细分的函数。
function checkVersion(a, b) {
var aa = a.split('.').map(Number),
bb = b.split('.').map(Number),
i,
r = 0,
l = Math.max(aa.length, bb.length);
for (i = 0; !r && i < l; i++) {
r = (aa[i] || 0) - (bb[i] || 0);
}
return r;
}
var oldversion = "1.3.52",
newversion = "1.3.54";
if (checkVersion(newversion, oldversion) > 0) {
console.log('test');
}
答案 1 :(得分:1)
正如评论中所提到的,它实际上正在进行字符串比较,而不是试图将任何东西变成数字。
您可以尝试:
来验证这一点var a = "a";
var b = "b";
console.log(a>b) // gives false
var a = "a";
var b = "b";
console.log(b>a) // gives true
答案 2 :(得分:1)
正如您所说,当您比较数字和字符串时,字符串会转换为数字。但是,如果字符串包含无效数字,则结果将为NaN。这很有趣,因为:
NaN > 15 === false
NaN < 15 === false
所以:
"1.3.52" > 1.4 === false
"1.3.52" < 1.4 === false
显然(正如你在帖子中所说),将1.3.52与1.3.54进行比较会引发异常,因为它们不是有效数字。
为什么&#34; 1.3.52&#34;被解释为大于&#39; 1.12.10&#39;?
使用Unicode代码点顺序比较字符串。例如,&#34; Banana&#34;来到&#34; cherry&#34;之前。 &#34; 9&#34;大于&#34; 80&#34;,但是因为&#34; 80&#34;来之前&#34; 9&#34;按Unicode顺序。因此,&#34; 1.3.52&#34;被解释为大于&lt; 1.12.10&#39;。
在字符串之间查找顺序而不是被欺骗的简单方法是使用sort。例如,["1.3.52", "1.12.10", "1.11.0.0.0"].sort()
答案 3 :(得分:0)
@Nina的解决方案应该是公认的答案,因为我认为它会更容易理解。但无论如何..
export class MyCustomElement {
@bindable title = 'Hello, World!';
constructor () {
}
}