本章简要回顾了到目前为止我们所学的 JavaScript 特性,并特别关注其中一些细微之处。
代码结构
语句以分号 ;
作为分隔符:
alert('Hello'); alert('World');
通常,换行符也被视为分隔符,因此换行也可以起作用:
alert('Hello') alert('World')
这叫做“自动分号插入”。有时它不起作用,例如:
alert("There will be an error after this message") [1, 2].forEach(alert)
大多数代码风格指南都一致认为,我们应该在每个语句后加上分号。
但在代码块 {...}
后,以及像循环这样的语法结构后,分号并不是必需的:
function f() { // no semicolon needed after function declaration } for(;;) { // no semicolon needed after the loop }
…但是即使我们在某处加上“额外”的分号,也不会导致错误。它会被忽略。
详情请看:Javascript 代码结构
严格模式
为了完全启用现代 JavaScript 的所有特性,我们应该在脚本开头添加 "use strict"
。
'use strict'; ...
该指令必须位于脚本的顶部或函数体的开头。
没有 "use strict"
,代码仍然能正常工作,但某些特性会以旧版的“兼容”方式运行。我们通常更倾向于使用现代最新技术。
一些现代的语言特性(如我们将来学习的类)会隐式启用严格模式。
详情请看: JavaScript 严格模式
变量和数据类型
可以使用以下方式声明:
-
let
-
const
(常量,不能被改变) -
var
(旧式声明,稍后会介绍)
变量名可以包含:
-
字母和数字,但第一个字符不能是数字。
-
字符
$
和_
是正常的,和字母一样使用。 -
非拉丁字母和象形文字也可以使用,但通常不常见。
变量是动态类型的。它们可以存储任何类型的值:
let x = 5; x = "John";
有 8 种数据类型:
-
number
:用于浮动点数和整数数字, -
bigint
:用于任意长度的整数, -
string
:用于字符串, -
boolean
:用于逻辑值:true
/false
, -
null
:一个具有单一值null
的类型,表示“空”或“不存在”, -
undefined
:一个具有单一值undefined
的类型,表示“未赋值”, -
object
和symbol
:用于复杂数据结构和唯一标识符,我们还没有学习这两个类型。
typeof
运算符返回一个值的类型,但有两个例外:
typeof null == "object" // error in the language typeof function(){} == "function" // functions are treated specially
交互
我们使用浏览器作为工作环境,因此基本的界面交互函数包括:
-
prompt(question, [default])
提出一个问题,并返回访客输入的内容,如果点击“取消”则返回null
。 -
confirm(question)
提出一个问题,并提示选择“确定”或“取消”,返回的结果是true
或false
。 -
alert(message)
显示一条消息。
所有这些函数都是模态的:它们会暂停代码执行,并阻止用户与页面其他部分交互,直到作出回应。
例如:
let userName = prompt("Your name?", "Alice"); let isTeaWanted = confirm("Do you want some tea?"); alert( "Visitor: " + userName ); // Alice alert( "Tea wanted: " + isTeaWanted ); // true
详情请看:浏览器交互函数:alert、prompt、confirm
JavaScript 支持以下运算符:
算术运算符
-
二元加号
+
用于连接字符串。如果其中一个操作数是字符串,另一个也会被自动转换为字符串:alert( '1' + 2 ); // '12', string alert( 1 + '2' ); // '12', string
赋值运算符
-
有简单赋值:
a = b
,也有复合赋值,如a *= 2
。
位运算运算符
-
位运算符在最低位的 32 位整数上工作:需要时可以查阅文档了解详情。
条件运算符
-
唯一有三个参数的运算符:
cond ? resultA : resultB
。如果cond
为真,返回resultA
,否则返回resultB
。
逻辑运算符
-
逻辑与
&&
和逻辑或||
进行短路评估,返回停止运算处的值(不一定是true/false
)。 -
逻辑非
!
将操作数转换为布尔类型,并返回其相反值。
空值合并运算符
-
??
运算符用于从一系列变量中选择一个已定义的值。a ?? b
的结果是a
,除非a
是null
或undefined
,这种情况下返回b
。
比较运算符
-
使用相等检查
==
时,如果比较不同类型的值,会将它们转换为数字进行比较(null
和undefined
除外,它们只彼此相等,且与其他值都不相等)。所以下面是相等的:alert( 0 == false ); // true alert( 0 == '' ); // true
其他比较运算
-
其他比较也会将值转换为数字。
-
严格相等运算符
===
不进行类型转换:不同类型总是被认为是不同的值。 -
null
和undefined
是特殊值:它们之间==
相等,但与其他任何值都不相等。 -
大小比较在比较字符串时是逐字符进行的,对于其他类型,会先转换为数字再比较。
其他运算符
循环
我们学习了三种类型的循环:
// 1 while (condition) { ... } // 2 do { ... } while (condition); // 3 for(let i = 0; i < 10; i++) { ... }
详情请看:javascript switch语句
函数
我们学习了在 JavaScript 中创建函数的三种方式:
-
函数声明(Function Declaration):在主代码流程中声明的函数。
function sum(a, b) { let result = a + b; return result; }
- 函数表达式(Function Expression):在表达式上下文中创建的函数。
let sum = function(a, b) { let result = a + b; return result; };
箭头函数:
// expression on the right side let sum = (a, b) => a + b; // or multi-line syntax with { ... }, need return here: let sum = (a, b) => { // ... return a + b; } // without arguments let sayHi = () => alert("Hello"); // with a single argument let double = n => n * 2;
-
函数可以有局部变量:这些变量在函数体内或参数列表中声明,仅在函数内部可见。
-
参数可以有默认值:例如
function sum(a = 1, b = 2) {...}
。 -
函数总是会返回某个值。如果没有
return
语句,则返回undefined
。
更多内容
这只是 JavaScript 特性的一小部分总结。到目前为止,我们只学习了基础知识。在教程的后续部分,你将会学到更多 JavaScript 的特殊用法和高级特性。