JS相关
1.数据类型
定义:JavaScript
是一门有着动态类型的动态语言,也是一门弱类型语言。
原始类型:
null
undefined
string
number
boolean
symbol
bigint
Object
类型(引用类型):
Date
RegExp
Array
Function
Map、Set、WeakMap、WeakSet
原始类型和引用类型的地址存放在栈中,引用数据存放在堆中。
2.深拷贝
一般来说拷贝不涉及函数类型的拷贝
Object.prototype.clone = function () {
const cloneObj = new this.constructor();
const visited = new WeakMap();
function deepClone(value) {
if (value !== Object(value)) {
return value;
}
if (visited.has(value)) {
return visited.get(value);
}
let objClone;
if (value instanceof Date) {
objClone = new Date(value);
} else if (value instanceof RegExp) {
objClone = new RegExp(value);
} else if (value === null) {
return null;
} else {
objClone = Array.isArray(value) ? [] : {};
}
visited.set(value, objClone);
for (let key in value) {
if (value.hasOwnProperty(key)) {
objClone[key] = deepClone(value[key]);
}
}
return objClone;
}
// 使用 for...in 替代 for...of
for (let key in this) {
if (this.hasOwnProperty(key)) {
cloneObj[key] = deepClone(this[key]);
}
}
return cloneObj;
}
3.原型链
定义:javascript
使用对象
实现继承。每个对象都有一个原型属性(__proto__
)指向上一级的原型对象,直到原型是null
的对象,这样的链路被称作原型链。
优点:子对象可以复用原型链上的属性和方法
例:
const a = { name: 12 }
const b = Object.create(a)
b.age = 26
// console.log(b)
{age: 26} // b
// console.log(b.__proto__)
{name: 12} // a
// console.log(a.__proto__)
{__defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, __lookupSetter__: ƒ, …} // Object
// console.log(a.__proto__ === Object.prototype)
true
// console.log(a.__proto__.__proto__)
null
图1:示意图
prototype
是函数的原型对象
图2:示意图
可以理解为,原型链上只有对象,函数和原型链的关系是它的prototype
指向了一个原型对象,这个原型对象在原型链中
4.new运算符
在使用new
运算符创建对象时,会发生以下步骤:
- 创建一个空的简单
JavaScript
对象{}
。
- 给
步骤1
创建的对象添加__proto__
属性并指向指向构造函数的prototype
属性。
- 将
步骤1
创建的对象绑定为this
的上下文。
- 如果构造函数返回非原始值,则该返回值成为整个
new
表达式的结果。否则,返回这个新创建的对象。
5.this关键字
定义:
this
是一个动态绑定的关键字。
- 它的值不是由函数定义时决定的,而是由函数调用时的上下文决定的。
- 在不同的场景下,
this
的值会有所不同。
- 在全局上下文中、函数调用
- 非严格模式:
this
指向globalThis
- 严格模式:
this
指向undefined
-
方法调用:当函数作为对象的方法调用时this
指向调用该方法的对象
-
new
运算符调用、构造函数调用:this
指向新创建的对象
-
箭头函数:箭头函数没有this
,它会捕获定义时所在上下文的this
,不会被调用方式所改变
-
使用call
、apply
和 bind
call
和apply
:
call
和apply
直接调用函数,并指定this
。
区别在于参数传递方式:call
接受多个参数,apply
接受一个数组。
bind
:
bind
返回一个新的函数,将this
永久绑定到指定的对象。
6.DOM
事件处理程序
在DOM
事件处理程序中,this
通常指向触发事件的元素。
- 类和实例方法
在类中,
this
指向类的实例。