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




