大话前端

某疆笔试

2018-07-09  本文已影响0人  fenerchen

题型

  1. 选择
    • 单选
    • 多选
  2. 问答

选择

1、int i=2; int x=(i++)+(i++)+(i++);x=?

x=9,i=5
i为2,3,4, 2+3+4=9

2、console.log(2==[[[2]]]) true
==比较,如果一个操作符是对象,另一个操作符不是,先调用对象的valueOf()方法,得到将基本类型后再转换为数值。
但是,将typeof [[[2]]].valueOf()==objct,个人认为调用valueOf后,还是对象的话,在调用对象的toString()方法。对象和非对象的==比较类似于Number(对象)转换

Number({})==NaN
Number([0,2])==NaN//数组中多个元素
Number([2])==2//数组中单个元素

3、用二分查找长度为20的、排好序的线性表,查找不成功时,最多需要比较多少次?

折半查找最坏的情况是Math.floor(log2N)+1,最好的情况是查找1次

4、-8的二进制反码

整数的原码反码和补码相等,负数的反码是原码的符号位不变,其他位取反,补码是反码+1
-8 的原码:10001000
-8的反码:11110111
-8的补码:11111000

5、console.log([1<2<3,3<2<1])
[true,true]

不等号依次比较,1<2为true,而true为1,所以1<3为true
3<2为false,而false视为0,所以0<1为true

6、进程阻塞的原因

解析:进程有3个状态:就绪态、执行态、阻塞态。三种状态的转换包含有:
就绪->执行,执行->就绪,执行->阻塞,阻塞->就绪
等待I/O、进程sleep、等待解锁等原因都会导致进程暂停。关于"时间片切换",当进程已经获得了除cpu外所有的资源,这时的状态就是就绪态,当分配到了时间片就成了执行态,当时间片用完之前一直未进入阻塞态的话,此后便继续进入就绪态。所以进程的就绪与阻塞是完全不同的。


7、因为浏览器的限制,目前浏览器端html5及js还不能实现的功能是(以60版本谷歌为基准)?
A 离线消息推送
B 读写本地文件
C 绘制webgl
D 将视频用canvas_x0008逐帧绘制

8、console.log(1+-+++-+1)error

console.log(1+-+'1') 输出0
因为一元加操作符相当于取Number,即1+-+‘1’首先+‘1’==Number(‘1’),然后-1为负1,1+(-1)=0

9、

var a={
   name:1,
   b:function(){
    this.name++
    return this.name
   } 
}
console.log(a.b())//2
var c=a.b
console.log(c())//'1'?this指向window

window对象本身就有name属性,表示窗口的名字,默认是空字符串"",类型是字符串类型。如果给windowname属性赋值的时候不是字符串类型,就会强制转化为字符串类型。因此在执行c()的时候,this指向window,window.name++,空字符串自增操作变成1,然后强制类型转换为字符串,最后输出‘1’

var a={
   name:2,
   m:'d',
   b:function(){
    this.name++
    console.log(this.m) 
    console.log(this.name) 
   } 
}
a.b()//'d',3
var c=a.b
c()//undefined,1,this指向window
var obj = {   
     a: 1,    
     b: function () {
         console.log(this.a)
         }
};

var objb = obj.b;
obj.b();    //1
objb();     //undefined

10、正则表达式不能匹配www.dji.com?AC
A. ^\w+\.\w+\-\w+\.\w+$
B. [w]{0,3}.[a-z\-]*.[a-z]+
C. [c-w.]{3,10}[.][c-w.][.][a]
D. ^\w.*com$

var s='www.dji.com',
reg1=/^\w+\.\w+\-\w+\.\w+$/,
reg2=/[w]{0,3}.[a-z\-]*.[a-z]+/,
reg3=/[c-w.]{3,10}[.][c-w.][.][a]/,
reg4= /^\w.*com$/
console.log(reg1.test(s))//false
console.log(reg2.test(s))//true
console.log(reg3.test(s))//false
console.log(reg4.test(s))//true
  • {n, m} 匹配前一项至少n次,但是不能超过m次
  • {n, } 匹配前一项n次,或者多次
  • {n} 匹配前一项恰好n次
  • ? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
  • 匹配前一项1次或多次,等价于{1,}
  • 匹配前一项0次或多次.等价于{0,}
  • \w:匹配字母数字和下划线,相当于[0-9a-zA-Z_]
  • \w:匹配非字母数字和下划线,相当于[^0-9a-zA-Z_]
  • .匹配除\n换行符之外的任意字符
  • .匹配.点
  • ^匹配开头
  • $匹配结尾
  • [a-z0-9]匹配a-z0-9中的任意一个字符一次
  • (sd)?匹配括号中的sd整体0次或1次

