非空字符串 .charAt(0) return 怎么可能是空字符串?

how can a non empty string .charAt(0) return an empty string?

我真的被这个弄糊涂了...太难以置信了我 post 截屏了 Chrome 调试器:

我在测试中快速编写了这个函数来比较 2 个 base64 编码的字符串(a 可能比 b 短)。 但是它总是 return 0,就好像第一个字符不同一样。 事实上它们是:字符串 a 的第一个字符 ca 是正确的,但由于某些神秘原因,字符串 b 的第一个 cb 是空的!字符串 b 看起来正确,长度正确(685 个字符)并且类型正确 typeof(b) == 'string'

调用代码(实际上是 TypeScript)是这样的,以防有帮助:

requestGET('qBandConfig.sql', { jobid: this.job.jobid }) // get the blob from db 
    .then(json => {
      const base64:string = json[0]['bandconfig'] // type enforced to make sure
      this.editor.setBands(base64)
        .then(() => {
          // test that we find the same blob when re-encoding
          const check:string = this.editor.getBandsBLOB()
          const diff = firstDiff(check, base64) // always return 0 ????
          if (diff > -1 && check[diff] !== '=')
            this.log.warning('encoded blob ', check, ' is different from decoded ', base64)
        })
    })

它可以包含不可打印的字符,例如 Zero Width Space,在 HTML 中称为 ​。我不确定 Chrome 开发工具在这种情况下会显示什么;它可能确实什么也没显示。

检查 cb.length,如果它是 0 那么 cb 是空的,否则它不是空的(显然)然后你可以使用 charCodeAt() 找出那里有什么。

零宽度 Space 字符的示例代码:

var x = "​";
console.log("x === '" + x + "'");
console.log("x.length === " + x.length);
console.log("x.charCodeAt(0) === " + x.charCodeAt(0));