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

Javascript JS字符串的长度为n,但只有n-1个字符。使用str=str.slice(0,-1),javascript,string,slice,Javascript,String,Slice,我使用Khan Academy的网页来制作一个javascript项目(您可以看到)。我之所以提出这个问题,是因为我不知道这个问题是由于javascript的微妙之处造成的,还是因为Khan Academy的系统造成的 以下是问题的说明: var keyPressed = function() { if (keyCode === BACKSPACE) { debug(textBuffer.length); debug(textBuffer);

我使用Khan Academy的网页来制作一个javascript项目(您可以看到)。我之所以提出这个问题,是因为我不知道这个问题是由于javascript的微妙之处造成的,还是因为Khan Academy的系统造成的

以下是问题的说明:

var keyPressed = function() {
    if (keyCode === BACKSPACE) {
        debug(textBuffer.length);
        debug(textBuffer);
        textBuffer = textBuffer.slice(0,-1);
    }
};
基本上,只要我按下backspace键,就会运行这段代码。当我第一次调用代码时,它工作得很好;最后一个字符将从全局变量
textBuffer
中删除。但是,对该代码的任何后续调用都不会对我的
textBuffer
字符串产生任何影响,除非在调用之间更改了
textBuffer
。通过使用
debug
语句,我注意到字符串长度似乎太大了

我希望我已经提供了足够的细节,以便有人发现问题。有人知道发生了什么事吗


编辑:问题的根源在于:尽管按下
键可以正确地注册退格,但还有另一个名为
keyTyped
的函数将不可见的
'\b'
字符添加到字符串中。这就是为什么字符串看起来只有2个字符,但长度为3。

当您按下backspace键时,会同时执行
keyTyped
keyPressed
功能<首先执行code>keyPressed
,删除一个字符,然后执行
keyTyped
,并将一个字符添加到字符串中

在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();
    }
};

.trim()
或检查是否有任何不可见字符。我从未听说过不可见字符,粗略的谷歌搜索也没有发现任何东西。你能详细解释一下吗?哎呀,这里的代码不足以推断出这个问题;但是看看你链接的原始代码,我相信在退格时,首先你的
按键激活,删除最后一个字符,然后你的
按键激活,添加一个
U+0008
字符(顺便说一句,通常是不可见的)。如果键入了backspace,您应该防止这种效果。这个问题显然是代码中其他地方的某种bug,我找不到。我想知道我是否应该简单地删除这篇文章?@Mahkoe而不是删除这篇文章,你可以编辑它以显示你认为包含错误的部分。你是对的,字符串中添加了“\b”字符。我自己也不会发现。这使我找到了解决这个问题的办法