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只是对数据的处理,是没有返回值的
- 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关键字后面的函数一次执行下面的四步操做:
- 建立一个空对象,做为将要返回的对象实例
- 将这个空对象的原型,指向构造函数的的prototype属性
- 将这个空对象赋值给函数体内部的this关键字
- 开始执行构造函数内部的代码
- 注意点:若是构造函数内部有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字符串转化为对应的值