2020web前端面试题

>flex grid相比传统布局缺点:
flex缺点P:兼容性
>跨域除了jsonp,还有啥 ?Acess Control Allow Origin是和jsonp一起的吗
postMessage()
>v8为什么性能高?
>js实现原理
>>Javascript 定义
单线程
异步 IO
并发
基于原型的面向对象
脚本语言
>>Javascript 引擎与运行时环境
Javascript 引擎和运行时环境这两个概念很容易被弄混,但它俩真不是一个东西。Javascript 引擎做的事情是实现 ECMAScript 标准,解释(或编译) Javascript 代码;而运行环境是包括引擎并提供一些类库让 Javascript 代码能够在其上运行,例如 Chrome, Node。
>>为什么设计为单线程?
JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。 JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 摘自 http://www.ruanyifeng.com/blog/2014/10/event-loop.html
>>单线程如何异步,如何并发?
我们知道,在一段程序代码中发起一个调用并等待直到调用返回结果再执行接下来的代码,这个调用对于这段程序来说是同步的;而发起一个调用后不用等待调用结果而直接执行后面的代码,这个调用对于这段程序来说就是异步的。
异步意味着在主逻辑中被异步调用的代码和主逻辑继续执行的代码会同时执行,这其实是实现了并发。回想一下我们在 Java 或者其它多线程语言中是如何实现异步的,一般来说,要创建一个异步任务,我们通常会创建一个线程然后在线程中执行该任务,这个任务和创建它的线程就可以并发执行了。但 Javascript 单线程的特性显然和这异步、并发是有冲突的,那么为什么说 Javascript 支持异步,支持并发呢?
其实理解起来也很简单,Javascript 本身并不是异步的,而 Javascript 程序是异步的。具体来说就是,Javascript 编写的代码自身运行于单线程中,当遇到 IO 调用,就把它丢给运行时环境处理,自身继续执行后面的代码,当 IO 调用有了结果,会将结果及回调放在一个队列里,Javascript 线程会在合适的时机将回调函数取出并执行。
Javascript 程序的异步由其运行时环境提供,通过event loop实现异步编程,并提供并发支持。
>>Javascript 具体是如何工作的
单说Javascript 是如何工作的其实不太准确,应该说Javascript 在其运行时环境上是如何工作的才对,Node 和 Chrome 都是 Javascript 的运行时环境,它们使用相同的 JavaScript 引擎(V8),都应用基于 event loop 的并发模型( Chrome 内核使用了 libevent 而 Node 则基于 libuv )
 
11.26:
>实现一个函数,找出字符串中出现次数最多的字符,并输出次数
>>
function strCount(str){
  let strCountMap=new Map();//map
  let arr=str.split('');
  let arrNoRepeat=Array.from(new Set(arr));
  for(let obj of arrNoRepeat){
    let count=0;
    for(let data of arr){
      if(data==obj){
        count++;
      }    
    }
    strCountMap.set(obj,count);  
}
//设置一个map,<string,count>,再遍历找到最大的的count,及对应的string.
}
 
>实现摇骰子抽奖函数,使得输出1,2,3,4,5的概率分别是10%,输出6的概率是50%
function roll(){
let a=Math.random()*10+1;
let b=Math.floor(a);
let res=0;
if(b>6){
res=6;
}else{
res=b;
}
return res;
}
原文地址:https://www.cnblogs.com/begin256/p/13881817.html