笔试题

193 阅读4分钟
JS找字符串中出现最多的字符
let s='nininiiiiihaoan';
s.split('').reduce(function (pre,cur) {
  pre[cur]?pre[cur]++:pre[cur]=1
  return pre;
},{})
{n: 4, i: 7, h: 1, a: 2, o: 1}

//深拷贝
function deepClone(obj) { 
  function isObject(o){
    return(typeof o ==='object' || typeof o ==='function')&& o!=null
  }
    if(!isObject(obj)){
      throw new Error('非对象')
    }
    //...浅拷贝第一层,如果直接: let cloneValue =obj 导致所有层级都拷贝地址指针
    let cloneValue = Array.isArray(obj)?[...obj]:{...obj}
    //静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
    Object.keys(obj).forEach(function (key) {
      cloneValue[key]=isObject(obj[key])?deepClone(obj[key]):obj[key]
    }) 
  return cloneValue
} 

//变量和函数声明都被提升,但变量的值没有
function test() {
   console.log(a);
   console.log(foo());
   
   var a = 1;
   function foo() {
      return 2;
   }
}
 
test();
VM1007:2 undefined
VM1007:3 2

 //质数:除了1和他本身,不能有其他因数
 function isPrime(number) { 
   if (typeof number !== 'number' || !Number.isInteger(number)) {
      // Number.isInteger为ES6中新增判断整数
      return false;
   }
   if (number < 2) {
      return false;
   }
 
   if (number === 2) {
      return true;
   } else if (number % 2 === 0) {
      return false;
   }
   var squareRoot = Math.sqrt(number); //平方根,比如Math.sqrt(9)为3
   for(var i = 3; i <= squareRoot; i += 2) {//??思考题
      if (number % i === 0) {
         return false;
      }
   }
   return true;
}

//闭包
var x = 20;
    var a = {
        x : 15,
        fn : function(){
            var x = 30;
            return function(){
                return this.x;
            };
        }
    };
    console.log(a.fn());//ƒ (){return this.x;}
    console.log((a.fn())());//20
    console.log(a.fn()());//20 
    console.log(a.fn()() == (a.fn())());
    console.log(a.fn().call(this));20
    console.log(a.fn().call(a));15

类数组:是相当于一个对象,里面有数组的值以及相应的属性(length)。

其中ES5中arguments就是一个类数组,但是在ES6中是没有这个属性。

类数组转换成数组的方法

1:Array.prototype.slice.call(likeArray);利用slice的返回新数组以及call改变this指向而形成一个新数组

2:Array.from(likeArray); ES6的新方法

3:[...likeArray],或者在函数传值时用..."收集"; //...要求likeArray是有Symbol的iterator属性

12个石头,一个天平,最少称重几次?
3
 有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?
8次

下面这个例子,父元素div绑定两个事件(一个冒泡阶段、一个捕获阶段),子元素也是这种情况。事件触发顺序如何。
 var btn = document.querySelector('button');
        var div = document.querySelector('div');

        btn.addEventListener('click', function(){
            console.log('bubble','btn');
        },false);
        btn.addEventListener('click', function(){
            console.log('capture','btn');
        },true);

        div.addEventListener('click', function(){
            console.log('bubble','div');
        },false);
        div.addEventListener('click', function(){
            console.log('capture','div');
        },true); 

绑定在被点击元素的事件是按照代码顺序发生,其他元素通过冒泡或者捕获“感知”的事件,按照W3C的标准,先发生捕获事件,后发生冒泡事件。所有事件的顺序是:其他元素捕获阶段事件 -> 本元素代码顺序事件 -> 其他元素冒泡阶段事件 。

var val = 'smtg';
console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');
A: Value is Something

B: Value is Nothing

C: NaN

D: other

解答:这题考的javascript中的运算符优先级,这里'+'运算符的优先级要高于'?'所以运算符,实际上是 'Value is true'?'Something' : 'Nothing',当字符串不为空时,转换为bool为true,所以结果为'Something',选D

//var变量声明提升,值不提升
var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})(); 
相当于:
var name = 'World!';
(function () {
    var name;//现在还是undefined
    if (typeof name === 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

//Array.prototype.filter is not invoked for the missing elements
(缺少的元素,不会调用过滤器)
var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) { return x === undefined;});
[]

第11题
//垂直水平居中
 .content {
            width: 300px;
            height: 300px;
            background: orange;
            margin: 0 auto; /*水平居中*/
            position: relative;
            top: 50%; /*偏移*/
            transform: translateY(-50%);
        }
        
        
        
        
// 在移动端中怎样初始化根元素的字体大小
页面开头处引入下面这段代码,用于动态计算font-size:
(假设你需要的1rem = 20px)
(function () {
  var html = document.documentElement;
  function onWindowResize() {
    html.style.fontSize = html.getBoundingClientRect().width / 20 + 'px';
  }
  window.addEventListener('resize', onWindowResize);
  onWindowResize();
})(); 
document.documentElement:获取document的根元素
html.getBoundingClientRect().width:获取html的宽度(窗口的宽度)
监听window的resize事件

一般还需要配合一个meta头:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">


viewport
移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域
可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小,比如可以:平移或缩放
移动设备默认的viewport是layout viewport,也就是那个比屏幕要宽的viewport,
但在进行移动设备网站的开发时,我们需要的是ideal viewport。所以使用:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">




利用meta标签把http请求换为https:
<meta http-equiv ="Content-Security-Policy" content="upgrade-insecure-requests">

输入URL到页面呈现


第一次握手:当客户端需要去建立连接时,客户端就会发送SYN包 到服务器,等待服务器确认

第二次握手:服务器收到SYN包,发送SYN,ACK确认标志。

第三次握手:客户端收到服务器的SYN+ACK包,然后就会像服务器发送确认包ACK和SYN