zoukankan      html  css  js  c++  java
  • 一年经验的前端该学会的

    原文:面试分享:一年经验初探阿里巴巴前端社招 

    关于这位同学面试过程中涉及到的知识点:

    1.标准盒模型、怪异盒模型

    简单来说,box-sizing属性中,标准盒模型对应content-box(initial),怪异对应border-box(IE),

    标准:宽高不包含padding和border

    怪异:padding和border是算在宽高里的

    2.target与currentTarget

    简单来说:js的事件处理机制是有顺序的,先从window开始,经过document,html,body,div这样刷下来,叫做 事件捕获

    再从div一路回到window叫做 事件冒泡,体现在代码上就是:当我们点击最里面的div的时候,打印数序应该为three->two->one

    <div id="one">
        <div id="two">
            <div id="three"></div>
        </div>
    </div>
    
    
    one.addEventListener('click',function(e){
        console.log('one');
    },false);
    
    two.addEventListener('click',function(e){
        console.log('two');
    },false);
    
    three.addEventListener('click',function(e){
        console.log('three');
    },true);
    //false:默认值,冒泡阶段执行 //true:捕获阶段执行

    那么target和currentTarget有什么区别呢

    <div id="out">
         <button id="in">现在我来点击这个button</button>
    </div>
    
    var out= document.getElementById("out");
    var in= document.getElementById("in");
    
    out.addEventListener('click',function(e){
          e.target;//指向in
          e.currentTarget;//指向out自己
    })
    
    in.addEventListener('click',function(e){
          e.target;//指向in
          e.currentTarget;//指向in自己
    })

     总结

    1. target:触发事件的某个具体对象,只会出现在事件流的目标阶段(谁触发谁命中,所以肯定是目标阶段)
    2. currentTarget:绑定事件的对象,恒等于this,可能出现在事件流的任意一个阶段中
    3. 通常情况下terget和currentTarget是一致的,我们只要使用terget即可,但有一种情况必须区分这三者的关系,那就是在父子嵌套的关系中,父元素绑定了事件,单击了子元素(根据事件流,在不阻止事件流的前提下他会传递至父元素,导致父元素的事件处理函数执行),这时候currentTarget指向的是父元素,因为他是绑定事件的对象,而target指向了子元素,因为他是触发事件的那个具体对象,如下代码和截图所示:

    3.浅拷贝深拷贝

    看下图

    解释:数值之间赋值拷贝非地址拷贝,所以更改a时b不会受其影响(若为数组或对象则是地址拷贝,修改a会影响b),围绕这个特性展开深拷贝处理

    function inCopy(obj1,obj2) {
        var obj1 = obj1 || {};//容错处理
        for (var k in obj2) { 
            if(obj2.hasOwnProperty(k)){ //只拷贝实例属性,不进行原型的拷贝
                if(typeof obj2[k] == 'object') { //引用类型的数据单独处理
                    obj1[k] = Array.isArray(obj2[k])?[]:{};
                    inCopy(obj1[k],obj2[k]); //递归处理引用类型数据
                }else{
                    obj1[k] = obj2[k]; //值类型的数据直接进行拷贝
                }
            }
        }
    }

    这里注意几个比较重要的点:

    1.容错处理(细节不解释)

    2.obj.hasOwnProperty(xxx);返回一个bool,检测obj是否存在属性xxx,xxx是obj自己的属性而非_proto_指针指向的属性(即构造函数prototype的属性)

    3.判断是否为array,对其进行定义[] or {},若不做这一步,直接push会报错

  • 相关阅读:
    Yii2中request的使用
    git在本地仓库直接使用rm彻底删除文件,服务端还是存在
    oc基础-oc中之集合NSSet,NSMutableSet
    oc基础-oc中之集合NSArray,NSMutableArray
    oc基础-NSString和NSMutableString区别
    oc基础-Foundation中NSString类型的一些用法
    oc基础-foundation框架中的常用结构体
    oc基础-设计代理模式理解
    oc基础-protocol协议的使用
    block关键字的使用
  • 原文地址:https://www.cnblogs.com/cjt-cn/p/8342583.html
Copyright © 2011-2022 走看看