注释
Javascript 注释的语法和 C++ 或许多其他语言类似:
// 单行注释
/* 这是一个更长的,
多行注释
*/
变量
变量声明:
var:声明一个变量,可选初始化一个值,可以用来声明局部变量和全局变量。
let:声明一个块作用域的局部变量,可选初始化一个值。
const:声明一个块作用域的只读常量,常量不可以通过重新赋值改变其值,也不可以在代码运行时重新声明,它必须被初始化为某个值。
变量命名:JavaScript中,变量的命名必须以字母、下划线(_)或者美元符号($)开头;后续的字符也可以是数字(0-9)。
变量求值:
用 var
或 let
语句声明的变量,如果没有赋初始值,则其值为 undefined。
如果访问一个未声明的变量会导致抛出 ReferenceError 异常:
var a;
console.log("The value of a is " + a); // a 的值是 undefined
console.log("The value of c is " + c); // 未捕获的引用错误:c 未被定义
let x;
console.log("The value of x is " + x); // x 的值是 undefined
console.log("The value of y is " + y); // 未捕获的引用错误:y 未被定义
let y;
undefined
值在布尔类型环境中会被当作 false
。
var myArray = [];
if (!myArray[0]) myFunction();
数值类型环境中 undefined
值会被转换为 NaN
。
var a;
a + 2; // 计算为 NaN
当你对一个 null 变量求值时,空值 null
在数值类型环境中会被当作 0 来对待,而布尔类型环境中会被当作 false
。
var n = null;
console.log(n * 32); // 在控制台中会显示 0
变量提升:
JavaScript 变量的另一个不同寻常的地方是,你可以先使用变量稍后再声明变量而不会引发异常。这一概念称为变量提升;JavaScript 变量感觉上是被“提升”或移到了函数或语句的最前面。但是,提升后的变量将返回 undefined 值。因此在使用或引用某个变量之后进行声明和初始化操作,这个被提升的变量仍将返回 undefined 值。
/**
* 例子 1
*/
console.log(x === undefined); // true
var x = 3;
/**
* 例子 2
*/
var x;
console.log(x === undefined); // true
x = 3;
数据结构和类型
数据类型:
七种基本数据类型:
- 布尔值(Boolean),有 2 个值分别是:
true
和false
。 - null,一个表明 null 值的特殊关键字。JavaScript 是大小写敏感的,因此
null
与Null
、NULL
或变体完全不同。 - undefined,和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。
- 数字(Number),整数或浮点数,例如:
42
或者3.14159
。 - 任意精度的整数(BigInt),可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
- 字符串(String),字符串是一串表示文本值的字符序列,例如:
"Howdy"
。 - 代表(Symbol,在 ECMAScript 6 中新添加的类型)。一种实例是唯一且不可改变的数据类型。
- 以及对象(Object)。
数据类型的转换:
JavaScript 是一种动态类型语言 。这意味着你在声明变量时可以不必指定数据类型,而数据类型会在代码执行时会根据需要自动转换。因此,你可以按照如下方式来定义变量:
var answer = 42;
然后,你还可以给同一个变量赋予一个字符串值,例如:
answer = "Thanks for all the fish...";
因为 JavaScript 是动态类型的,这种赋值方式并不会提示出错。
数字转换为字符串:
在包含的数字和字符串的表达式中使用加法运算符(+),JavaScript 会把数字转换成字符串。
x = "The answer is " + 42; // "The answer is 42"
y = 42 + " is the answer"; // "42 is the answer"
在涉及其他运算符时,JavaScript 语言不会把数字变为字符串。
"37" - 7; // 30
"37" + 7; // "377"
字符串转换为数字:
有一些方法可以将内存中表示一个数字的字符串转换为对应的数字。
- parseInt
- parseFloat
parseInt
方法只能返回整数,所以使用它会丢失小数部分。另外,调用 parseInt 时最好总是带上进制(radix)参数,这个参数用于指定使用哪一种进制。
console.log(parseInt('123'));
// 123 (default base-10)
console.log(parseInt('123', 10));
// 123 (explicitly specify base-10)
console.log(parseInt(' 123 '));
// 123 (whitespace is ignored)
console.log(parseInt('077'));
// 77 (leading zeros are ignored)
console.log(parseInt('1.9'));
// 1 (decimal part is truncated)
console.log(parseInt('ff', 16));
// 255 (lower-case hexadecimal)
console.log(parseInt('0xFF', 16));
// 255 (upper-case hexadecimal with "0x" prefix)
console.log(parseInt('xyz'));
// NaN (input can't be converted to an integer)
将字符串转换为数字的另一种方法是使用一元加法运算符。
"1.1" + "1.1" = "1.11.1"
(+"1.1") + (+"1.1") = 2.2
// 注意:加入括号为清楚起见,不是必需的。
字面量
字面量是脚本中按字面意思给出的固定的值,而不是变量。
数组字面量:
数组字面值是一个封闭在方括号对 ([]) 中的包含有零个或多个表达式的列表,其中每个表达式代表数组的一个元素。当你使用数组字面值创建一个数组时,该数组将会以指定的值作为其元素进行初始化,而其长度被设定为元素的个数。
下面的示例用 3 个元素生成数组 coffees
,它的长度是 3。
var coffees = ["French Roast", "Colombian", "Kona"];
var a = [3];
console.log(a.length); // 1
console.log(a[0]); // 3
数组字面值中的多余逗号:
你不必列举数组字面值中的所有元素。若你在同一行中连写两个逗号(,),数组中就会产生一个没有被指定的元素,其初始值是 undefined
。以下示例创建了一个名为 fish
的数组:
var fish = ["Lion", , "Angel"];
在这个数组中,有两个已被赋值的元素,和一个空元素(fish[0] 是 "Lion",fish[1] 是 undefined,而 fish[2] 是 "Angel")。
在下面的例子中,数组的长度是 3,并不存在 myList[3] 这个元素。元素列表中其他所有的逗号都表示一个新元素(的开始)。
var myList = ["home", , "school"];
在下面的例子中,数组的长度是 4,元素 myList[0]
和 myList[2]
缺失。
var myList = [, "home", , "school"];
如果你在元素列表的尾部添加了一个逗号,它将会被忽略。再看一个例子。在这里,该数组的长度是 4,元素 myList[1]
和 myList[3]
被漏掉了。(但是)只有最后的那个逗号被忽略。
var myList = ["home", , "school", ,];
但是,在你自己写代码时:显式地将缺失的元素声明为 undefined
,将大大提高你的代码的清晰度和可维护性。
布尔字面量:
布尔类型有两种字面量:true
和false
。
数字字面量:
JavaScript 数字字面量包括多种基数的整数字面量和以 10 为基数的浮点数字面量。
整数字面量:
整数可以用十进制(基数为 10)、十六进制(基数为 16)、八进制(基数为 8)以及二进制(基数为 2)表示。
- 十进制整数字面量由一串数字序列组成,且没有前缀 0。
- 八进制的整数以 0(或 0O、0o)开头,只能包括数字 0-7。
- 十六进制整数以 0x(或 0X)开头,可以包含数字(0-9)和字母 a~f 或 A~F。
- 二进制整数以 0b(或 0B)开头,只能包含数字 0 和 1。
浮点数字面量:
浮点数字面值可以有以下的组成部分:
- 一个十进制整数,可以带正负号(即前缀“+”或“-”),
- 小数点(“.”),
- 小数部分(由一串十进制数表示),
- 指数部分。
指数部分以“e”或“E”开头,后面跟着一个整数,可以有正负号(即前缀“+”或“-”)。浮点数字面量至少有一位数字,而且必须带小数点或者“e”(大写“E”也可)。
简言之,其语法是:
[(+|-)][digits][.digits][(E|e)[(+|-)]digits]
//例如
3.1415926
.123456789
3.1E+12
.1e-23
对象字面量:
对象字面值是封闭在花括号对({})中的一个对象的零个或多个“属性名—值”对的(元素)列表。
以下是一个对象字面值的例子。对象car
的第一个元素(译注:即一个属性/值对)定义了属性 myCar
;第二个元素,属性 getCar
,引用了一个函数调用(即 CarTypes("Honda"));第三个元素,属性 special
,使用了一个已有的变量(即 Sales)。
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
更进一步的,你可以使用数字或字符串字面值作为属性的名字,或者在另一个字面值内嵌套上一个字面值。如下的示例中使用了这些可选项。
var car = { manyCars: { a: "Saab", b: "Jeep" }, 7: "Mazda" };
console.log(car.manyCars.b); // Jeep
console.log(car[7]); // Mazda
对象属性名字可以是任意字符串,包括空串。如果对象属性名字不是合法的 javascript 标识符,它必须用引号包裹。
const unusualPropertyNames = {
'': '空字符串',
'!': '砰!'
}
console.log(unusualPropertyNames.''); // SyntaxError: Unexpected string
console.log(unusualPropertyNames.!); // SyntaxError: Unexpected token !
属性的名字不合法,那么便不能用点(.
)访问属性值,而是通过方括号表示法([]
)来访问。
console.log(unusualPropertyNames[""]); // 空字符串
console.log(unusualPropertyNames["!"]); // 砰!
RegExp字面量:
一个正则表达式是字符被斜线(译注:正斜杠“/”)围成的表达式。下面是一个正则表达式文字的一个例子。
var re = /ab+c/;
字符串字面量:
字符串字面量是由双引号(")对或单引号(')括起来的零个或多个字符。字符串被限定在同种引号之间;也即,必须是成对单引号或成对双引号。下面的例子都是字符串字面值:
'foo'
"bar"
'1234'
'one line \n another line'
"Joyo's cat"
你可以在字符串字面值上使用字符串对象的所有方法——JavaScript 会自动将字符串字面值转换为一个临时字符串对象,调用该方法,然后废弃掉那个临时的字符串对象。你也能用对字符串字面值使用类似 String.length 的属性:
console.log("John's cat".length);
// 将打印字符串中的字符个数(包括空格)
// 结果为:10
在字符串中使用的特殊字符:
作为一般字符的扩展,你可以在字符串中使用特殊字符,如下例所示,其实也就是转义字符:
"one line \n another line";
转义字符:
字符 | 意思 |
---|---|
\0 | Null 字节 |
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | Tab (制表符) |
\v | 垂直制表符 |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠字符(\) |
通过在引号前加上反斜线 '\',可以在字符串中插入引号,这就是引号转义。例如:
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service.";
console.log(quote);
代码的运行结果为:
He read "The Cremation of Sam McGee" by R.W. Service.
要在字符串中插入'\'字面值,必须转义反斜线。例如,要把文件路径 c:\temp 赋值给一个字符串,可以采用如下方式:
var home = "c:\\temp";
附:以上内容均为个人在MDN网站上学习JS的笔记,若有侵权,将在第一时间删除,若有错误,将在第一时间修改。