JavaScript 精简笔记,摘自 廖雪峰的官方网站。
[From] https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000
‘use strict‘; //严格模式
JavaScript严格区分大小写。
NaN === NaN; // false
唯一能判断NaN
的方法是通过isNaN()
函数。
1 / 3 === (1 - 2 / 3); // false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
多行字符串: `......`
模板字符串: `你好, ${name}, 你今年${age}岁了!`
操作字符串: toUpperCase, toLowerCase, indexOf, substring
数组:
var arr = [10, 20, ‘30‘, ‘xyz‘]; arr.indexOf(10); // 元素10的索引为0 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‘] 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的元素给掉个个,也就是反转。 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。 var arr = [‘A‘, ‘B‘, ‘C‘, 1, 2, 3]; arr.join(‘-‘); // ‘A-B-C-1-2-3‘
对象:
如果我们要检测xiaoming是否拥有某一属性,可以用in操作符。 ‘name‘ in xiaoming; // true
要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法。 xiaoming.hasOwnProperty(‘name‘); // true
条件判断:
JavaScript把null、undefined、0、NaN和空字符串‘‘视为false,其他值一概视为true。
循环:
for循环的一个变体是for ... in循环,它可以把一个对象的所有属性依次循环出来。要过滤掉对象继承的属性,用hasOwnProperty()来实现。
由于Array也是对象,而它的每个元素的索引被视为对象的属性,因此,for ... in循环可以直接循环出Array的索引。
Map:
Map是一组键值对的结构,具有极快的查找速度。 由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉。 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和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。
通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果。
通过delete(key)方法可以删除元素。
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
iterable:
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。 具有iterable类型的集合可以通过新的for ... of循环来遍历。 var a = [‘A‘, ‘B‘, ‘C‘]; a.name = ‘Hello‘; for (var x in a) { alert(x); // ‘0‘, ‘1‘, ‘2‘, ‘name‘ } for ... in循环将把name包括在内,但Array的length属性却不包括在内。 for ... of循环则完全修复了这些问题,它只循环集合本身的元素。 var a = [‘A‘, ‘B‘, ‘C‘]; a.name = ‘Hello‘; for (var x of a) { alert(x); // ‘A‘, ‘B‘, ‘C‘ } 更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。 var a = [‘A‘, ‘B‘, ‘C‘]; a.forEach(function (element, index, array) { // element: 指向当前元素的值 // index: 指向当前索引 // array: 指向Array对象本身 alert(element); }); Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身: var s = new Set([‘A‘, ‘B‘, ‘C‘]); s.forEach(function (element, sameElement, set) { alert(element); }); Map的回调函数参数依次为value、key和map本身: var m = new Map([[1, ‘x‘], [2, ‘y‘], [3, ‘z‘]]); m.forEach(function (value, key, map) { alert(value); });