Extendscript 中的计算结果错误 Javascript

Calculation result wrong in Extendscript Javascript

我正在编写 InDesign 脚本并使用 moments.js 计算日期。

当我使用日期格式 "Do" 时,应该 return 例如“1st, 2nd, 3rd, 4th...”,但是函数的计算是 return =29=]s 一个错误的结果,结果是这样的:

第 1 名 第二名 第三名 第四名 5日 6日 7日 8号 9号 10号 11号 12号 13号 14日 15日 16日 17日 18日 19日 20日 21日 22日 23日 24日 25日 26日 27日 28日 29日 30号 第 31 名

这是函数:

function returnOrdinal(number) {
  var b = number % 10,
  output = (parseInt(number % 100 / 10) === 1) ? 'th' :
   (b === 1) ? 'st' :
   (b === 2) ? 'nd' :
   (b === 3) ? 'rd' : 'th';
  return number + output;
}

我创建了一个使用相同函数的 JSFiddle,它 return 得到了正确的结果。

这是 Extendscript 中的已知问题吗?你知道 return 序数的任何其他方法吗?任何解决方法?

提前致谢

您的代码也适用于 http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_basic,因此我怀疑回调环境会产生副作用。我建议尝试另一种可能对副作用不太敏感的写作方式。

function returnOrdinal(number) {
  switch((number % 100 / 10).toFixed(0) == 1?0:number%10) {
  case 1:  return number+'st';
  case 2:  return number+'nd';
  case 3:  return number+'rd';
  default: return number+'th';
  }
}

这条线路行得通吗?

String(number).replace(/1$/, "1st").replace (/2$/, "nd").replace(/3$/, "rd").replace(/[4-9]$/, "th");

据我所知,ExtendScript.As 似乎不支持链式三元运算符,它是 ECMA 3。在 InDesign 中工作的另一个选项 - 只需使用 if else 或 switch

function returnOrdinal(number) {
    var b = number % 10;
    var output;
    if (parseInt(number % 100 / 10) === 1) {
        output = 'th';
    } else {
        switch (number) {
            case 1:
                output = 'st';
                break;
            case 2:
                output = 'nd';
                break;
            case 3:
                output = 'rd';
                break;
            default:
                output = 'th';
        }
    }
    return number + output;
}

根据文档,您的结果是正确的,而您的代码是错误的(令人惊讶的是,这意味着您使用其他 JavaScript 引擎进行的测试也是错误的)。

ECMAScript 中常见的运算符关联性是从左到右的。然而,三元测试是right to left。这意味着您的

output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';

(稍微简化)首先 选择 (b === 1),可能的结果是 'rd''th' – 最后两个。

另请参阅 Mozilla's reference? .. : 的示例用法,其中明确提到了关联性:

Multiple ternary evaluations are also possible (note: the conditional operator is right associative):

var firstCheck = false,
    secondCheck = false,
    access = firstCheck ? "Access denied" : secondCheck ?
    "Access denied" : "Access granted";

console.log( access ); // logs "Access granted"

用括号覆盖优先级使其按预期工作:

function returnOrdinal(number) {
  var b = number % 10,
  output = (parseInt(number % 100 / 10) === 1) ? 'th' :
    ((b === 1) ? 'st' :
    ((b === 2) ? 'nd' :
    ((b === 3) ? 'rd' : 'th')));
  return number + output;
}

反驳 Rad Lexus 的回答表明 JSFiddle 和 InDesign 给出的正确答案存在问题。

我有以下测试页:

<html>

<head>
    <script>
        function test(num) {
            var b = num;   
            var output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';    
            document.getElementById("ordinals").innerHTML = b + output;    
        }
    </script>
</head>

<body onload="test(1);">
    <div id="ordinals">test
    </div>
</body>

</html>

Rad 的 post 建议根据文档将其计算为“1rd”、“2rd”、“4rd”。我将它保存为一个页面并加载到 Chrome、IE 和 Safati 中。这三个都给我第 1、第 2 和第 4 作为输出,以响应 1,2 和 4 作为输入。

你能post一些代码来支持你的答案吗?根据您的说法,vanilla JavaScript 引擎有问题或文档有错误。