JS String 的长度为 n,但只有 n-1 个字符。使用 str = str.slice(0,-1)

JS String has length n, but only n-1 characters. Using str = str.slice(0,-1)

我正在使用可汗学院的网页来制作一个 javascript 项目(您可以看到 here)。我提出这个问题是因为我不知道这个问题是由于 javascript 的微妙之处,还是由于可汗学院的系统。

问题描述如下:

var keyPressed = function() {
    if (keyCode === BACKSPACE) {
        debug(textBuffer.length);
        debug(textBuffer);
        textBuffer = textBuffer.slice(0,-1);
    }
};

基本上,每当我按下退格键时,这段代码将是 运行。当我 第一次 调用代码时,它工作正常;最后一个字符从我的全局变量 textBuffer 中删除。但是,此代码的任何后续调用都不会对我的 textBuffer 字符串执行任何操作,除非 textBuffer 在两次调用之间发生了更改。通过使用 debug 语句,我注意到字符串长度似乎太大了。

我希望我已经提供了足够的详细信息,以便有人能够找出问题所在。有人知道这是怎么回事吗?

编辑:这是问题的根源:尽管 keyPressed 正确注册了退格键,但还有另一个名为 keyTyped 的函数将一个不可见的 '\b' 字符添加到细绳。这就是字符串 出现的方式 只有 2 个字符但长度为 3.

当您按下退格键时,keyTypedkeyPressed 函数都会被执行。 keyPressed 先执行,删除一个字符,然后执行 keyTyped,并向字符串添加一个字符,即 backspace character.

在JavaScript中,这个退格字符实际上有一个字符串的转义字符:'\b'.

要解决您的问题,请处理 keyTyped 函数中的退格键,不要让它将 toString 值附加到 textBuffer.

var keyTyped = function() {
    if (key.toString() === '\n') {
        parse();
        textBuffer = "";
    }
    if (key.toString() === '\b') {
        textBuffer = textBuffer.slice(0, -1);
    } else {
        textBuffer = textBuffer + key.toString();
    }
};