进阶系列

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    堆栈的内容和执行顺序我就不说了,前面两篇已经介绍过了。

    但是今天补充一个知识点:某些情况下,调用堆栈中函数调用的数量超出了调用堆栈的实际大小,浏览器会抛出一个错误终止运行。

    对于下面的递归就会无限制的执行下去,直到超出调用堆栈的实际大小,这个是浏览器定义的。

    function foo() {
        foo();
    }
    foo();

    现在正式开始今天的主题,内存空间详解

    栈数据结构

    栈的结构就是后进先出

  • 本期的主题是作用域闭包,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    作用域指的是一个变量和函数的作用范围,JS中函数内声明的所有变量在函数体内始终是可见的,在ES6前有全局作用域和局部作用域,但是没有块级作用域(catch只在其内部生效),局部变量的优先级高于全局变量。

    作用域

    变量提升
    var scope="global";
    function scopeTest(){
        console.log(scope);
        var scope="local"  
    }
  • 定义

    new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 ——(来自于MDN)

    举个栗子

    function Car(color) {
        this.color = color;
    }
    Car.prototype.start = function() {
        console.log(this.color + " car start");
    }
    
    var car = new Car("black");
    car.color; // 访问构造函数里的属性
    // black
    
    car.start(); // 访问原型里的属性
    // black car start

    可以

  • 引言

    上篇文章介绍了构造函数、原型和原型链的关系,并且说明了 prototype[[Prototype]]__proto__ 之间的区别,今天这篇文章用图解的方式向大家介绍原型链及其继承方案,在介绍原型链继承的过程中讲解原型链运作机制以及属性遮蔽等知识。

    建议阅读上篇文章后再来阅读本文,链接:【进阶5-1期】重新认识构造函数、原型和原型链

    有什么想法或者意见都可以在评论区留言。下图是本文的思维导图,高清思维导图和更多文章请看我的 Github。

    5-2

    原型链

    48185513-25833c00-e370-11e8-9939-678da278704d

    上篇文章中我们介绍了原型链的概念,即每个对象拥有一个原型对象,通过 __proto__ 指针指向上一个原型 ,并从中继承方法和属

  • 引言

    上篇文章详细介绍了浅拷贝 Object.assign,并对其进行了模拟实现,在实现的过程中,介绍了很多基础知识。今天这篇文章我们来看看一道必会面试题,即如何实现一个深拷贝。本文会详细介绍对象、数组、循环引用、引用丢失、Symbol 和递归爆栈等情况下的深拷贝实践,欢迎阅读。

    第一步:简单实现

    其实深拷贝可以拆分成 2 步,浅拷贝 + 递归,浅拷贝时判断属性值是否是对象,如果是对象就进行递归操作,两个一结合就实现了深拷贝。

    根据上篇文章内容,我们可以写出简单浅拷贝代码如下。

    // 木易杨
    function cloneShallow(source) {
        var target = {}