Notes
Short notes, maybe I don't want to write so much 📝.
Search title:
- Proxy下修改数组触发两次拦截钩子
November 11, 2022
一段很简单的
Proxy
代码,运行结果中console.log(idx, value)
触发两次:code snippetCopyjavascriptconst 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上解释的很清楚:
- 第一次出发是因为
set
拦截到数组添加了一个新值; - 第二次是因为数组的
length
属性被重新设置。
如果是普通对象则不会出现这种情况。
- 第一次出发是因为
- JS标签语句
October 14, 2022
goto 被公认为是一种极为糟糕的编码方式,它会让代码变得晦涩难懂(也叫作 spaghetti code),好在 JS 不支持 goto。但 JS 的标签语句可以实现部分 goto 功能:continue 和 break 语句都可以带一个标签,因此能够像 goto 那样进行跳转:
code snippetCopyjavascriptfoo: 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 != NaN
为true
。在 ES6 的工具函数中我们可以使用Number.isNaN()
进行检测,但不太准确:code snippetCopyjavascriptvar a = 2 / 'foo' // NaN var b = 'foo' // "foo" window.isNaN(a) // true window.isNaN(b) // true ???
代码片段表明
isNaN
会将参数转换为数字进行判断。利用其自反性来判断:code snippetCopyjavascriptif (!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 snippetCopyjavascriptlet a = 23..toFixed(2) let b = 23 .toFixed(2) let c = (23).toFixed(2)
Load more notes