一. 标识符
标识符:变量、函数、属性、函数参数的名称。
-
第一个字符必须为一个
字母or$or_【不能以数字开头!!!】 -
区分大小写
-
驼峰命名法
二. 变量声明 【var 、let 、const】
JS中的变量是松散类型,即可以保存任意类型的数据。
(1) var 声明的变量
-
不初始化的话,会保存一个默认值 undefined
-
有函数作用域,即用 var 声明的变量会成为包含它的函数的局部变量,在函数退出时变量就会被销毁!!
-
有变量提升
-
可重复声明(因为有变量提升,所以可以)
-
会成为 window对象的属性
(2)let 声明的变量
-
有块级作用域
-
没有变量提升,会出现 "暂时性死区" ,在
let声明之前的执行瞬间被称为"暂时性死区",在此阶段引用后面声明的变量都会报错!!! -
不可重复声明
-
不会成为 window 对象的属性
-
for循环中的
let声明- <1> 用 let 声明迭代变量不会外泄,而用 var会 for( let i = 0 ; i < 4 ; i++){ } console.log(i) // 报错!!!!未定义 <2> 用 let 声明的迭代变量,js 在后台会为每一个迭代循环声明一个新的迭代变量 for( let i = 0 ; i < 4 ; i++){ setTimeout(()=>{console.log(i)} , 0) } // 0 , 1 , 2 , 3 区: for( var i = 0 ; i < 4 ; i++){ setTimeout(()=>{console.log(i)} , 0) } // 4 , 4 , 4 , 4
(3)const 声明的变量
-
与
let声明相似,声明常量 -
必须初始化!!!
-
声明的变量不能修改!!!
- 不能修改指的是,变量指向的内存地址不能改变!!! - 如果存的是基本类型的数据,即数值、字符串、布尔值那就不可以改变 - 如果存的是引用类型的数据,即数组、对象... ,只要不改变地址,只改变数组里面的数据 是可以的!! // <1> const a = 3; a = 4; console.log(a); // 报错 // <2> const arr = [1,2,3]; arr = []; console.log(arr); // 报错 // <3> const arr = [1,2,3]; arr .push(2); console.log(arr); // [1,2,3,2]
| 是否有变量提升 | 作用域 | 是否可重复定义 | 是否会成为windows对象的属性 | |
|---|---|---|---|---|
| var | 有 | 函数作用域 | 可重复声明 | 会 |
| let | 没有 | 块级作用域 | 不可重复 | 不会 |
| const | 没有 | 块级作用域 | 不可重复 | 不会 |
(4)经典面试题
《1》function foo() {
console.log(a);
a = 1;
}
foo(); // 报错,函数中的 "a" 并没有通过 var 关键字声明,所有不会被存放在 AO 中。【没有变量提升,执行时代码需要一步一步】
// 注意:a = 1 相当于声明了一个全局变量,即会成为 windows 对象的属性!!!
《2》function foo() {
console.log(a);
let a = 1;
}
foo(); // 报错,函数中的 "a" 并没有通过 var 关键字声明,所以不会被存放在 AO 中。
《3》function foo() {
console.log(a);
var a = 1;
}
foo(); // undefined