JavaScript借鉴Java的语法最多,但也受awk,perl和python影响。它是大小写敏感的,使用Unicode字符集。在JavaScript中,语句被称为statements,并用分号分隔(;)。 JavaScript的脚本的源文本从左到右扫描,并转换成由令牌,控制字符,行结束符,注释或空白组成的输入元素序列。ECMAScript中还定义了某些关键字和字面值,并具有分号自动插入(ASI)来结束语句。但是,建议在语句结束时添加分号以避免副作用。

##1.注释(Comments)

注释语法跟C++和许多其他语言相同:

// 单行注释

/* 这是多行注释
   多行注释
*/

/* /* 嵌套注释 */ 语法错误 */

##2.声明(Declarations)

JavaScript有三种声明方式:

var: 声明变量,可选初始化值。

let: 声明块范围局部变量,可选初始化值。

const: 声明一个只读命名常量。

变量在应用程序中,你使用变量来为值命名。变量名称或称为标识符,需要遵守一定的规则。在JavaScript语言中,一个标识符必须以字母、下划线(_)或者美元($)符号开头后续的字符可以包含数字(0-9)。

声明变量可以使用下面两种方式:

  • 使用关键字var。例如,var x = 42。这个语法可以同时用来声明局部和全局变量。

  • 直接赋值。例如,x = 42。这样就声明了一个全局变量并会导致JavaScript编译时产生一个严格警告。因而应避免使用这种非常规格式。

用var或let声明时未赋初值的变量,值会被设定为undefined

var a;
console.log("The value of a is " + a); // logs "The value of a is undefined"
console.log("The value of b is " + b); // throws ReferenceError exception

可以使用undefined来确定变量是否已赋值。以下代码中,变量input未被赋值,因而if条件语句的求值结果是true.

var input;
if (input === undefined) {
	doThis();
} else {
	doThat();
}

undefined值在布尔类型环境中会被当作false。例如,下面的代码将运行函数myFunction,因为数组myArray中的元素未被赋值:

var myArray = new Array();
if (!myArray[0]) myFunction();

数值类型环境中undefined值会被转换为NaN(Not a Number)。当你对一个空变量求值时,空值null在数值环境中会被当作0来对待,而布尔类型环境中会被当作false

var a;
a + 2 = NaN;
var n = null;
console.log(n*32); // log 0

在所有函数之外声明的变量,叫做全局变量,因为它可被当前文档中的其他代码访问。在函数内部声明的变量,叫做局部变量,因为它只能在该函数内部访问。

JavaScript变量的另一特别之处在于,你可以引用稍后声明的变量,而不会引发异常。这一概念称为变量声明提升(hoisting)。JavaScript变量感觉上是被“举起”或提升到了所有函数和语句之前。但是,提升后的变量将返回undefined值,即使在使用或引用后面存在声明和初始化操作,仍将返回undefined值。由于存在变量声明提升,一个函数中所有的var语句应该尽可能放在接近函数顶部的地方。这大大提升了程序的清晰度。

/**
 * Example 1
 */
console.log(x === undefined); // log "true"
var x = 3;

/**
 * Example 2
 */
// will return a value of undefined
var myvar = "my value";
(function() {
	console.log(myvar); // undefined
	var myvar = "local value";
})();

上面的例子也可以写作:

/**
 * Example 1
 */
var x;
console.log(x === undefined); // logs "true"
x = 3;
/**
 * Example 2
 */
var myvar = "my value";
(function() {
	var myvar;
	console.log(myvar); // undefined
	myvar = "local value";
})();

全局变量实际上是全局对象的属性。在网页中,全局对象是 window,所以你可以用形如window.variable的语法来设置和访问全局变量。

关键字const创建一个只读常量。常量标识符的命名规则和变量的相同:必须以字母、下划线或美元符号开头并可以包含有字母、数字或下划线。常量不可以通过赋值改变其值,也不可以在脚本运行时重新声明。常量,包括全局常量,都必须带const关键字,除此之外,常量的作用域规则与 let 块级作用域变量相同。若const关键字被省略了,该标识符将被视为变量。在同一作用域中,不能用与变量或函数同样的名字来命名常量。

##3.数据结构和类型

JavaScript语言拥有下面七种不同的类型的值:

  • 六种是原型的数据类型:

Boolean 布尔值,true和false。

null 一个表明null值的特殊关键字。

undefined 变量未定义时的属性。

Number 表示数字,例如:42或者3.14159。

String 表示字符串,例如:”hello world”。

Symbol 一种数据类型,它的实例是唯一且不可改变的。

  • Object对象

##4.字面值(literals)

  • 数组字面值

数组字面值是一个封闭在方括号对([])中的包含有零个或多个表达式的列表,其中每个表达式代表数组的一个元素。当你使用数组字面值创建一个数组时,该数组将会以指定的值作为它的元素进行初始化,而其长度被设定为元素的个数。如:

var coffees = ["French Roast", "Colombian", "Kona"];

