WebAssembly
看一下WebAssembly的来源,JIT的出现确实带来了可观的性能提升,但是受限于JS动态类型和运行时编译的特点,判断类型成为了限制JIT的一个重要因素。对此Mozilla提出了asm.js,通过注解和检测等手段确保强类型,减少JS依据上下文判断类型的损耗,优化机器码的解释过程。
后来各家各户觉得Mozilla这思路挺好,于是联合起来,设定了WebAssembly,即一份字节码标准,以字节码的形式依赖虚拟机在浏览器中运行。
首先要明确的一点,WASM并不能达到Assembly的性能,它只是一种约定的字节码,既然是字节码,肯定还是需要解释器翻译成机器码执行。它的优点是相对于JS字节码,它的翻译速度要快上许多。
其次对于CPU密集型任务,WASM也只是多提供了一种选择,有些时候使用WEBGL来做GPU加速往往是更好的选择。
最后,并不是指使用WASM就一定比JS快,V8使用的JIT有个很重要的优点,就是它会对热点代码进行抽取,直接编译生成二进制机器码方便接下来的调用。
options
今天查看自己网址的options请求时发现找不到,查了资料发现chrome需要更改一个设置:
chrome://flags/#out-of-blink-cors
因为是浏览器的缘故,用火狐还是可以看到的。
一个this题
var length = 10;
function fn(){
console.log(this.length)
}
var obj = {
length:5,
method: function(fn){
fn()
arguments[0]()
}
}
首先会输出10是没有什么异议的,因为函数传参,this丢失。
其次因为arguments[0]其实也是代指fn,但是因为是arguments调用的函数,因此这里的this指向的是arguments。它的length自然是2了。
Promise.prototype.finally
之前对finally理解有偏颇,一直以为是和resolve一样的静态方法,这次终于发现原来也是个实例方法。
无论当前 Promise 是成功还是失败,调用finally之后都会执行 finally 中传入的函数,并且将值原封不动的往下传。
做个题吧LeetCode300
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
dp的题,列方程,首先我们找到i之前的最大序列,设它的最大值为j,dp[j]即为i为j时的答案。
我们当i>j时,我们若想要arr[i]能够连接到arr[j]后面,必须要满足arr[i]>arr[j],因此:
var lengthOfLIS = function(nums) {
if(!nums.length) return 0
let res = new Array(nums.length).fill(1)
for(let i = 0;i<nums.length;i++){
for(let j = 0;j<i;j++){
if(nums[i]>nums[j]) res[i]=Math.max(res[i],res[j]+1)
}
}
return Math.max(...res)
};
总结
有点焦虑,做题加复习来缓解。抽空还要汇总起来,现在知识点太零散,对自己复查和他人看都不方便。但是最近确实是查缺补漏的状态,先这样写了。