WebAssembly,options, 一道this题,finally

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)
};

总结

有点焦虑,做题加复习来缓解。抽空还要汇总起来,现在知识点太零散,对自己复查和他人看都不方便。但是最近确实是查缺补漏的状态,先这样写了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章