若在顶层(全局)脚本里用字面值创建数组,JavaScript语言会在每次对包含该数组字面值的表达式求值时解释该数组。另一方面,在函数中使用的数组,将在每次调用函数时被创建一次。

  • 布尔类型有两种字面值:true和false。

* 整数

整数可以被表示成十进制(基数为10)、十六进制(基数为16)以及八进制(基数为8)。

十进制整数字组成的数字序列,不带前导0(零)。

带前导0(零)的整数字面值表明它是八进制。八进制整数只能包括数字0-7。

前缀0x或0X表示十六进制。十六进制整数,可以包含数字(0-9)和字母a~f或A~F。

0, 117 and -345 (decimal, base 10)
015, 0001 and -077 (octal, base 8) 
0x1123, 0x00111 and -0xF1A7 (hexadecimal, "hex" or base 16)
  • 浮点数字面值

浮点数字面值可以有以下的组成部分:

一个十进制整数,它可以带符号(即前面的“+”或“ - ”号),

一个小数点(“.”),

一个小数部分(由一串十进制数表示),

一个指数部分。

指数部分是以“e”或“E”开头后面跟着一个整数,可以有正负号(即前面写“+”或“-”)。一个浮点数字面值必须至少有一位数字,后接小数点或者“e”(大写“E”也可)组成。一些浮点数字面值的例子,如3.1415,-3.1E13,.1e12以及2E-12。

[digits][.digits][(E|e)[(+|-)]digits]
  • 对象字面值

对象字面值是封闭在花括号对({})中的一个对象的零个或多个”属性名-值”对的(元素)列表。你不能在一条语句的开头就使用对象字面值,这将导致错误或非你所预想的行为,因为此时左花括号({)会被认为是一个语句块的起始符号。

var Sales = "Toyota";

function CarTypes(name) {
  		return (name == "Honda") ?
	name :
	"Sorry, we don't sell " + name + "." ;
}

var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales };

console.log(car.myCar);   // Saturn
console.log(car.getCar);  // Honda
console.log(car.special); // Toyota
  • 字符串字面值

字符串字面值可以包含有零个或多个字符,由双引号(”)对或单引号(‘)对包围。字符串被限定在同种引号之间;也即,必须是成对单引号或成对双引号。如:”foo”;”one line \n another line”等。

你可以在字符串字面值上使用字符串对象的所有方法——JavaScript会自动将字符串字面值转换为一个临时字符串对象,调用该方法,然后废弃掉那个临时的字符串变量。你也能用对字符串字面值使用类似String.length的属性:

"John's cat".length

JavaScript 特殊字符:

character meaning
\0 空字节
\b Backspace
\f Form feed
\n New line
\r Carriage return 
\t Tab
\v Vertical tab
' Apostrophe or single quote
" Double quote
\ Backslash character (). 
\XXX The character with the Latin-1 encoding specified by up to three octal digits XXX between 0 and 377.
\xXX VThe character with the Latin-1 encoding specified by the two hexadecimal digits XX between 00 and FF.
\uXXXX The Unicode character specified by the four hexadecimal digits XXXX.

##5.Unicode编码

Unicode是一种通用字符编码标准,用于世界上主要书面语言的交换和显示。它涵盖美洲,欧洲,中东,非洲,印度,亚洲和环太平洋地区的语言,还包括古文字和技术符号。 Unicode允许多语言文本的交换、处理和显示,以及通用的技术和数学符号的使用。它有望解决多语言计算的国际化问题,如不同国家的文字标准,以解决国际化问题。但目前,并非所有的现代或古老的文字都得到了支持。Unicode字符集可用于所有已知的编码。 Unicode字符集是在ASCII(美国信息交换标准码)字符集后建立的,它为每个字符设定一个数值和名称。字符编码指定字符的本体(identity)和数值(编码位置),以及这个数值的位(bit)表示。 16位的数字值(编码值)定义为一个带前缀U的十六进制数,例如,U+0041代表A。这个值的唯一名称是大写的拉丁字母A。你可以在字符串字面值、正则表达式和标识符中使用Unicode转义序列。转义序列由6个ASCII字符构成:\u和一个4位十六进制数字。例如,\u00A9表示版权符号。每一个Unicode转义序列在JavaScript中被解释为一个字符。

JavaScript中Unicode转义序列的用法和Java不同。在JavaScript中,转义序列绝不会首先被理解为一个特殊字符。例如,在一个字符串的换行符转义序列不终止字符串,它被解释的功能。Javascript忽略注释中的任何转义序列。在Java中,如果在单行注释中使用转义序列,则它被解释为一个Unicode字符。对于一个字符串字面量,Java编译器首先解释转义序列。例如,如果在JavaScript中使用一个行结束符转义字符(例如,\u000A),它终止字符串文字。而在Java中这样做将导致一个错误,因为(Unicode)换行符不允许出现在字符串字面值中,必须使用\n换行。在JavaScript中,转义序列的效果和\n一样。