You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JSON.stringify返回值迭代时出现只读字符串异常求助

搞定这个字符串只读问题的关键:理解JS字符串的不可变性

嘿,这个问题我之前在Node.js项目里也踩过坑!核心原因其实是JavaScript字符串的不可变性——JSON.stringify()返回的是原生字符串类型,这类值在JS里是只读的,你没法直接修改字符串的单个字符(比如data[i] = xxx这种操作,非严格模式下会静默失败,严格模式直接抛错)。而你之前测试的「非受保护数据」应该是Buffer或者数组这类可变结构,所以能正常执行修改操作。

直接可用的解决方案:转成可变结构再处理

要解决这个问题,你只需要先把JSON.stringify()返回的字符串转换成可变的容器(比如字符数组或者Node.js的Buffer),处理完再转成字符串就行。给你两个实用的方案:

方案1:转成字符数组处理(通用JS环境都能用)

修改你的xor_swap函数,先判断输入类型,字符串就转成数组:

xor_swap(keys, data) {
  // 把字符串转成可变的字符数组,非字符串直接用原数据
  let mutableData = typeof data === 'string' ? [...data] : data;
  
  for (let i = 0; i < mutableData.length; i++) {
    // 注意:字符数组的元素是字符串,要先转成ASCII码再异或,之后转回去
    const charCode = mutableData[i].charCodeAt(0) ^ this.xor_key_exchange(keys, i);
    mutableData[i] = String.fromCharCode(charCode);
  }
  
  // 把处理后的数组转回字符串
  return mutableData.join('');
}

方案2:用Node.js Buffer处理(字节级操作更高效)

如果你的场景是Node.js环境,用Buffer会更高效,因为它本身就是可变的字节序列:

xor_swap(keys, data) {
  // 统一转成Buffer:字符串按utf8编码转,Buffer直接复用
  let buffer = Buffer.isBuffer(data) ? data : Buffer.from(data, 'utf8');
  
  for (let i = 0; i < buffer.length; i++) {
    // Buffer的元素是字节值,直接异或就行
    buffer[i] ^= this.xor_key_exchange(keys, i);
  }
  
  // 转成utf8字符串返回
  return buffer.toString('utf8');
}

为什么你之前的复制操作没生效?

你说试过复制数据但没用,大概率是因为你没转成可变结构:比如直接let newData = data是浅复制,字符串是值类型,还是指向同一个只读字符串;哪怕用data.slice()复制,返回的依然是字符串,还是不可变。必须转成数组或Buffer这种可变容器,才能真正修改里面的内容。

内容的提问来源于stack exchange,提问作者eof

火山引擎 最新活动