Interview3

一面

  • 1.跨域

    • (1)document.domain+iframe(主域相同的时候才能使用)

      在www.a.com/a.html中

      document.domain='a.com';
      var ifr=document.createElement('iframe');
      ifr.src='http://www.script.a.com/b.html';
      ifr.display=none;
      document.body.appendChild(ifr);
      ifr.onload=function(){
      var doc=ifr.contentDocument||ifr.contentWindow.document;
      //在这里操作doc也就是b.html
      ifr.onload=null;
      }

      在www.script.a.acom/b.html中
      document.domain=’a.com’

    • (2)动态创建script

          function loadScript(url,func){
             var head=document.head||document.getElementByTagName('head')[0];
             var script=document.createElement('script');
             script.src=url;
             script.onload=script.onreadystatechange=function(){ 
             if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
          func();
          script.onload=script.onreadystatechange=null;
               }
             }
             head.insertBefore(script,0);
          }
          window.baidu={
            sug:function(data){
               console.log(data)
               }
        }
        loadScript('http://suggestion.baidu.com/su?wd=w',function(){console.log(loaded)})
    • (3)location.hash+iframe

        //  a.com/cs1.html
        function startRequest(){
          var ifr=document.createElement('iframe');
          ifr.style.display='none';
          ifr.src='http://www.cnblogs.com/lab/csript/cs2.html#paramdo';
          document.body.appendChild(ifr);
          }
          function checkHash(){
             try{
              var data=location.hash?location.hash.substring(1):'';
              if(console.log){
              console.log('Now the data is '+data);
                  }
               }catch(e){}
          }
          setInterval(checkHash,2000)
       //cnblogs.com/cs2.html
       switch(location.hash){//模拟一个简单的参数处理操作
           case '#paramdo':
           callBack();
           break;
           case '#paramset':
           break;       
       }
       function callBack(){
          try{
           parent.location.hash='somedata';
              }catch(e){
              var ifrproxy=document.createElement('iframe');
              ifrproxy.style.disolay='none';
              ifrproxy.src=''http://a.com/test/cscript/cs3.html#somedata'; 
              document.body.appendChild(ifrproxy)
              }
        }
        //com/cs3.html
        parent.parent.location.hash=self.location.hash.substring(1)
    • (4)window.name+iframe

      name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的name值(2MB)

      ```
              //1.创建a.com/cs1.html;
              //2.创建a.com/proxy.html
              <head><script>
              function proxy(url,func){
              var isFirst=true;
              var ifr=document.createElement('iframe');
              var loadFunc=function(){
                 if(isFirst){
                    ifr.contentWindow.location='http://a.com/cs1.html';
                    isFirst=false;
                     }else{
                       func(ifr.contentWindow.name);
                       ifr.contentWindow.close();
                       document.body.removeChild(ifr);
                       ifr.src='';
                       ifr=null;
                     }
                 }
                 ifr.src=url;
                 ifr.style.display='none';
                 if(ifr.attachEvent) ifr.attachEvent('onload',loadFunc);
                 elsee ifr.onload=loadFunc;
                 document.body.appendChild(iframe);
              }
              </script>
              </head>
              <body>
                 proxy('http://www.baidu.com/',function(data){
              console.log(data)
             })
              </body>
              //b.com/cs1.html
              window.name='要传送的内容'
      ```
      
    • (5)postMessage(HTML5中的XMLHttpRequest Level 2中的API)

        //a.com/index.html中的代码
            <iframe id="ifr" src="b.com/index.html"></iframe>
      <script type="text/javascript">
      window.onload = function() {
          var ifr = document.getElementById('ifr');
          var targetOrigin = 'http://b.com';  // 若写成'http://b.com/c/proxy.html'效果一样
                                              // 若写成'http://c.com'就不会执行postMessage了
          ifr.contentWindow.postMessage('I was there!', targetOrigin);
      };
      </script>
      // b.com/index.html中的代码:
      <script type="text/javascript">
      window.addEventListener('message', function(event){
          // 通过origin属性判断消息来源地址
          if (event.origin == 'http://a.com') {
              alert(event.data);    // 弹出"I was there!"
              alert(event.source);  // 对a.com、index.html中window对象的引用
                                    // 但由于同源策略,这里event.source不可以访问window对象
          }
      }, false);
      </script>
    • (6)CORS

      原理:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应式应该成功还是应该失败。

      • ie对CORS的实现时xdr

         var xdr=new XDomainRequest( );
         xdr.onload=function(){
           console.log(xdr.reponseText);
        }
        xdr.open('get','http://www.baidu.com');
        xdr.send(null)
      • 其他浏览器的实现就在XHR中

        var xhr=new XMLHttpRequest();
        xhr.onreadystatechange=function(){
          if(xhr.readyState==4){
             if(xhr.status>=200&&xhr.status){
                     console.log(xhr.reponseText)
                }
             }
          }
          xhr.open('get','http://www.baidu.com')
          xhr.send(null)
        • 实现跨浏览器的CROS
          function createCORS(method,url){
           var xhr=new XMLHttpRequest();
           if('withCredenTials' in xhr){
                  xhr.open(method,url,true)
              }else if(typeof XDomainRequest!='undefined'){
                var xhr=new XDomainRequest();
                xhr.open(method,url)
             }else{
               xhr=null;
              }
             return xhr;
          }
          var request=createCORS('get','http://www.baidu.com')
          if(request){
              requset.send()
            }
          
    • (7)JSONP

           function handleResponse(response){
      console.log('The responsed data is: '+response.data);
      }
      var script = document.createElement('script');
      script.src = 'http://www.baidu.com/json/?callback=handleResponse';
      document.body.insertBefore(script, document.body.firstChild);
      /*handleResonse({"data": "zhe"})*/
      //原理如下:
      //当我们通过script标签请求时,后台就会根据相应的参数(json,handleResponse),来生成相应的json数据(handleResponse({"data": "zhe"})),最后这个返回的json数据(代码)就会被放在当前js文件中被执行,至此跨域通信完成
      缺点:    安全问题(请求代码中可能存在安全隐患,要确定jsonp请求是否失败并不容易
    • (8)web sockets

      web sockets是一种浏览器的API,它的目标是在一个单独的持久连接上提供全双工、双向通信。(同源策略对web sockets不适用)
      web sockets原理:在JS创建了web socket之后,会有一个HTTP请求发送到浏览器以发起连接。取得服务器响应后,建立的连接会使用HTTP升级从HTTP协议交换为web sockt协议。
      只有在支持web socket协议的服务器上才能正常工作。

      var socket = new WebSockt('ws://www.baidu.com');//http->ws; https->wss
      socket.send('hello WebSockt');
      socket.onmessage = function(event){
          var data = event.data;
      }
  • 2.redux的使用
  • 3.props改变子组件会更新吗
  • 4.子组件能改变从父级传进去的props的值吗?(原因说清楚)
  • 5.描述一下react的dom diff算法,原来dom diff的复杂度是什么?怎么优化?
  • 6.ES6中的class用原生的方式重新写(原型链继承)
class A(){
   constructor(){
     this.a=1
  }
  test(){
      console.log('test')
   }
}
  • 7.输出结果和原因
  var a=[1,2,3]
  var b=a;
  b.push(4);
  console.log(a);
  console.log(b)
  • 8.在实际项目中用过node吗?是自己搭建node服务吗?了解的其他node框架有哪些?
  • 9.nodejs怎样去寻找它引用的依赖的?
    • 分级查找,现在当前文件夹下找,再逐层递归
  • 10.说下安装依赖npm、yarn的区别

    • yarn的package锁定,避免兼容性问题
    • package.json版本号的问题
      'react': '^1.1.0',
      'react': '1.1.0',
  • 11.下面两个命令的区别
    • npm init
    • npm init -y
  • 12.canvas的原理
  • 13.网页动画性能优化
  • 14.介绍一个值得说的项目
  • 15.Css样式布局
  • 16.固定定位,绝对定位
  • 17.千位分隔符的原生实现

二面

  • 1.单页应用(SPA)和多页面应用相比哪个更好?为什么?

    • 单页应用的优缺点

      • 优点

      1.具有桌面应用的即时性,网站的可移植性和可访问性
      2.用户体验好,快,内容的改变不需要重新加载整个页面,web应用更具有响应性和更令人着迷。
      3.基于上面一点,SPA相对服务器压力小
      4.良好的前后端分离SPA和RESTFUL架构一起使用,后端不再负责模板渲染,输出页面工作,web前端和各种移动端地位对等,后端API通用化
      5.对前端人员JavaScript技能要求更高,促使团队技能提升

    • 缺点

      1.分功能模块的鉴权不好实现
      2.不利于SEO
      3.初次加载耗时相对增多
      4.导航不可用,如果一定要导航需要自行实现前进,后退

    • 多页应用的特点

      1.页面间切换加载慢,不流畅,用户体验差,特别是在移动设备上
      2.页面间的数据传递依赖URL,cookie或者localStorage,实现麻烦
      3.适用于需要对搜索引擎友好的网站

  • 2.使用react、vue开发与传统框架相比的好处是什么?

  • 3.怎么实现双向绑定?
  • 4.实现一个注册为什么用post,不是get?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值