js基础知识点-复习忘记的

230 阅读2分钟

导语

回顾一下,曾经自己文忘记的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