String.fromCharCode() 参数小于 0 还能正常 是怎么做到的?

2018-10-10 15:26:46 +08:00
 yorks
String.fromCharCode(-255)
"!"
2760 次点击
所在节点    JavaScript
4 条回复
justou
2018-10-10 15:38:58 +08:00
yorks
2018-10-10 15:47:23 +08:00
嗯,我也看了这个文档,好像没看到说怎么处理 小于 0 参数。
justou
2018-10-10 15:58:19 +08:00
根据其描述, 它说只接收 0 到 0xffff 之间的数, 推断 String.fromCharCode()是把参数当做两个字节的 unsigned 解释的, 二的补码的-255 的 bit 跟 unsigned 的 65281 的 bit 是一样的, 你做几下实验发现
Tapir
2018-11-07 20:13:18 +08:00
这个事儿其实挺有意思的
按 ES 来说,fromCharCode 的参数需要进行 ES 规定的 ToUint16 运算操作
可从 ES1 - 8 翻下来,大致上 ToUint16 整个转换流程都没有把负数的布码形式直接识别为无符号形式的明显说明。
仅有一句较为不好理解的 Let int be the mathematical value that is the same sign as number and whose magnitude is floor(abs(number)).
但这句后半段又很好理解,按说就是绝对值后取整,显然这样操作下来应该是仅会是负值取正且小数取整。
按这里来说 -255 应该转为 255 才对。
可现实是,每个浏览器看起来都不是按 ES 规范来实现的。
由于 v8 最近把 JS 对象相关 API 都用 code asm 重写了,非常不好读。
就找来 mozilla 代码看看,它里面居然仅仅是做了 uint16_t 的强制类型转换 ……
由于负数二进制形式是补码形式,强制无符号转换就是把这个补码的二进制值直接存了无符号 int16,成了 65281。
不知道这种非规范实现是不是历史遗留,亦或是规范我没看仔细……
就酱紫

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/496346

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX