JavaScript 进阶
参考前端学习文档
let const var
var | let | const | |
---|---|---|---|
是否有块级作用域 | × | ✔ | ✔ |
是否存在变量提升 | ✔ | × | × |
是否添加全局属性 | ✔ | × | × |
能否重复声明变量 | ✔ | × | × |
是否存在暂时性死区 | × | ✔ | ✔ |
是否必须设置初始值 | × | × | ✔ |
能否改变指针指向 | ✔ | ✔ | × |
作用域和作用域链
作用域
作用域是在程序运行时代码中的某些特定部分中变量、函数和对象的可访问性
作用域分类
作用域又分为全局作用域
和局部作用域
。在 ES6 之前,局部作用域只包含了函数作用域
,ES6 的到来为我们提供了 块级作用域
(由一对花括号包裹),可以通过新增命令 let 和 const 来实现
作用域链
概念: 多个作用域对象连续引用形成的链式结构
函数的作用域是在函数定义的时候就被决定了,与函数在哪里被调用无关
原型和原型链
在 JavaScript 中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象, 这个对象包含了可以由该构造函数的所有实例共享的属性和方法。
当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念
图片来源与网络
Person.prototype = {
getName: function () {},
}
var p = new Person('hello')
p.constructor = Person
console.log(p.__proto__ === Person.prototype) // true
console.log(p.__proto__ === p.constructor.prototype) // true
p.__proto__ // Person.prototype
Person.prototype.__proto__ // Object.prototype
p.__proto__.__proto__ //Object.prototype
p.__proto__.constructor.prototype.__proto__ // Object.prototype
Person.prototype.constructor.prototype.__proto__ // Object.prototype
p1.__proto__.constructor // Person
Person.prototype.constructor // Person
js空值合并运算符(??)
当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
0 || 3 // 返回3
0 ?? 3 // 返回0
js