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

标签 javascript string slice

我正在使用可汗学院的网页来制作一个 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();
    }
};

关于javascript - JS String 的长度为 n,但只有 n-1 个字符。使用 str = str.slice(0,-1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966675/

相关文章:

c++ - istringstream、ostringstream 和 stringstream 有什么区别?/为什么不在每种情况下都使用 stringstream?

Python设置字符串的差异

将 []byte 转为 Little/Big-Endian 有符号整数或 float ?

javascript - 将垂直制表符转换为 Accordion

javascript - 制作更智能的 jQuery 代码

string - bash,从带有空格分隔符的文本文件中提取字符串

python - 为什么这个函数返回全零

go - 在 Go 中追加的返回值

javascript - 反向滚动

javascript - 在编译之前如何在多个文件之间共享全局 javascript 变量?