选项A多了-
C选项只匹配了dji中一个字符,而且没有a字符显然不对

11、Math.round(-7.5);Math.round(-7.6);?-7 -8

四舍五入,舍是变小,入是变大,整数小于就舍0.5,其余入,负数相反

12、哪些情况产生死锁?ACD
A 竞争不可抢占性资源引起死锁
B 进程产生死循环
C 竞争可消耗资源引起死锁
D 进程推进顺序不当引起死锁

产生死锁的原因:(1)竞争资源.(2)进程间推进顺序非法
竞争非可剥夺性资源和竞争临时资源(消耗性资源)
进程推进不合法
死锁产生的4个必要条件:
1.互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用毕释放。
2.请求和保持条件:指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3.不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4.环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,…,Pn}中的P0正在等待一个P1占用的资源; P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
处理死锁的基本方法
1.预防死锁:该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但由于所施加的限制条件往往太严格,因而可能会导致系统资源利用率和系统吞吐量降低。
2.避免死锁:在资源的动态分配过程中,用某种方法去防止系统
进入不安全状态
,从而避免发生死锁。这种方法只需事先施加较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在实现上有一定的难度。目前在较完善的系统中常用此方法来避免发生死锁。
3.检测死锁:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,而是允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源; 然后,采取适当措施,从系统中将已发生的死锁清除掉。
4. 解除死锁:这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤消或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

13、异步任务有哪些 ABC
A setTimeout
B setInterval
C Promise.resolve
D localStorage.setItem
14、以下描述不正确的是 AbCD
A GET请求不可以携带body
B cache-control:no-cache 表示浏览器不存储资源内容
C componentWillReceiveProps在componentShouldUpdate之后执行
D vue 的双向绑定对数组不生效

简答

1、写一个快排算法
2、数组和链表的区别

1.数组从栈中分配空间,链表从堆中分配空间
2.数组元素在内存中连续存放;链表不要求连续,每一个数据都保存了下一个数据的内存地址
3.数组初始化必须制定大小,链表则不需要
4.数组利用下标定位,时间复杂度为o(1),链表定位的时间复杂度为o(n)
5.数组插入或删除元素的时间复杂度o(n),链表的复杂度为o(1)

3、将浮点数点左边的数每三位添加一个逗号

//num传入的浮点数,返回字符串
function addComma(num){
    var arr=num.toString().split('.')
    var left=arr[0].split('').reverse(),cnt=0
    
    for(let i=0;i<left.length;i++){
        cnt++
        if(cnt%3===1&&cnt!==1){
            left.splice(i,0,',')
            cnt=0
        }
    }
    return left.reverse().join('')+'.'+arr[1]
}

4、进程间的通信方式

1.共享存储器系统
相互通信的进程共享某些数据结构或共
享存储区,进程之间能够通过这些空间进行通信又可把它们分成以下两种类型:
(1) 基于共享数据结构的通信方式。要求诸进程公用某些数据结构,
借以实现诸进程间的信息交换
(2) 基于共享存储区的通信方式。为了传输大量数据,在存储器中划出了一块共享存储区,诸进程可通过对共享存储区中数据的读或写来实现通信
2.消息传递系统
进程间的数据交换是以格式化的消息(message)为单位。又因其实现方式的不同而进一步分成直接通信方式和间接通信方式两种。
3.管道通信
所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:
(1) 互斥,即当一个进程正在对pipe执行读/写操作时,其它(另一)进程必须等待。
(2) 同步,指当写(输入)进程把一定数量(如4 KB)的数据写入pipe,便去睡眠等待,直到读(输出)进程取走数据后,再把它唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后,才将之唤醒。
(3) 确定对方是否存在,只有确定了对方已存在时,才能进行通信。

5、一段js操作dom代码,性能优化,

上一篇下一篇

猜你喜欢

热点阅读