Skip to content

语法和数据类型

声明

变量声明

  • var:声明一个变量,可选初始化一个值。
  • let:声明一个块作用域的局部变量,可选初始化一个值。
  • const:声明一个块作用域的只读常量。

作用域

  • 在函数之外声明的变量,叫做全局变量,因为它可被当前文档中的任何其他代码所访问。
  • 在函数内部声明的变量,叫做局部变量,因为它只能在当前函数的内部访问。
  • ES6 之前的 JavaScript 没有语句块作用域;相反,语句块中声明的变量将成为语句块所在函数(或全局作用域)的局部变量。

变量提升

  • 在 ES6 中,let 和 const 同样会被提升变量到代码块的顶部但是不会被赋予初始值
  • 在变量声明之前引用这个变量,将抛出引用错误(ReferenceError)
  • 这个变量将从代码块一开始的时候就处在一个“暂时性死区”,直到这个变量被声明为止

函数提升

对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升

全局变量

  • 全局变量是全局对象的属性。在网页中,(译注:缺省的)全局对象是 window ,所以可以用形如 window.variable 的语法来设置和访问全局变量。
  • 可以通过指定 window 或 frame 的名字,在当前 window 或 frame 访问另一个 window 或 frame 中声明的变量。例如,在文档里声明一个叫 phoneNumber 的变量,那么可以在子框架里使用 parent.phoneNumber 的方式来引用它。

常量

  • 可以用关键字 const 创建一个只读的常量。常量标识符的命名规则和变量相同:必须以字母、下划线(_)或美元符号($)开头并可以包含有字母、数字或下划线。
  • 常量不可以通过重新赋值改变其值,也不可以在代码运行时重新声明。它必须被初始化为某个值。
  • 常量的作用域规则与 let 块级作用域变量相同。若省略 const 关键字,则该标识符将被视为变量。
  • 在同一作用域中,不能使用与变量名或函数名相同的名字来命名常量。

总结

1.png

数据结构和类型

8 种数据类型

  • 7 种基本数据类型:
    • 布尔值(Boolean):有 2 个值分别是:true 和 false。
    • null:一个表明 null 值的特殊关键字。JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同。
    • undefined:和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。
    • 数字(Number):整数或浮点数,例如: 42 或者 3.14159。
    • 任意精度的整数(BigInt):可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
    • 字符串(String):字符串是一串表示文本值的字符序列,例如:"Howdy"。
    • 代表(Symbol,在 ES6 中新添加的类型)。一种实例是唯一且不可改变的数据类型。
  • 引用数据类型:
    • 对象(Object)。

存储位置

  • 栈:存放基本数据类型(UndefinedNullBooleanNumberStringSymbolBigInt

提示

  • 基本数据类型是直接存储在栈 stack 中的简单数据段,占据空间小、大小固定,属于被频繁使用的数据,因此放入栈中存储(在数据结构中,栈中数据的存储方式为先进后出)
  • 栈是一个优先队列,是按优先级进行排序的,优先级可以按照大小来规定
  • 堆:存放引用数据类型(对象数组函数

提示

  • 引用数据类型是存储在堆 heap 中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;
  • 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体
  • 在操作系统中,内存被分为栈区和堆区

提示

  • 栈区:内存由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈
  • 堆区:内存一般由开发者分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收

字面量