码农之家

js常见错误总结

全局对象和全局变量对象

全局对象GO

全局变量对象VO

全局执行上下文

带var

不带var

输出顺序

私有执行上下文

带var

不带var

作用域和作用域链

作用域

作用域链

函数执行步骤

  1. 创建私有上下文(有存放私有变量的变量对象AO)
  2. 进栈执行(会把全局上下文压缩到底部)
  3. 初始化作用域链scopeChain
  4. 初始化this指向
  5. 形参赋值(包含初始化arguments)
  6. 变量提升
  7. 代码执行
  8. 执行完可能会出栈(也可能不出栈)

内存的形式

堆内存

栈内存

内存释放机制

var与let

重复声明

window属性

let声明的变量仅仅是全局变量,和GO没关系

var声明的变量即是全局变量,也相当于给GO(window)设置了一个属性,而且两者建立映射机制

暂时性死区

构造函数执行步骤

  1. 初始化作用域链
  2. 形参赋值
  3. 变量提升
  4. 首先会在当前上下文中,创建一个对象(这个对象就是当前类的实例) – 浏览器默认多做的事情
  5. 让当前上下文中的this指向新创建的对象 – 浏览器默认多做的事情
  6. 代码执行
  7. 代码执行完,如果没有设置return浏览器默认会把新创建的实例对象返回 – 浏览器默认多做的事情

原型和原型链

原型链查找机制

寄生组合式继承

function Parent() {
  this.x = 100
}
Parent.prototype.getX = function getX() {
  return this.x
}
function Child() {
  Parent.call(this)
  this.y = 200
}
Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child
Child.prototype.getY = function getY() {
  return this.y
}

let c1 = new Child

检测数据类型区别

typeof

instanceof

constructor

Object.prototype.toString.call()

二叉树

先序遍历

function preOrder(node){
  if(!(node==null)){
    divList.push(node);
    preOrder(node.firstElementChild);
    preOrder(node.lastElementChild);
  }
}

中序遍历

function inOrder(node) {
  if (!(node == null)) {
    inOrder(node.firstElementChild);
    divList.push(node);
    inOrder(node.lastElementChild);
  }
}

后序遍历

function postOrder(node) {
  if (!(node == null)) {
    postOrder(node.firstElementChild);
    postOrder(node.lastElementChild);
    divList.push(node);
  }
}

检查对称二叉树

function isTreeSymmetric(t) {
    if (!t){
        return true
    }
    return isTreeEqual(t.left, t.right)
}

isTreeEqual = function(x, y) {
    if (!x && !y){
        return true
    }
    if (!x || !y){
        return false
    }
    if (x.value === y.value){
        return isTreeEqual(x.left, y.right) && isTreeEqual(x.right, y.left)
    } else {
        return false
    }
}