因此笔者对于原始类型存储位置的理解为:局部变量才是被存储在栈上,全局变量存在静态区域上,其它都存储在堆上 。
当然这个理解是建立的 Chrome 的表现之上的,在不同的浏览器上因为引擎的不同,可能存储的方式还是有所变化的 。
常见考点闭包能考得很多,概念和笔试题都会考 。
概念题就是考考闭包是什么了 。
笔试题的话基本都会结合上异步,比如最常见的:
for (var i = 0; i < 6; i++) {setTimeout(() => {console.log(i)})}
这道题会问输出什么,有哪几种方式可以得到想要的答案?
newnew 操作符可以帮助我们构建出一个实例,并且绑定上 this,内部执行步骤可大概分为以下几步:
- 新生成了一个对象
- 对象连接到构造函数原型上,并绑定 this
- 执行构造函数代码
- 返回新对象
function Test(name) {this.name = nameconsole.log(this) // Test { name: 'yck' }return { age: 26 }}const t = new Test('yck')console.log(t) // { age: 26 }console.log(t.name) // 'undefined'
当在构造函数中返回一个对象时,内部创建出来的新对象就被我们返回的对象所覆盖,所以一般来说构建函数就别返回对象了(返回原始类型不影响) 。常见考点
- new 做了哪些事?
- new 返回不同的类型时会有什么表现?
- 手写 new 的实现过程
- 全局作用域
- 函数作用域
- 块级作用域,ES6 中的 let、const 就可以产生该作用域
一旦我们将这些作用域嵌套起来,就变成了另外一个重要的知识点「作用域链」,也就是 JS 到底是如何访问需要的变量或者函数的 。
首先作用域链是在定义时就被确定下来的,和箭头函数里的 this 一样,后续不会改变,JS 会一层层往上寻找需要的内容 。
其实作用域链这个东西我们在闭包小结中已经看到过它的实体了:[[Scopes]]
图中的 [[Scopes]] 是个数组,作用域的一层层往上寻找就等同于遍历 [[Scopes]] 。
常见考点
- 什么是作用域
- 什么是作用域链
根据上图,原型总结下来的概念为:
- 所有对象都有一个属性 __proto__ 指向一个对象,也就是原型
- 每个对象的原型都可以通过 constructor 找到构造函数,构造函数也可以通过 prototype 找到原型
- 所有函数都可以通过 __proto__ 找到 Function 对象
- 所有对象都可以通过 __proto__ 找到 Object 对象
- 对象之间通过 __proto__ 连接起来,这样称之为原型链 。当前对象上不存在的属性可以通过原型链一层层往上查找,直到顶层 Object 对象,再往上就是 null 了
- 聊聊你理解的原型是什么
class Person {}Person instanceof Function // true
其实在当下都用 ES6 的情况下,ES5 的继承写法已经没啥学习的必要了,但是因为面试还会被问到,所以复习一下还是需要的 。首先来说下 ES5 和 6 继承的区别:
- ES6 继承的子类需要调用 super() 才能拿到子类,ES5 的话是通过 apply 这种绑定的方式
- 类声明不会提升,和 let 这些一致
function Super() {}Super.prototype.getNumber = function() {return 1}function Sub() {}Sub.prototype = Object.create(Super.prototype, {constructor: {value: Sub,enumerable: false,writable: true,configurable: true}})let s = new Sub()s.getNumber()
常见考点
推荐阅读
- 不爱跳槽的程序员集中在8-17k,揭晓中国开发者的真实现状
- 大型Git仓库的部分克隆
- 数据仓库、数据集市、数据湖、数据中台这些概念,终于整明白了
- 银行数据仓库的系统架构是什么?看这篇足矣
- 数据仓库构建流程
- 长安|性价比超宏光MINI!长安奔奔E-Star国民版暂停收取订单:产能受限
- 数据仓库组件:Hive环境搭建和基础用法
- 10分钟自建企业级Docker镜像仓库!这个开源项目太顶了
- 一文带你搭建本地YUM仓库
- 开发框架搭建考量