Notes

Short notes, maybe I don't want to write so much 📝.

Search title:
  • Proxy下修改数组触发两次拦截钩子

    November 11, 2022

    一段很简单的Proxy代码,运行结果中console.log(idx, value)触发两次:

    code snippetCopyjavascript
    const foo = [1, 2, 3] const _foo = new Proxy(foo, { set(target, idx, value, receiver) { /** * 第一次输出:3 4 * 第一次输出:length 4 */ console.log(idx, value) target[idx] = value return true }, }) _foo.push(4) // 4 => [1, 2, 3, 4]

    Stackoverflow上解释的很清楚:

    1. 第一次出发是因为set拦截到数组添加了一个新值;
    2. 第二次是因为数组的length属性被重新设置。

    如果是普通对象则不会出现这种情况。

  • JS标签语句

    October 14, 2022

    goto 被公认为是一种极为糟糕的编码方式,它会让代码变得晦涩难懂(也叫作 spaghetti code),好在 JS 不支持 goto。但 JS 的标签语句可以实现部分 goto 功能:continue 和 break 语句都可以带一个标签,因此能够像 goto 那样进行跳转:

    code snippetCopyjavascript
    foo: for (var i = 0; i < 4; i++) { for (var j = 0; j < 4; j++) { // 如果j和i相等,继续外层循环 if (j == i) { // 跳转到foo的下一个循环,或者使用 break foo 提前结束外层循环 continue foo } // 跳过奇数结果 if ((j * i) % 2 == 1) { // 继续内层循环(没有标签的) continue } console.log(i, j) } }

    需要注意的是:contine foo 并不是指“跳转到标签 foo 所在位置继续执行”,而是“执行 foo 循环的下一轮循环”。所以这里的 foo 并非 goto。

  • JS中NaN的自反性

    October 13, 2022

    NaN是一个特殊值,它和自身不相等,是唯一一个自反(自反,reflexive,即x === x不成立)的值。而NaN != NaNtrue。在 ES6 的工具函数中我们可以使用Number.isNaN()进行检测,但不太准确:

    code snippetCopyjavascript
    var a = 2 / 'foo' // NaN var b = 'foo' // "foo" window.isNaN(a) // true window.isNaN(b) // true ???

    代码片段表明isNaN会将参数转换为数字进行判断。利用其自反性来判断:

    code snippetCopyjavascript
    if (!Number.isNaN) { Number.isNaN = function (n) { return n !== n } }
  • 数字字面量方法调用

    October 13, 2022

    JS 中在字符串后使用“.”运算符可以调用 String 上的一些方法,但这个对数字却无效:

    code snippetCopyjavascript
    'hello'.split('').join('-') // h-e-l-l-o 23.toFixed(2) // Uncaught SyntaxError: Invalid or unexpected token

    因为数字存在这样的写法:23.,即小数点后的 0 可以身略,而小数点保留。上面片段报错是因为toFixed被视作数字的一部分。这些是正确的调用:

    code snippetCopyjavascript
    let a = 23..toFixed(2) let b = 23 .toFixed(2) let c = (23).toFixed(2)
Load more notes