每日面试题系列--------03

文章介绍了JavaScript中的原型和原型链概念,包括对象的[proto]属性、prototype属性以及原型链的工作原理。接着讨论了事件代理,阐述了其好处和实现方式,以及事件冒泡的概念。此外,还详细讲解了this对象的指向规则,new操作符的作用和工作流程,以及null和undefined的区别。最后提到了JavaScript的严格模式及其带来的限制和好处。
摘要由CSDN通过智能技术生成

1、JavaScript原型,原型链 ? 有什么特点?

原型:

JavaScript的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是该对象的原型

JavaScript的函数对象,除了原型 [proto] 之外,还预置了 prototype 属性

当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]

原型链:

当一个对象调用的属性/方法自身不存在时,就会去自己 [proto] 关联的前辈 prototype 对象上去找

如果没找到,就会去该 prototype 原型 [proto] 关联的前辈 prototype 去找。依次类推,直到找到属性/方法或 undefined 为止。从而形成了所谓的“原型链”

原型特点:

JavaScript对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变

2、请解释什么是事件代理

什么是事件代理(Event Delegation)

  • 回答:事件代理是一种通过将事件处理程序绑定到父元素而管理子元素触发的事件的技术。它利用事件冒泡机制,在父元素上捕获并处理子元素触发的事件。

使用事件代理的好处是什么

  • 回答:事件代理具有以下好处:
    • 减少事件处理程序的数量,提高性能和内存占用;
    • 动态添加的子元素也能响应事件;
    • 方便管理和维护代码结构。

如何实现事件代理

  • 回答:要实现事件代理,需要选择一个共同的父元素作为事件监听者,并将事件处理程序绑定到该父元素上。当事件触发时,通过事件对象中的event.target属性获取触发事件的具体子元素,然后根据子元素进行相应的逻辑操作。

在事件代理中,什么是事件冒泡(Event Bubbling)

  • 回答:事件冒泡是指在DOM树中,事件从触发的最内层元素逐级向上传播到触发的最外层父元素的过程。通过事件冒泡,可以使事件逐级传递至父元素,从而实现事件代理。

有没有什么情况下不适合使用事件代理

  • 回答:在某些特定情况下,事件代理可能不适合使用,例如:
    • 当需要给每个子元素绑定不同的事件处理程序时;
    • 在性能要求极高,并且子元素数量庞大的情况下,直接绑定事件处理程序可能更为高效。

3、谈谈This对象的理解

this总是指向函数的直接调用者(而非间接调用者)

如果有new关键字,this指向new出来的那个对象

在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window

4、new操作符具体干了什么

new操作符的主要作用是创建一个新的实例对象。它通过以下步骤实现:

  • 创建一个空对象。

  • 将空对象的__proto__属性指向构造函数的原型对象。

  • 执行构造函数,并将this指向新创建的对象。

  • 如果构造函数没有返回其他对象,则返回新创建的对象。

new操作符和普通函数调用的区别

  • new操作符创建一个新的实例对象,而普通函数调用不会创建新的对象。
  • 使用new操作符调用构造函数时,内部的this指向新创建的实例对象;而普通函数调用时,this指向调用该函数的对象(或者全局对象)。
  • new操作符会自动分配内存空间来存储新对象,而普通函数调用则直接在当前上下文中执行。

new操作符在创建实例对象时可以传递参数

使用new操作符创建对象时,构造函数内部如果返回了其他对象,new操作符返回的就是这个对象,而不再是由new自动创建的新对象

function Person(name) {
  this.name = name;
  return { greeting: "Hello" };
}

var person1 = new Person("Alice");
console.log(person1.greeting);  // 输出 "Hello"

5、null,undefined 的区别

null和undefined是JavaScript中的两个特殊值,用于表示缺失或未定义的状态。

  1. null:表示一个空值或者没有对象指针的值。
    • 当变量被赋值为null时,表示该变量的值为空。
    • null是一个关键字,可以显式地将变量设置为null。
    • 在条件判断中,null会被视为假值。
  2. undefined:表示一个变量已经声明但尚未被赋值,或者访问对象属性不存在的值。
    • 当变量被声明但未被赋值时,默认的初始值为undefined。
    • 如果函数没有返回值,默认返回undefined。
    • 访问对象不存在的属性时,会返回undefined。
    • 在条件判断中,undefined会被视为假值。

区别:

  • null是JavaScript的关键字,可以主动赋值给变量;而undefined代表变量尚未赋值或对象属性不存在。
  • null表示明确的空值,而undefined表示未定义或缺失值。
  • 在比较运算符(例如 == 和 ===)中,null和undefined相等,但与其他任何值都不相等。

在实际使用中,null通常由程序员显式地赋值,用于表示空值,而undefined则更多地表示语言本身隐含的某种含义,如变量未赋值或对象属性不存在。

6、javascript 代码中的"use strict";是什么意思

use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为

限制:

  • 变量必须声明后再使用

  • 函数的参数不能有同名属性

  • 不能使用with语句

  • 禁止this指向window

使用严格模式的好处包括:

  1. 变量必须声明:在严格模式下,变量必须通过varletconst关键字显式声明,否则将抛出一个引用错误。
  2. 禁止意外的全局变量:在非严格模式下,给未声明的变量赋值会创建一个全局变量。而在严格模式下,这样的赋值操作会抛出一个引用错误。
  3. 消除this指向全局对象:在严格模式下,函数内部的this不再指向全局对象。未显式绑定this的函数将获得默认值undefined
  4. 禁止删除变量、函数和函数参数:在严格模式下,使用delete操作符删除变量、函数和函数参数时,将抛出一个语法错误。
  5. 静态绑定的eval()函数作用域:在严格模式下,eval()函数的作用域将在调用位置被限定为当前作用域,而不是全局作用域。
  6. 禁止重复的参数名:在严格模式下,函数的参数名不能重复,否则会引发语法错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值