目录
语法
规范
首先在JavaScript标准语法中是严格区分大小写的,无论是变量,标识符,还是函数名,举例来说就是test和Test是两个不同的变量名。
标识符是用来命名变量,函数,属性、或函数参数名称的。
标识符命名标准:
1、第一个字符不能是数字,可以是字母,下划线(_),或美元符号($);
2、剩下的其他字符可以是字母、下划线、美元符号或数字;
3、使用驼峰命名法进行命名。
严格模式
严格模式是一种不同的JavaScript解析和执行模型,代码中一些不规范的写法会在这种模式下被处理,对于不安全的活动命令会抛出错误,如果要对整个脚本启用严格模式需要在脚本开头加上:
‘use strict’。
这是一个预处理指令,任何JavaScript引擎看到都会切换到严格模式。
也可以对单个函数进行使用在函数的开头添加‘use strict’。
关键字与保留字
关键字通常都有特殊含义,不能用作标识符或属性名。
关键字如下:
break、do、in、typeof、case、else、
instanceof、var、catch、export、new、
void、class、extends、return、while、
const、finally、super、with、continue、
for、switch、yield、debugger、function、
this、default、if、throw、delete、import、
try
保留字同样也不能用作标识符或属性名,虽然保留字在语言中没有特定的用途但他们是保留给将来做关键字使用的。
确保将来语言扩展时不会与用户定义的标识符冲突。
始终保留:
enum
严格模式下保留:
implement、package、public、interface、protected、static、let、private
模块代码中的保留字:
await
变量
JavaScript标准语法中变量是松散类型的,变量可以用于保存各种类型的数据,声明变量的关键字有三种:var、let和const。
var可以在任何版本中使用,而const和let只能在es6以及更晚的版本中使用。
var关键字
使用var操作符定义变量可以通过var 后接变量名的方式:
var message;
未保存任何值的情况下会默认保存undefined。
当我们定义指定值后可以对值进行修改但并不推荐改变数据类型。
例如:
var message = '你好';
message = 100;
var定义的变量会成为一个局部变量,例如我们在函数内使用var定义一个变量在函数内部可以调用,当退出这个函数时不能再进行调用。当我们调用这个函数时会创建一个变量并给他赋值,在调用之后这个变量就会被销毁。
在函数中使用var定义的变量会自动提升至函数的顶部,同时使用var可以对变量进行重复声明。
let声明
let和var的作用差不多两者的区别在于let声明的是块级作用域,var声明的是函数作用域。
因为块级作用域是函数作用域的子集,因此适用于var的作用域限制同样也适用于let,
当我们在if中去使用let定义一个变量时在if块级的外部不能进行调用。
if(true){
let c = 10
}
console.log(c)//c is not defined
同时let也不允许进行重复声明,可以在嵌套的不同块作用域中声明同样的变量。
var与let的另一个重要区别在于暂时性死区。
使用let定义的变量不会进行变量提升,因此当我们在使用var定义变量之前调用变量不会报错,而是用let在定义变量之前调用就会报错。
与var不同,使用let在全局作用域中声明的变量不会成为window对象,但是let的声明仍然是在全局作用域中发生的相应的变量会在页面的声明周期中存续,所以不能进行重复声明,而var声明变量时由于变量会进行提升所以JavaScript引擎会自动将多余的声明在作用域顶部合并为一个声明。
const声明
const的行为和let基本相同,const在声明变量时必须同时初始化变量,同时const是只读的,不能进行修改。
const声明的限制只适用于他指向的变量的引用,如果const声明的是一个对象那么我们可以改变对象中的属性。
let和var和const的区别:
1. var
var
是 JavaScript 中最早出现的变量声明方式。
特性
-
作用域:
- 函数作用域:
var
声明的变量作用域是函数级别的,不受块级作用域限制。 - 即使在
if
或for
块中声明,变量仍然是全局或函数作用域的。
- 函数作用域:
-
变量提升:
var
声明的变量会被提升到其作用域的顶部(变量声明提升),但值不会提升。- 在代码执行之前,变量会被声明为
undefined
。
-
允许重复声明:
- 同一作用域内可以用
var
重复声明变量。
- 同一作用域内可以用
-
可重新赋值:
- 可以修改已声明变量的值。
示例
console.log(a); // 输出 undefined(变量提升)
var a = 10;
if (true)
{ var b = 20; // b 是函数作用域或全局作用域 }
console.log(b); // 输出 20(即使在块外)
2. let
let
是在 ES6 引入的一种变量声明方式,用来解决 var
的一些问题。
特性
-
作用域:
- 块作用域:
let
声明的变量只在其声明的块或语句中有效。
- 块作用域:
-
变量提升:
let
声明的变量也会被提升,但不会被初始化。在访问它们之前会抛出ReferenceError
(暂时性死区)。
-
不允许重复声明:
- 同一作用域内,不能用
let
声明同名变量。
- 同一作用域内,不能用
-
可重新赋值:
- 可以修改已声明变量的值。
示例
if (true)
{ let c = 30; // c 仅在此块内有效 console.log(c); // 输出 30 }
console.log(c); // ReferenceError: c is not defined
let d = 40;
let d = 50; // SyntaxError: Identifier 'd' has already been declared
3. const
const
也是 ES6 引入的,用于声明常量。
特性
-
作用域:
- 同
let
,const
具有块作用域。
- 同
-
变量提升:
- 同
let
,const
也会有暂时性死区。
- 同
-
不允许重复声明:
- 同一作用域内,不能用
const
声明同名变量。
- 同一作用域内,不能用
-
不可重新赋值:
- 声明时必须初始化值,且不能重新赋值。
- 如果是引用类型(如对象或数组),对象的属性或数组的内容可以改变,但引用地址不可变。
示例
const e = 50;
e = 60; // TypeError: Assignment to constant variable
const f = { name: "John" };
f.name = "Doe"; // 可以修改对象的属性
console.log(f); // 输出 { name: "Doe" }
const g; // SyntaxError: Missing initializer in const declaration
主要区别总结
特性 | var | let | const |
---|---|---|---|
作用域 | 函数作用域 | 块作用域 | 块作用域 |
变量提升 | 是,初始化为 undefined | 是,但存在暂时性死区 | 是,但存在暂时性死区 |
重复声明 | 可以 | 不可以 | 不可以 |
重新赋值 | 可以 | 可以 | 不可以(但引用类型可变) |
声明时初始化 | 可选 | 可选 | 必须 |
适用场景
var
:在现代开发中应尽量避免使用,因为其作用域和变量提升特性容易引起 bug。let
:适合声明会变化的变量,尤其是局部变量。const
:适合声明不会变化的常量,或引用类型的变量(如对象或数组)。使用时能增强代码的可读性和维护性。
数据类型
ES6中有六种简单数据类型(原始类型):Undefined、Number、Null、Boolean、
String、Symbol(符号)。还有一种复杂数据类型Object
在Number数据类型中分为整数和浮点数,其中浮点数中有一个常见的问题:
0.1+0.2得到的不是0.3而是0.300 000 000 000 000 04但是用0.15+0.15或0.05+0.25就没有类似问题。
这是因为使用了IEEE745数值,在IEEE745的标准下,浮点数是用二进制表示的,但是并不是所有的十进制小数都能用有限的二进制表示0.1使用二进制表示就是一个无限循环小数在计算机中保留有限的位数,从而导致误差。
ps:后续的jJavaScript知识会陆续进行发布