Javascript ReturnIfAbrupt在ES6草案中的含义是什么?

Javascript ReturnIfAbrupt在ES6草案中的含义是什么?,javascript,ecmascript-harmony,Javascript,Ecmascript Harmony,我目前正在为ES6草案实施一些垫片。我想知道是否有人能告诉我什么是ReturnIfAbrupt的意思。例如,我对Number.toInt(调用内部[[ToInteger]]]的实现如下: if (!('toInt' in Number)) Object.defineProperty(Number, 'toInt', { value: function toInt(value) { // ECMA-262 Ed. 6, 9-27-12. 9.1.4

我目前正在为ES6草案实施一些垫片。我想知道是否有人能告诉我什么是
ReturnIfAbrupt
的意思。例如,我对
Number.toInt
(调用内部
[[ToInteger]]]
的实现如下:

if (!('toInt' in Number))
    Object.defineProperty(Number, 'toInt', {

        value: function toInt(value) {
            // ECMA-262 Ed. 6, 9-27-12. 9.1.4

            // 1. Let number be the result of calling ToNumber on the input argument.
            var number = Number(value);

            // 2. ReturnIfAbrupt(number).
            // ?

            // 3. If number is NaN, return +0.
            if (number != number) return 0;

            // 4. If number is +0, -0, +Infinity, or -Infinity, return number.
            if (number == 0 || 1 / number == 0) return number;

            // 5. Return the result of computing sign(number) * floor(abs(number)).
            return (n < 0 ? -1 : 1) * Math.floor(Math.abs(number));

        },

        writable: true,
        configurable: true

    });
if(!('toInt'在数字中))
Object.defineProperty(编号“toInt”{
值:函数toInt(值){
//ECMA-262第6版,9-27-12.9.1.4
//1.让number作为对输入参数调用ToNumber的结果。
var编号=编号(值);
//2.返回IFabrupt(编号)。
// ?
//3.如果数字为NaN,则返回+0。
如果(number!=number)返回0;
//4.如果数字为+0、-0、+Infinity或-Infinity,则返回数字。
如果(数字==0 | | 1/数字==0)返回数字;
//5.返回计算符号(编号)*楼层(abs(编号))的结果。
返回(n<0?-1:1)*数学楼层(数学绝对值(数字));
},
可写:对,
可配置:true
});
第二步是
ReturnIfAbrupt(number)
。您会注意到我目前有
/?
用于该步骤,因为我不知道该做什么。当它说
ReturnIfAbrupt(…)
时意味着什么

我已经阅读了草稿中关于
ReturnIfAbrupt
的部分,但是我无法理解第2步要做什么,在上面的代码中用什么来代替
/?


从我的阅读来看,可能什么都不应该做,而
ReturnIfAbrupt
步骤仅仅意味着让ToNumber中发生的任何错误向上传播,退出函数。然而,这似乎过于冗长,我认为这是不言而喻的。而且,在我看来,
ToNumber
甚至不会抛出错误错误。有人能确认或帮助我理解真正的含义吗?

ReturnIfAbrupt指的是突然完成。完成记录包含类型及其关联的值。正常完成类似于表达式的结果值。函数的返回完成是通常预期的完成从正常完成的侧面。任何其他完成类型都是突然的。即抛出、中断、继续

if (isCompletionRecord(v)) {
  if (isAbruptCompletion(v)) {
    return v;
  } else {
    v = v.value;
  }
}
按原样实现它,需要的是将函数包装在一个try-catch中。抛出的值将是一个突然的完成。不过,这在JS级别上并不是你所看到的,而是在引擎级别实现控制流和非本地控制传输

我已经在JS虚拟机中实现了ES6规范的大部分内容,这也可能有助于了解它,以下是ToInteger:


这里有一个起点:是的,我已经读过了。这对我来说没有什么意义,但从我的理解来看,这听起来好像在这一步上我真的没有什么可做的,如果在第1步中
ToNumber
抛出了一个错误,那么它应该被传播,函数应该退出。然而,我并不真正理解why需要它自己的步骤,这是应该理解的。如果是这样,我希望得到确认。如果不是这样,我需要帮助理解。你的解释似乎是正确的。可能我遗漏了一些细节,但重要的是在我猜的类型转换错误的情况下抛出异常。谢谢!所以对我来说,它实际上意味着“什么都不做”。这对我来说似乎很奇怪。ToNumber甚至会导致突然完成吗?似乎不是。如果我错了,请纠正我,但从我对我使用的草稿(9-27-12)的阅读来看,我认为由于ToNumber(参数)的原因,这个
ToInteger
可能不是100%准确的|0行。这不总是会导致一个有限的数字吗?草案似乎表明
对Integer
也会导致无限的值。这意味着除非你收到抛出,否则什么都不做。从“没有尝试捕获”的角度来考虑。实现try..catch的一种方法是完全按照规范执行。返回“throws”与正常结果类似,但包装为“ThrownValue”键入并始终检查它。大多数情况下你不必做任何事情。但是如果这是特殊结果,那么你需要在不修改的情况下传递它。对于ToInteger的事情,你确实是对的。我大致了解了一些操作符,以预测第二次传递的细节。另外值得注意的是,ReturnIfAbrupt是一个非ob可维护的实现细节。规范描述了应该观察到的情况,但实际实现的工作方式可能完全不同。一个例子是使用延续传递样式并具有第二个“控件”用于传递特殊结果(如抛出)的通道。在这种情况下,您无需进行ReturnIfAbrupt检查,因为特殊值永远不会通过“正常”通道。
function ToInteger(argument){
  if (argument && typeof argument === OBJECT && argument.IsCompletion) {
    if (argument.IsAbruptCompletion) {
      return argument;
    }
    argument = argument.value;
  }
  return ToNumber(argument) | 0;
}