JavaScript学习笔记—字面量、变量、常量、标识符
1. 字面量
- 就是一个值,其含义就是它的字面意思
- 比如:1 2 3 4 100 "hello" true null ......
- 在js中所有字面量都可以直接使用,但是直接使用字面量并不方便
// 字面量
console.log(123);
console.log("hello");
console.log(true);
console.log(null);
2. 变量
- 变量可以“存储”字面量
- 并且变量中存储的字面量可以随意修改
- 通过变量可以对字面量进行描述,并且变量比较方便修改
// 声明一个变量
let age;
// 变量赋值
age = 80;
age = 81;
console.log(age);
变量的使用:
- 声明变量 --> let 变量名
- 变量赋值 --> a = xx;
- 声明和赋值同时进行 --> let 变量名 = 值;
// 声明变量
let a;
let b, c, d;
console.log(a); // undefined
// 变量赋值
a = 10;
a = "hello";
a = true;
console.log(a); // true
// 声明和赋值同时进行
let i = 100;
console.log(i); // 100
3. 常量
- 使用const声明常量,常量只能在初始化时对其赋值一次,一旦赋值则无法修改,重复赋值会报错
- 除了常规的常量外(如PI),还经常使用const声明用来存储对象的变量,这样可以避免变量被意外修改
const PI = 3.1415926;
console.log(PI); // 3.1415926
const a = 20;
a = 30; // Uncaught TypeError: Assignment to constant variable.
4. 标识符
- JS中所有的可以自主命名的内容都可以认为是标识符(如:变量名,函数名,类名......)
- 标识符需要遵循如下的命名规范:
(1)只能含有字母、数字、下划线、_和$,且不能以数字开头
(2)不能是JS中的关键字和保留字,也不建议使用内置的函数或类名作为变量名
(3)使用固定的命名方式:- 常规,驼峰命名法:首字母小写,单词开头大写。例如:maxlength -> maxLength
- 类名,大驼峰命名法:首字母大写,单词开头大写。例如:maxlength -> MaxLength
- 常量,全都使用大写,字母使用_分开。例如:maxlength -> MAX_LENGTH
let a = 10;
let abc123 = 22;
let _abc = 33;
let $bcd = 44;
5. 变量存储的是内存地址
注意:本文中的内存结构都是简化过的内存结构,实际内存结构要更复杂一些
6. 内存
程序运行中的所有数据都要存储到内存中,JavaScript中使用的变量和字面量也不例外。变量在内存中的结构类似于一个表格,表格中一列是变量的名字,一列是变量的值,像下面的一段代码,在内存中的结构大概是下图的样子:
let a;
let b;
let c;
由于还没有为变量赋值,所以值的位置是空的。假如是这样一段代码呢?
let a = 10
let b = "hello"
let c = true
a、b、c三个变量我们已经知道在哪存储了,那么10、”hello”、true这些字面量要存储在哪呢?最容易想到的是字面量可以存储到变量的第二个列中,像是这样的:
但是很可惜这错误的,因为这种结构JavaScript无法实现或很难实现。为什么呢?首先10、”hello”、true这些字面量,也需要占用内存,并且很明显它们占用内存的大小是不同的。而变量一旦创建其内存大小就已经确定了,那么值那一列要留多大的内存才能存储这些字面量呢?内存留小了,大的字面量放不下。内存留大了,小的字面量用不完,会浪费。并且我们也不可能设置一个固定的空间使其可以容纳任意的字面量,这是做不到的。
实际上,每当我们创建了一个字面量时,JavaScript就会为其在内存中开辟出一块新的空间,专门用来存储这个字面量,这块空间将刚好容纳下该数据。每一个块内存空间都会有一个唯一的内存地址,变量只需存储内存地址,即可和字面量产生关联。例如let a = 10这样一行代码,它的内存结构是这样的:
当我们访问一个变量时,解析器会先找到对应的变量,再通过变量中存储的内存地址找到对应的字面量。
相较于直接存储字面量来说,内存地址的大小是固定的。此时解析器只需为变量分配一个和内存地大小一样的空间,即可确保一个变量可以存储任意类型的值。