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中的两个特殊值,用于表示缺失或未定义的状态。
- null:表示一个空值或者没有对象指针的值。
- 当变量被赋值为null时,表示该变量的值为空。
- null是一个关键字,可以显式地将变量设置为null。
- 在条件判断中,null会被视为假值。
- 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
使用严格模式的好处包括:
- 变量必须声明:在严格模式下,变量必须通过
var
、let
或const
关键字显式声明,否则将抛出一个引用错误。 - 禁止意外的全局变量:在非严格模式下,给未声明的变量赋值会创建一个全局变量。而在严格模式下,这样的赋值操作会抛出一个引用错误。
- 消除
this
指向全局对象:在严格模式下,函数内部的this
不再指向全局对象。未显式绑定this
的函数将获得默认值undefined
。 - 禁止删除变量、函数和函数参数:在严格模式下,使用
delete
操作符删除变量、函数和函数参数时,将抛出一个语法错误。 - 静态绑定的
eval()
函数作用域:在严格模式下,eval()
函数的作用域将在调用位置被限定为当前作用域,而不是全局作用域。 - 禁止重复的参数名:在严格模式下,函数的参数名不能重复,否则会引发语法错误。