Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
移植duff';从C到JavaScript的s设备_Javascript_Loop Unrolling_Duffs Device - Fatal编程技术网

移植duff';从C到JavaScript的s设备

移植duff';从C到JavaScript的s设备,javascript,loop-unrolling,duffs-device,Javascript,Loop Unrolling,Duffs Device,我有一个C语言的达夫设备,它运行良好(将文本格式设置为货币): 但我在尝试用Javascript实现同样的功能时遇到了问题: function money(src, dst) { var len = src.length; var i = 0; switch (len % 3) { do { dst += ','; case 0: dst += src[i++]; case 2: d

我有一个C语言的达夫设备,它运行良好(将文本格式设置为货币):

但我在尝试用Javascript实现同样的功能时遇到了问题:

function money(src, dst) {
    var len = src.length;
    var i = 0;

    switch (len % 3) {
        do {
            dst += ',';
            case 0: dst += src[i++];
            case 2: dst += src[i++];
            case 1: dst += src[i++];
        } while (src[i]);
    }
    return dst;
}

var str = "1234567890123";
var res = "";

console.log(money(str, res));
nodejs返回此错误:

        do {
        ^^
SyntaxError: Unexpected token do
我的问题是:javascript是否支持计算GOTO语句

医生:我不想要别的选择,我只想知道为什么它不起作用


相关问题:

JavaScript
switch
语句不是这样工作的

switch (expr) {
  case expr:
    statements;
    break;
  case expr:
    statements;
    break;
  default:
    statements;
    break;
}
但是JavaScript确实提供了控制循环的功能

来自MDN的示例

var itemsPassed=0;
varⅠ,j;
顶部:
对于(i=0;i
MDN的另一个例子

var allPass=true;
varⅠ,j;
顶部:
对于(i=0;items.length;i++)
对于(j=0;j
我的问题是:javascript是否支持计算GOTO语句

不是真的

医生:我不想要别的选择,我只想知道为什么它不起作用

它不起作用,因为在JavaScript中

尽管您可能没有寻找解决方法,但其他人可能会在搜索时发现此问题,因此我将提供一个解决方法。
这要归功于在会议上提出这个建议的人

基本思想是在顶层有一个
while(true)
循环,内部有一个
switch
语句

goto:
while(true)
{
    switch(where)
    {
        // no breaks
        case 0:
            // some code...
        case 1:
            // some other code...
        // ...
    }
}
为了模拟goto,可以使用

where = 1;
continue goto;
不过,为了模拟达夫的设备,只需将循环作为外部结构,并在switch语句中使用一个变量,该变量在第一次迭代后设置为一个值,该值将触发switch语句在其第一个情况下启动

因此,在您的情况下,这意味着交换
开关
do…while()
并添加一个
默认
案例和一个控制变量:

var where = len % 3;
do {
    switch (where) {
        default: dst += ',';
        case 0:  dst += src[i++];
        case 2:  dst += src[i++];
        case 1:  dst += src[i++];
    }
    where = -1;
} while (src[i]);
通常,这种方法的一个巨大缺点当然是它不能跨回调工作,而回调在JavaScript中几乎无处不在。
但是,只要它在一个单一的、连续的上下文中使用,它就应该可以工作


有关更多信息,请参见。

对不起,我不明白:
它不能跨回调工作
,这意味着什么?@AlterMann基本上不能跨函数工作。在JavaScript中,传递函数对象作为对未来的值或事件做出反应的一种方式是很常见的,例如等待100ms:
window.setTimeout(function(){/**/},100)。如果这样一个函数是在循环内声明的,它可能会给人在循环内运行的印象(因此可以使用
中断
继续
,等等),但如果异步执行,则情况并非如此。只要在谷歌上搜索“javascript返回不起作用”,你就会发现大量的新手问题正是关于这个问题的,只是返回值而已。
var allPass = true;
var i, j;

top:
for (i = 0; items.length; i++)
  for (j = 0; j < tests.length; i++)
    if (!tests[j].pass(items[i])){
      allPass = false;
      break top;
    }
goto:
while(true)
{
    switch(where)
    {
        // no breaks
        case 0:
            // some code...
        case 1:
            // some other code...
        // ...
    }
}
where = 1;
continue goto;
var where = len % 3;
do {
    switch (where) {
        default: dst += ',';
        case 0:  dst += src[i++];
        case 2:  dst += src[i++];
        case 1:  dst += src[i++];
    }
    where = -1;
} while (src[i]);