zoukankan      html  css  js  c++  java
  • JS面试易问问题点总结

    1、如果需要给html中的某个dom绑定事件,有三种常用方法:     

      1.直接写在dom的事件钩子上

    <span id="target" onClick="handleClick()">Click me</span>

      这种方法破坏了dom和js分离的规则,所以不太被推荐,如果面试官让你做题,尽量别这么写,他们会单纯地以为你很low

       2.通过js代码注册事件

    var target = document.getElementById('target');
    target.onclick = function() {
      // do something...
    }
    

      这种方式会比第一种方式更有“仪式感”,但是缺点也显而易见,只能绑定一次事件,下次绑定会清空上次绑定的事件

       3.通过addEventListener来注册事件
    var target = document.getElementById('target');
    target.addEventListener('click', function() {
      // do something...
    }, false);    // 如果不加第三个参数,默认是false

      这种方式最为灵活,也是被普遍建议采用的事件绑定方式

      当第三个参数为false时(不传参数时,默认也是这种冒泡方式),点击<span />后,接下来<p />会响应此次事件,然后是<div />,既事件从上往下冒泡

      当第三个参数为true时,点击<span />后,首先响应事件的是最底层的<div />,随后是<p />,最后才是你点击的<span />  也就是去捕获

      4.解除绑定事件

      removeEventListener()   

      1:相同事件绑定和解除,需要使用共用函数;绑定和解除事件时 事件没有"on" 即onclick写成click

      2:共用函数不能带参数;

    function bodyScroll(event){
        event.preventDefault();
    }
    document.body.addEventListener('touchmove',bodyScroll,false);
    document.body.removeEventListener('touchmove',bodyScroll,false);

    2、js阻止事件冒泡

      1.stopImmediatePropagation() 和 stopPropagation()的区别?(w3c)

      后者只会阻止冒泡或者是捕获。 但是前者除此之外还会阻止该元素的其他事件发生,但是后者就不会阻止其他事件的发生。

      2.使用IE的方式来取消事件冒泡 window.event.cancelBubble true;

    3、如何监听dom的变动

      Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。 Mutation Observer 则是异步触发,DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。 这样设计是为了应付 DOM变动频繁的特点。

    var target=document.getElementById('target');
    var i=0
    var observe=new MutationObserver(function (mutations,observe) {
        i++   
    });
    observe.observe(target,{ childList: true});
    target.appendChild(docuemnt.createTextNode('1'));
    target.appendChild(docuemnt.createTextNode('2'));
    target.appendChild(docuemnt.createTextNode('3'));
    console.log(i)  //1 callback的回调次数

    用处:

    • 你希望通知 Web 应用程序访问者,他当前所在的页面发生了一些更改。
    • 你正在开发一个新的 JavaScript 框架,需要根据 DOM 的变化动态加载 JavaScript 模块。

    4.let 、var 、const区别

        var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。

        let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。

        const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。

    5.link与@import区别

        两者都是外部引用CSS的方式,但是存在一定的区别:
        区别1:link除了引用样式文件,还可以引用图片等资源文件,而import只引用样式文件
        区别2:link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。
        区别3:link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。

        区别4:ink支持使用Javascript控制DOM去改变样式;而@import不支持。

    6.null和undefined区别

        1.null表示没有对象,即该处不应该有值

          作为函数的参数,表示该函数的参数不是对象

          作为对象原型链的终点

        2.undefined表示缺少值,即此处应该有值,但没有定

          定义了形参,没有传实参,显示undefined

          对象属性名不存在时,显示undefined

          函数没有写返回值,即没有写return,拿到的是undefined

          写了return,但没有赋值,拿到的是undefined

        3.null和undefined转换成number数据类型

           null 默认转成 0

          undefined 默认转成 NaN

    7.dom0级 、dom2级    

        1. 0级DOM

    ·      一是在标签内写onclick事件

            二是在JS写onlicke=function(){}函数

        2.  2级DOM

          只有一个:监听方法,原生有两个方法用来添加和移除事件处理程序:addEventListener()和removeEventListener()。

          它们都有三个参数:第一个参数是事件名(如click);

                   第二个参数是事件处理程序函数;

                     第三个参数如果是true则表示在捕获阶段调用,为false表示在冒泡阶段调用。

          addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用。

          removeEventListener():不能移除匿名添加的函数。

          只有2级DOM包含3个事件:事件捕获阶段、处于目标阶段和事件冒泡阶段

        3.区别    

          如果定义了两个dom0级事件,dom0级事件会覆盖

          dom2不会覆盖,会依次执行

          dom0和dom2可以共存,不互相覆盖,但是dom0之间依然会覆盖

    8.call 、bind 、 apply区别

        call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

        call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' );

        apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ]);

        bind除了返回是函数以外,它的参数和call 一样。

          当然,三者的参数不限定是string类型,允许是各种类型,包括函数 、 object 等等!

  • 相关阅读:
    mysql相关笔记
    qt杂项
    rpm离线安装整理
    linux fopen个数限制的问题(文件描述符限制)
    解决free():invalid pointer:0x00000000000000155455 ****的问题。
    linux c获取系统时间戳
    ubuntu QT Creater 安装
    LinkedHashMap如何保证顺序性
    HashMap原理(二) 扩容机制及存取原理
    HashMap原理(一) 概念和底层架构
  • 原文地址:https://www.cnblogs.com/yxkNotes/p/13936882.html
Copyright © 2011-2022 走看看