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;

image
  由于还没有为变量赋值,所以值的位置是空的。假如是这样一段代码呢?

let a = 10
let b = "hello"
let c = true

  a、b、c三个变量我们已经知道在哪存储了,那么10、”hello”、true这些字面量要存储在哪呢?最容易想到的是字面量可以存储到变量的第二个列中,像是这样的:
image
  但是很可惜这错误的,因为这种结构JavaScript无法实现或很难实现。为什么呢?首先10、”hello”、true这些字面量,也需要占用内存,并且很明显它们占用内存的大小是不同的。而变量一旦创建其内存大小就已经确定了,那么值那一列要留多大的内存才能存储这些字面量呢?内存留小了,大的字面量放不下。内存留大了,小的字面量用不完,会浪费。并且我们也不可能设置一个固定的空间使其可以容纳任意的字面量,这是做不到的。

  实际上,每当我们创建了一个字面量时,JavaScript就会为其在内存中开辟出一块新的空间,专门用来存储这个字面量,这块空间将刚好容纳下该数据。每一个块内存空间都会有一个唯一的内存地址,变量只需存储内存地址,即可和字面量产生关联。例如let a = 10这样一行代码,它的内存结构是这样的:
image
  当我们访问一个变量时,解析器会先找到对应的变量,再通过变量中存储的内存地址找到对应的字面量。

  相较于直接存储字面量来说,内存地址的大小是固定的。此时解析器只需为变量分配一个和内存地大小一样的空间,即可确保一个变量可以存储任意类型的值。

posted @ 2023-01-09 21:09  程序员张3  阅读(141)  评论(0编辑  收藏  举报