JavaScript基础知识

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()

你可能感兴趣的:(JavaScript基础知识)