语言基础1

语法

区分大小写

标识符

  • 第一个字符必须是字母,下划线或美元符号($);
  • 驼峰命令:第一个单词首字母小写,后面每个单词首字母大写;

注释

  • 单行 //
  • 多行 /*... */

严格模式

  • 脚本开头 "use strict"(有引号)
  • 函数体开头
1
2
3
function doSomething() {
"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 improt
enum(将来用)

严格模式

implements package public
interface protected static
let private await
eval arguments

变量

关于javastript变量,等日后更加了解堆栈之后,再做细致探讨

var

1
2
var message;//underfined
console.log(message);
1
2
3
var message_1 = 100
message = "hi"//修改变量类型,合法,但不推荐
console.log(message_1);//hi
var声明作用域(函数作用域)

用var操作符定义的变量会成为包含它的函数的局部变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function test() {
var message_2 = "hello";//局部变量
}
test();
console.log(message_2);
/*
evalmachine.<anonymous>:5
console.log(message_2)
^

ReferenceError: message_2 is not defined
at evalmachine.<anonymous>:5:13
at Script.runInThisContext (node:vm:129:12)
at Object.runInThisContext (node:vm:313:38)
at run ([eval]:1020:15)
at onRunRequest ([eval]:864:18)
at onMessage ([eval]:828:13)
at process.emit (node:events:513:28)
at emit (node:internal/child_process:939:14)
at processTicksAndRejections (node:internal/process/task_queues:84:21)
*/

可以通过省略var,创建全局变量,但不推荐,且严格模式不可用

1
2
3
4
5
function test_1() {
message_3 = "hello";//全局变量
}
test_1();
console.log(message_3);//hello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function test_2() {
"use strict"
message_4 = "hello";
}
test_2();
console.log(message_4);
/*
evalmachine.<anonymous>:3
message_4 = "hello";
^

ReferenceError: message_4 is not defined
at test_2 (evalmachine.<anonymous>:3:15)
at evalmachine.<anonymous>:5:1
at Script.runInThisContext (node:vm:129:12)
at Object.runInThisContext (node:vm:313:38)
at run ([eval]:1020:15)
at onRunRequest ([eval]:864:18)
at onMessage ([eval]:828:13)
at process.emit (node:events:513:28)
at emit (node:internal/child_process:939:14)
at processTicksAndRejections (node:internal/process/task_queues:84:21)
*/

小tip,定义多个变量时,可以在一条语句中用逗号分隔每个变量

1
2
3
var message_5 = "hi",
found = false,
age = 12;

var声明提升,提到函数作用域顶部,多次声明同一变量没有问题,去最新的一个为最终值。

1
2
3
4
5
6
7
function foo_3() {
var age_3 = 12;
var age_3 = 24;
var age_3 = 36;
console.log(age_3);
}
foo_3();

变量提升 foo函数等同于foo_1

1
2
3
4
5
function foo() {
console.log(age_1);
var age_1=12
}
foo();//underfined
1
2
3
4
5
6
function foo_1() {
var age_2;
console.log(age_2);
age_2 = 12;
}
foo_1();//underfined
let声明(块作用域)

为了更好的理解varlet的区别,借用mdn里的例子或许更好的一点。这里的函数作用域和块作用域更加直观一点,关于作用域的探讨,后面再做。

出现这样的结果是因为varlet的作用域不同

let不允许同一个块中出现冗余声明。

注意区分是否在同一块作用域
let没有变量提升
全局声明

var关键词不同,使用let在全局作用域中声明的变量不会成为window对象

条件声明

因为let的作用是块,所以不可能检查前面是否已经使用let声明过同名变量,不能进行条件试声明.

const声明

constlet的行为基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且不能修改const声明变量的值。
const声明的限制只适用于与它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改对象的属性并不违反const的规则。


语言基础1
https://lijusting.top/posts/fd87b51f/
作者
lijusting,
发布于
2022年10月14日
许可协议