题外话
此系列文章以ES 6为标准,总结于廖雪峰老师的JavaScript教程
JS代码可以嵌在网页任何地方,通常都嵌到 ...
标签中。
1.1 基本语法
- JavaScript的语法和Java语言类似,每个语句以
;
结束,语句块用{...}
。但是,JavaScript并不强制要求在每个语句的结尾加;
,浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上;
。 - JavaScript本身对嵌套的层级没有限制,但是过多的嵌套无疑会大大增加看懂代码的难度。遇到这种情况,需要把部分代码抽出来,作为函数来调用,这样可以减少代码的复杂度。
- JavaScript严格区分大小写,如果弄错了大小写,程序将报错或者运行不正常。
1.2 数据类型和变量
1. number类型
JavaScript不区分整数和浮点数,统一用Number表示,举例如下,
123; // 整数
0.456; // 浮点数
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
2. string类型
在ES6中,多行字符串写法为
反引号
表示。-
模板字符串中要把多个字符串连接起来,可以用
+
连接。var name = '小明'; var age = 20; var message = `你好, ${name}, 你今年${age}岁了!`;
-
操作字符串
toUpperCase()
把一个字符串全部变为大写;
toLowerCase
把一个字符串全部变为小写;
indexOf
搜索指定字符串出现的位置;
substring
返回指定索引区间的子串。//indexOf var s = 'hello, world'; s.indexOf('world'); // 返回7 s.indexOf('World'); // 没有找到指定的子串,返回-1 //substring var s = 'hello, world' s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello' s.substring(7); // 从索引7开始到结束,返回'world'
3. boolean类型
略
4. null和undefined类型
-
null
表示一个“空”的值,它和0
以及空字符串''
不同,0
是一个数值,''
表示长度为0的字符串,而null
表示“空”。 -
undefined
仅仅在判断函数参数是否传递的情况下有用。
5. 数组
-
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型,例如:
[1, 2, 3.14, 'Hello', null, true];
数组用
[]
表示,元素之间用,
分隔。数组的元素可以通过索引来访问。请注意,索引的起始值为0。-
要取得Array的长度,直接访问length属性。
如果直接给Array的length赋一个新的值会导致Array大小的变化。
如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化。 -
操作数组
indexOf
搜索一个指定的元素的位置;
slice()
//slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C'] arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G'] //如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; var aCopy = arr.slice(); aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G'] aCopy === arr; // false
push()
向Array的末尾添加若干元素,pop()
则把Array的最后一个元素删除掉如果要往Array的头部添加若干元素,使用
unshift()
方法,shift()
方法则把Array的第一个元素删掉。sort()
可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序。reverse()
把整个Array的元素给反转。splice()
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle']; // 从索引2开始删除3个元素,然后再添加两个元素: arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite'] arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle'] // 只删除,不添加: arr.splice(2, 2); // ['Google', 'Facebook'] arr; // ['Microsoft', 'Apple', 'Oracle'] // 只添加,不删除: arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素 arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
concat()
方法并没有修改当前Array,而是返回了一个新的Array;可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里。join()
把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串。
javascript var arr = ['A', 'B', 'C', 1, 2, 3]; arr.join('-'); // 'A-B-C-1-2-3'
6. 对象
JavaScript的对象是一组由键-值组成的无序集合,例如:
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性。要获取一个对象的属性,我们用对象 变量.属性名
的方式:例如 person.name
的值为 Bob
。
访问属性是通过 .
操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用 ''
括起来,访问这个属性也无法使用 .
操作符,必须用 ['xxx']
来访问。
var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
如果我们要检测xiaoming是否拥有某一属性,可以用 in
操作符。不过要小心,如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的。要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用 hasOwnProperty()
方法。
7. 变量
变量不仅可以是数字,还可以是任意数据类型。变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如 if
、 while
等。
同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次。
8. strict模式
ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上: use strict
9. 比较运算符
JavaScript在设计时,有两种比较运算符:
- 第一种是
==
比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果; - 第二种是
===
比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
一个例外是 NaN
这个特殊的Number与所有其他值都不相等,包括它自己,即 NaN === NaN
判断结果为false。
唯一能判断NaN的方法是通过 isNaN()
函数,即 isNaN(NaN)
返回结果为true。
1.3 Map和Set
- Map
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); m.get('Michael'); // 95 var m = new Map(); // 空Map m.set('Adam', 67); // 添加新的key-value m.set('Bob', 59); m.has('Adam'); // 是否存在key 'Adam': true m.get('Adam'); // 67 m.delete('Adam'); // 删除key 'Adam' m.get('Adam'); // undefined
- Set
- Set 是一组key的集合,但不存储value,且key值不能重复。
- 要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set
var s1 = new Set(); // 空Set var s2 = new Set([1, 2, 3]); // 含1, 2, 3 s2.delete(3);
1.4 iterable
为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。具有iterable类型的集合可以通过新的for ... of循环来遍历。
for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果。for ... of循环则完全修复了这些问题,它只循环集合本身的元素
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
for (var x of a) {
console.log(x); // 'A', 'B', 'C'
}
更好的方式是直接使用iterable内置的 forEach
方法,它接收一个函数,每次迭代就自动回调该函数。----(forEach()函数暂不熟悉)