【问题标题】:JS String has length n, but only n-1 characters. Using str = str.slice(0,-1)JS 字符串的长度为 n,但只有 n-1 个字符。使用 str = str.slice(0,-1)
【发布时间】:2017-04-19 09:34:10
【问题描述】:

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

这里是问题的描述:

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

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

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

编辑:这是问题的根源:虽然keyPressed 正确注册了退格,但还有另一个名为keyTyped 的函数将不可见的'\b' 字符添加到字符串中。这就是字符串看起来只有2个字符但长度为3的方式。

【问题讨论】:

  • .trim() 或检查是否有任何看不见的字符。
  • 我从未听说过隐形字符,粗略的谷歌搜索也没有发现任何东西。你能详细说明一下吗?
  • OP,这里的代码不足以推断问题;但是查看您链接的原始代码,我相信首先在退格键上您的keyPressed 激活,删除最后一个字符,然后您的keyTyped 激活,添加一个U+0008 字符(顺便说一句,通常是不可见的) .如果键入退格键,您应该防止这种影响。
  • 这个问题显然是我找不到的代码中其他地方的某种错误。我想知道我是否应该简单地删除这篇文章?
  • @Mahkoe 而不是删除帖子,您可以对其进行编辑以显示您认为包含错误的部分。

标签: javascript string slice


【解决方案1】:

当您按下退格键时,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();
    }
};

【讨论】:

  • 您是正确的,在字符串中添加了一个 '\b' 字符。我自己不会发现的。这使我找到了解决问题的方法
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2020-02-23
  • 2015-02-11
  • 2021-11-10
  • 2013-05-02
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
相关资源
最近更新 更多