JavaScript错误处理机制
- javaScript 解析或运行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript 原生提供Error构造函数,所有抛出的错误都是这个构造函数的实例
- Error是最普通的错误对象,JavaScript在它的基础上还设置了6种错误对象,也就是说存在Error的6个派生对象
- SyntaxError对象是解析代码时发生的语法错误
- ReferenceError(引用错误)对象是引用一个不存在的变量时发生的错误,另一种触发场景是,将一个值分配给无法分配的对象,比如对函数的运行结果或者this赋值
- RangeError对象是一个值超出有效范围时发生的错误。主要有几种情况,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值
- TypeError对象是变量或参数不是预期类型时发生的错误。比如,对字符串、布尔值、数值等原始类型的值使用new命令,就会抛出这种错误,因为new命令的参数应该是一个构造函数
object对象
- JavaScript的所有对象都是继承之object,即那些对象都是object的实例
- Object对象的原生方法分为两种:Object自身的方法和Object实例方法
- Object自身的方法:就只直接定义在object上面的方法
- Object实例方法:所谓实例方法就是定义在object.prototype上面的方法,他可以被object实例直接使用
数组
- 数组的静态方法: Array.isArray(arr);判断参数是否为数组,返回值为布尔值
- 数组的实例方法:
- push():表示在数组的末尾添加一个数
- pop():表示在数组的末尾删除一个数
- unshift():表示在数组的开头添加一个元素
- shift():表示在数组的开头位置删除一个元素
- join():将指定参数作为分隔符,将所有数组成员连接成一个字符串方法,通过call给方法也可以用于字符串和类似数组的对象:Array.prototype.join.call('hello','-');
- concat():用于多个数组的合并,将新数组添加在旧数组的后面,更简单的方法数组的扩展运算符实现数组的连接。
- reverse():用于颠倒数组元素的排列
- slice(start,end):用于提取目标数组的一部分,他有一个重要的作用就是将类似数组的对象转化为真正的对象,Array.prototype.slice.call(obj);
- splice(start,count,newEle1,newEle2):用于删除原数组的一部分,并在删除元素的位置添加新的元素
- sort():对数组成员进行排序,注意点:默认是按照字典顺序排序的
- map():将数组成员依次传入参数函数,然后把每一次的执行结果组成一个新数组方法,也就是说它是有return语句的
- forEach():将数组的所有成员依次传入参数函数,做相应的处理,它跟map最大的区别就是map是有返回值的,forEach只是对数据的处理,是没有返回值的,可以接受第二个参数用来绑定回调函数中this关键字。
- filter():用于过滤数组成员,满足条件的数组成员组成一个新数组方法
- some():断言方法,表示数组的成员是否满足一种条件,只要有一个满足就会返回true,否则返回false
- every():他跟some方法的区别是必须所有的数组成员满足的时候才会返回true,否则返回false
- reduce():依次对数组的成员进行累加最后返回一个值,他和reduceRight()的区别是reduce是从左向右,reduceRight()从右向左
- indexOf():返回给定元素在数组中第一次出现的位置,如果没有出现返回-1
- lastIndexof():返回给定元素在数组中最后一次出现的位置,如果没有返回-1
- ES6对数组的扩展方法
- Array.from():表示将两类对象转化为真正的数组:类似数组的对象和可遍历的对象(Iterator),还可以接受第二个参数,作用类似于数组的map方法
- Array.of():用于将一组值转化为数组 Array.of(1,2,3,4,5);[1,2,3,4,5]
- copyWithIn(target,start,end):将指定位置的成员复制到其他地方,target表示目标位置,start表示开始位置,end表示结束位置
- find():用于找出第一个复合条件的数组成员,参数为一个函数,如果没有找到返回undefined
- findIndex():用于找出最后一个复合条件的数组成员,参数也是一个函数
- fill():使用给定制填充一个数组
- entries():用于遍历数组,entries是对键值对的遍历
- keys():用于遍历数组,keys是对键名的遍历
- values():用于遍历数组,values是对键值的遍历
- includes():返回一个布尔值,表示一个数组是否包含给定的值
,[Nan].includes(Nan); //true
,而indexof内部采用的是‘===’,因此[NaN].indexOf(NaN);//false
- flat():数组的成员有时候还是数组,通过这个方法可以将数组转变为一个一维数组,注意点默认参数是1,表示只拉平一层
- flatMap():参数为一个函数,其用法和flat()差不多
- 数组的扩展运算符:
- 数组的扩展运算符相当于rest参数的逆运算,将一个数组转化为用逗号分隔的参数序列console.log(...[1,2,3,4,5]);//1,2,3,4,5
- 如果将数组的扩展运算符放在括号中,JavaScript引擎会认为是函数调运就会报错
(...[1,2,3,4,5])//会报错
- 替代函数的apply方法
- 合并数组
- 与结构赋值结合使用,与结构赋值使用只能放在最后一位
- 字符串的使用
- call、apply、bind方法
- call():可以指定函数内部this的指向,也可以简单理解改变函数内部this的指向,call()方法的参数应该是一个对象,如果默认传入空、null、 undefined 则表示默认传入全局对象,如果传入的是this表示绑定当前此环境(对象)
- apply():它和call唯一的区别是它接受一个数组作为参数的其他参数,其余的问题都是和call一样
- bind():将函数内部的this绑定到某个对象,然后返回一个新对象
- 数组的空位:指数组的某一个位置完全没有值,空位不是undefined,数组的一个位置为undefined表示完全是有值的
[,,,]//表示这是数组的空位
- ES5对空位的处理是跳过忽略,而ES6对空位的处理是用undefined填充,不会忽略空位的
面向对象编程
- 构造函数
- 背景:面向对象编程的第一步就是生成对象,典型的面向对象的编程语言如java c++中都有类的概念,但是在JavaScript中不是基于类的而是基于构造函数(constructor)和原型(prototype)
- 定义:构造函数其实就是一个函数,只不过这个函数是用来生成对象模板的,
- 特点:函数体内部使用了this关键字,表示所生成的对象实例、生成对象的时候必须使用new关键字
- new关键字的使用原理
- 使用new命令,new关键字后面的函数一次执行下面的四步操作:
- 1.创建一个空对象,作为将要返回的对象实例
- 2.将这个空对象的原型,指向构造函数的的prototype属性
- 3.将这个空对象赋值给函数体内部的this关键字
- 5.开始执行构造函数内部的代码
- 注意点:如果构造函数内部有return语句,而且return后面跟着一个对象,则返回return指定的对象,否则就会忽略return,返回this指定的对象
- new.target:函数内部可以使用new.target命令,如果当前函数是new关键字创建的new.target指向当前函数,否则为undefined。我们可以使用这个命令判断函数调运的时候是否使用的new关键字
- Object.create():创建实例对象,构造函数作为模板,可以生成实例对象。但是,有时拿不到构造函数,只能拿到一个现有的对象。我们希望以这个现有的对象作为模板,生成新的实例对象,这时就可以使用Object.create()方法。
- this关键字
- 含义:this关键字就是指属性和方法当前所在的对象
- this关键字的使用场合:
- 在全局对象中,表示顶层对象window
- 构造函数中,表示实例对象
- 对象的方法中,表示该方法运行是所在的对象,注意点:如果this所在的方法不在对象的第一层,这时this只是指向当前一层的对象,而不会继承更上面的层。
- this关键字使用的注意点:
- 避免多层嵌套使用this关键字
- 避免数组的map和forEach()方法中使用this关键字,但是这个问题在箭头函数中得到了很好的解决
- 避免回调函数中使用this,回调函数中的this往往会改变this的指向
- 对象的继承
- 对象的继承说白了就是代码的复用,把几个对象相同的代码可以抽离为一个公共的父级
- 构造函数的缺点:同一个构造函数的多个实例之间,无法共享属性,从而造成对系统资源的浪费。
- prototype属性的作用:原型对象的所有属性和方法,实例对象是完全可以共享的
- 原型链:JavaScript规定,所有对象都有自己的原型,一层一层上溯顶层对象
Object.prototype
的原型为null
- constructor属性:prototype对象默认是有一个constructor属性,默认是指向原型对象所在的所在的构造函数,作用:我们可以通过这个属性判断某个对象的构造函数
- instanceof运算符:返回一个布尔值,表示对象是否为某个构造函数的实例
- instanceof工作原理:instanceof运算符的左边是对象右边是构造函数,它会判断右边构造函数的原型是否在左边对象的原型上
function Person(name){
this.name = name;
}
var obj = new Perosn('lucy');
obj instanceof Perosn// true
json
- json是一种轻量级的数据交换格式,而且是文本格式
- json存在的意义就是取代繁琐笨重的XML
- 相比xml,json的特点是:书写简单,一目了然
- json对值的格式和类型有严格的要求:
- 复合类型的值只能是对象或数组,而不能是函数、正则表达式对象、日期对象
- 原始类型的值只有四种分别是:字符串、数值、Boolean、null(不能使用NaN、infinity、-infinity、undefined)
- 字符串必须使用双引号表示,不能使用单引号表示
- 对象的键名必须放在双引号里面
- 数组或对象的最后一个成员后面不能加逗号
- 静态方法
- json.stringify():用于将一个值转化为json字符串,该字符串复合json格式
- json.parse():用于将json字符串转化为对应的值