导语
回顾一下,曾经自己文忘记的js基础
变量类型
js的变量类型有:
- number
- string
- boolean
- null
- undefined
- symbol
- object
typeof
typeof 无法判断 数组 , null
typeof null === object // 无效
深拷贝
//定义检测数据类型的功能函数
function checkedType(target) {
return Object.prototype.toString.call(target).slice(8, -1)
}
//实现深度克隆---对象/数组
function clone(target) {
//判断拷贝的数据类型
//初始化变量result 成为最终克隆的数据
let result,
targetType = checkedType(target)
if (targetType === 'Object') {
result = {}
} else if (targetType === 'Array') {
result = []
} else {
return target
}
//遍历目标数据
for (let i in target) {
//获取遍历数据结构的每一项值。
let value = target[i]
//判断目标结构里的每一值是否存在对象/数组
if (checkedType(value) === 'Object' || checkedType(value) === 'Array') {
//对象/数组里嵌套了对象/数组
//继续遍历获取到value值
result[i] = clone(value)
} else {
//获取到value值是基本的数据类型或者是函数。
result[i] = value
}
}
return result
}
作用域与作用域链
作用域大概分为3中类型:
- 全局作用域
- 函数作用域
- 块级作用域
作用域最大的用处就是隔离变量,不同作用域下同名变量不会冲突
在函数自己的作用域中未能找到的变量,就会向父级作用域寻找,如果父级也没有,再依次向上寻找, 最终找到全局作用域,这就是作用域链
闭包
闭包是一个函数可以访问另一个函数中的变量,这就是闭包函数。
闭包的作用:
- 使用闭包可以访问另一个函数中的变量
- 使得变量长期保存在内存中
缺点:
- 容易到内存泄漏 闭包使用完后,要立即释放资源,将引用变量指向null
箭头函数this
箭头函数没有this, 其this指向看外层是否有函数, 如果有,外层函数的this就箭头函数的this, 如果没有,则this 指向 window
原型和原型链
原型: 在js中原型是一个 prototype对象, 用于表示类型之间的关系
原型链: js万物皆对象, 在js中是通过prototype 对象指向父类对象, 直到指向Object对象为止, 这样就形成了原型指向的链条,原型链。
当我们试图得到一个对象的某个属性的时候, 如果这个对象本身没有这个属性, 那么会去它的 __proto__ (即构造函数的prototype) 中寻找。 如果一直找到最上层都没有找到, 那么就没有找到, 返回undefined.
function say() {};
console.log(say.__proto__ === Function.prototype) // true
console.log(Function.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true