1.比较运算符
(1)== 和 ===
‘==’会自动转换数据类型再比较;
‘===’不会自动转换数据类型,如果数据类型不一致,返回false;
(2)NaN
这个特殊的Number与所有其他值都不相等,包括它自己,
判断方法:isNaN(NaN);//true
(3)浮点数相等比较
浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值。
Math.abs(1/3- (1-2/3)) <0.0000001;//true
(4)null和undefined
null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。
undefined,它表示“未定义”,undefined仅仅在判断函数参数是否传递的情况下有用。
2.操作字符串
toUpperCase toLowerCase
indexof() : 搜索指定字符串出现的位置
substring() : 返回指定索引区间的子串
3.数组方法
indexOf() :搜索一个指定的元素;
slice() : 截取Array的部分元素,然后返回一个新的Array,如果不给slice()传递任何参数,它就会从头到尾截取所有元素;
push()和pop()
unshift()和shift()
sort()排序
reverse()反转
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素;
concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array;
join()方法把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串;
4.对象
对象是一种无序的集合数据类型,它由若干键值对组成。
判断对象是否拥有某一属性:
in :in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的;
hasOwnProperty :要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法;
5.JavaScript把null、undefined、0、NaN和空字符串''视为false,其他值一概视为true
6.循环
(1)for ..in
可以把一个对象的所有属性依次循环出来;要过滤掉对象继承的属性,用hasOwnProperty()来实现.
for ... in循环可以直接循环出Array的索引;
7.Map 和 Set
Map是一组键值对的结构,具有极快的查找速度;
varm =newMap([['Michael',95], ['Bob',75], ['Tracy',85]]);
m.get('Michael');// 95
初始化Map需要一个二维数组,或者直接初始化一个空Map;
varm =newMap();// 空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
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉;
Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key;
重复元素在Set中自动被过滤:有add和delete方法。
8.iterable
具有iterable类型的集合可以通过新的for ... of循环来遍历,Array、Map和Set都属于iterable类型;
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element + ', index = ' + index);
});
9.arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数;
const与let都具有块级作用域;
10.解构赋值
可以同时对一组变量进行赋值,对数组元素进行解构赋值时,多个变量要用[...]括起来;
let[x, [y, z]] = ['hello', ['JavaScript','ES6']];
11.apply()和call()
要指定函数的this指向哪个对象,可以用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数;
apply()把参数打包成Array再传入;
call()把参数按顺序传入
12.高阶函数
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
(1)map/reduce
由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果;
Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算;
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
(2)filter
filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素;
(3)sort
13.闭包
函数作为返回值;
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量;
如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变;
借助闭包,可以封装一个私有变量;
闭包可以把多参数的函数变成单参数的函数;
14.箭头函数 x => x * x
箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return:
x => {if(x >0) {returnx * x; }else{return- x * x; }}
15.generator
一个generator看上去像一个函数,但可以返回多次;
function* foo(x) {yieldx +1;yieldx +2;returnx +3;}
16.标准对象
几个规范:
1)不要使用new Number()、new Boolean()、new String()创建包装对象;
2)用parseInt()或parseFloat()来转换任意类型到number;
3)用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
4)通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {...};
5)typeof操作符可以判断出number、boolean、string、function和undefined;
6)判断Array要使用Array.isArray(arr);
7)判断null请使用myVar === null;
8)判断某个全局变量是否存在用typeof window.myVar === 'undefined';
9)函数内部判断某个变量是否存在用typeof myVar === 'undefined'。
Date、RegExp、JSON
将JavaScript对象序列化为JSON对象,JSON.Stringify();将JSON对象反序列化为JavaScript对象,JSON.parse()