HE Shi-Jun

Results 543 comments of HE Shi-Jun

> 如果考虑js文件大小,那么a|0与其他方式比较,是最短的方式,所以如果要考虑压缩代码的大小,且明确知道数值范围不会超过32位整数的时候,可以考虑使用这个技巧。 这个真节约不了几个字节哈……想节约还不如换个更好的gzip压缩算法或上Brotli压缩。或者看好图片之类的资源文件,随随便便几百K甚至几M就出去了。这就好比每天跟卖菜小贩讨价还价1个小时节约1毛,买房时不知道多找几个中介,便宜一个点就是几万。😂 我个人认为我们只应该在确定要进行 int32 转型的时候用它,或者按asm.js的约定以 x = x|0 作为类型标注。手动优化而丢失代码逻辑原本的intention是导致可维护性下降的万恶之源。(比如超出32bit或特殊值如Infinity、NaN就统统静悄悄变成了0,而出问题的时候你不知道0到底是从哪里来的 🙃)

理论上说这里不存在浮点数『精度』的问题,因为在机器内部本来就不是十进制。长远说我们要等专门的decimal类型(bigint都有了,decimal还会远吗?——还真不好说),短期就得自己走字符串转换下,我一般用 `function roundFloat(x, p = 15) { return +x.toPrecision(p) }` roundFloat(3.22%1) 返回 0.22。(用split、正则等的问题你不但需要处理一串0跟着零头,也可能是一串9跟着零头,比如 3.21%1)

补充,所有位运算都会把 `-0` 转为 `0`。因为位运算首先会转成int32,而int32是没有 `-0`的。另外bigint里也是没有`-0`的,所以`Object.is(0n, -0n)`返回true。 再补充一个序列化有关的坑:`JSON.parse("-0")` 返回 `-0` 然而 `JSON.stringify(-0)` 返回 `"0"`,所以是不对称的。😓

@q269384828 没啥好办法,JSON.stringify设计时就是不考虑circular的。你需要structured clone(目前不在js标准里)。

建议hypot先做个名词解释。『弦』? hypot 性能相对差是各个语言普遍存在的情况。我觉得可以把hypot的motivation再描述的清楚一点(即防止overflow/underflow)。这也能解释为什么尽管性能差,所有语言还都是要加上它。 我建议这里还可以实际写一个polyfill。可以用wikipeida上的算法(还挺简单的,一看就懂),或用mdn上的。mdn上有两个,一个是普通naive的sqrt,一个是确保不会overflow/underflow的算法。我们可以测一下后者的性能。 > 所以,如果我们要处理很大的数或很小的数时,可以使用Math.hypot,在一般情况下,还是使用Math.sqrt为好。 这一点我不太赞同,我认为应该反过来。在一般情况下(你不清楚你要处理的数字的range),应该用 Math.hypot,只有你确切的知道这里不可能有 overflow/underflow 或我们可以容忍一定的精度丢失,才用 Math.sqrt。 这里还有一点是,尽管现在 Math.hypot 的性能比较差,但这是引擎可以优化的。(比如好像ff里的性能就不是特别差。)在其他语言里我们也看到会在新的版本里改算法以提升性能。js引擎当然也可以。比如从其他语言移植算法实现。有空的话,可以拉几个算法用纯js实现下看看说不定比现在原生的还快。😜

嗯,也可以直接用data协议。 ``import(`data:text/javascript,${code}`)``

@tdjastrzebski - https://opensource.stackexchange.com/questions/8135/can-i-use-mit-isc-apache-2-0-in-a-project-licensed-as-mit-or-apache-2-0 - https://medium.com/@robmuh/why-choose-apache-2-0-license-4253379b00ce

```js const o = { x: 42, get m() { return this.x } } const ref m = ref o.m m // 42? ``` My point is, if accessor works,...

The identity problem of `bind` was discussed in old bind operator proposal before and I think it could be solved by some weakmap-based cache (though still have cross-realm issue for...

Not sure what constant/mutable mean, I guess you mean: ```js const o = {x: 1} const ref x = o.x x.value // 1 x.mutable // true ++x.value o.x // 2...