js常见面试题(二)

本文详细介绍了JavaScript中的原型和原型链概念,包括__proto__和prototype的区别与联系。探讨了不同继承实现方式,如默认原型继承、构造函数继承和原型混入,并通过实例解释了深拷贝与浅拷贝的差异。此外,还讨论了防抖和节流技术在性能优化中的应用,以及作用域、作用域链和执行期上下文的概念。同时,列举了DOM操作的基本方法,如节点属性和操作子节点的方法。
摘要由CSDN通过智能技术生成
  1. 原型和原型链
    原型链:当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
    原型:1.所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象
    2.所有函数都有一个prototype(原型)属性,属性值是一个普通的对象
    3.所有引用类型的__proto__属性指向它构造函数的prototype

  2. prototype与__proto__的关系与区别

  3. 继承的实现方式及比较
    (1)默认的原型继承-构造函数原型中添加属性
    (2)覆盖构造函数的原型 //会导致之前的constructor丢失,若构造函数中的这个属性很重要最好手动mowei添加指回原构造函数Fn.prototype.constructor=Fn;
    (3)原型混入
    (4)构造函数属性继承
    function Person(name,age){
    this.name = name;
    this.age = age;
    }
    function Man(name,age){
    Person.call(this,name,age);
    }
    var man1 = new Man(“Mike”,2);
    console.log(man1);

  4. 深拷贝与浅拷贝
    深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
    浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
    方法:object assign({},obj);
    Array.prototype.concat()3
    Array.prototype.slice()
    深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
    方法:JSON.parse(JSON.stringifty()) //JSON.stringify将对象转化为JSON字符串

  5. 防抖和节流
    防抖:对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次。
    效果:如果短时间内大量触发同一事件,只会执行一次函数
    实现:用seTimeout函数和一个变量用于保存计时,为了保护全局部纯净可以借助闭包实现
    节流:
    效果:如果短时间内大量触发同一事件,那么在函数执行一次之后,该函数在指定的时间期限内不再工作,直至过了这段时间才重新生效。

  6. 作用域和作用域链、执行期上下文
    上下文(context)是用来指定代码某些特定部分中this的值
    作用域(scope) 是指变量的可访问性,上下文(context)是指this在同一作用域内的值
     上下文始终坚持一个原理:this永远指向最后调用它的那个对象

  7. DOM常见的操作方式
    1)节点属性
    Node.nodeName //返回节点名称,只读
    Node.nodeType //返回节点类型的常数值,只读
    Node.nodeValue //返回Text或Comment节点的文本值,只读
    Node.textContent //返回当前节点和它的所有后代节点的文本内容,可读写
    Node.baseURI //返回当前网页的绝对路径

    Node.ownerDocument  //返回当前节点所在的顶层文档对象,即document
    Node.nextSibling  //返回紧跟在当前节点后面的第一个兄弟节点
    Node.previousSibling  //返回当前节点前面的、距离最近的一个兄弟节点
    Node.parentNode   //返回当前节点的父节点
    Node.parentElement  //返回当前节点的父Element节点
    Node.childNodes   //返回当前节点的所有子节点
    Node.firstChild  //返回当前节点的第一个子节点
    Node.lastChild   //返回当前节点的最后一个子节点
    
    //parentNode接口
    Node.children  //返回指定节点的所有Element子节点
    Node.firstElementChild  //返回当前节点的第一个Element子节点
    Node.lastElementChild   //返回当前节点的最后一个Element子节点
    Node.childElementCount  //返回当前节点所有Element子节点的数目。
    

    2)操作
    Node.appendChild(node) //向节点添加最后一个子节点
    Node.hasChildNodes() //返回布尔值,表示当前节点是否有子节点
    Node.cloneNode(true); // 默认为false(克隆节点), true(克隆节点及其属性,以及后代)
    Node.insertBefore(newNode,oldNode) // 在指定子节点之前插入新的子节点
    Node.removeChild(node) //删除节点,在要删除节点的父节点上操作
    Node.replaceChild(newChild,oldChild) //替换节点
    Node.contains(node) //返回一个布尔值,表示参数节点是否为当前节点的后代节点。
    Node.compareDocumentPosition(node) //返回一个7个比特位的二进制值,表示参数节点和当前节点的关系
    Node.isEqualNode(noe) //返回布尔值,用于检查两个节点是否相等。所谓相等的节点,指的是两个节点的类型相同、属性相同、子节点相同。
    Node.normalize() //用于清理当前节点内部的所有Text节点。它会去除空的文本节点,并且将毗邻的文本节点合并成一个。

    //ChildNode接口
    Node.remove()  //用于删除当前节点
    Node.before()  //
    Node.after()
    Node.replaceWith()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值