一、对象:
-
面向过程:凡事都要亲力亲为,每件事的具体过程都要知道,注重的是过程
-
面向对象:根据需求找对象,所有的事都用对象来做,注重的是结果
-
面向对象特性:封装,继承,多态 (抽象性)
-
什么是对象?
- 看的见,摸得到,具体特指的某个东西
- 找对象
- 描述找对象
- 文字描述找对象
- 小明牵着小黄去逛街
- 一台电视机正在播放影片
-
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成
-
js不是面向对象的语言,但是可以模拟面向对象的思想
-
js是一门基于对象的语言:
-
万物皆对象:---------->程序猿 程旭媛
-
创建对象三种方式:
-
调用系统的构造函数创建对象
var 变量名= new Object(); Object 是系统的构造函数 Array
-
自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
自己定义的对象,即java里的自定义类 ,列如:domain
- 3.字面量的方式创建对象
- ·
相当于一次性对象,修改不灵活
-
-
-
标准对象:
number、string、boolean、function和undefined,object:null、Array、{},Data、RegExp、JSON
二、数组:
就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。
数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。
数组:存储一组有序的数据
数组的作用:一次性存储多个数据
-
数组的定义方式:
- 构造函数定义数组:
var 数组名=new Array();
- 空数组:
var arr1=new Array();
- 长度为5的数组,每个数据的值是undefined:
var arr2=new Array(5);
- 长度为5分数组,
var arr3=new Array(1,2,3,4,5);
- 空数组:
- 字面量方式定义数组:
var 数组名=[];
- 空数据:
var arr4=[];
- 长度为3的数组,值分别为: 1,2,3:
var arr5=[1,2,3]
- 数组中元素的值的类型可以不一样:
var arr6=["red","blue","green",1,true];
- 设置数组的元素的值:
arr7[0]=10; arr7[1]=20;
- 空数据:
- 构造函数定义数组:
-
数组的遍历:
- for(var i=0;i<arr.length;i++){ console.log(arr[i]); }
- for(var key in arr) { console.log(key + “==” + arr[key]);
-
数组常用api方法:
indexOf(index)
: 搜索Array一个指定的元素的位置slice(begin,end)
:截取Array的部分元素,然后返回一个新的Arraysort()
: 可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序reverse()
: 把整个Array的元素反转arr1.concat(arr2)
:把当前的Array和另一个Array连接起来,并返回一个新的Arraysplice()
: 修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素join(str)
: 把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串push和pop
: push()向Array的末尾添加若干元素,pop()把Array的最后一个元素删除掉unshift和shift
: unshift()往Array的头部添加若干元素,shift()把Array的第一个元素删掉
三、Map Set:
map键值对
,ES5中键的值只能是字符串,ES6中引入map键的值可以为数字,get和setset
:存储不重复的键;add和delete
四、iterable类型:Array、Map和Set都属于iterable类型。
- for … in iterable 循环集合元素的名字
- for … of iterable 循环集合本身的元素:
五、函数:
函数的三种定义方式
- 命名函数:函数如果有名字,就是命名函数
function f1() { console.log("我是一个函数"); }; 调用:f1()
- 匿名函数:函数如果没有名字,就是匿名函数
function () { console.log("我是一个函数"); }; 调用:不能直接调用
- 函数表达式:
var f4 = function () { console.log("我是一个函数"); }; 调用:f4() 注意:如果console.log(f1);的话 输出的是函数f1的代码 ```
函数是一种数据类型,可以作为参数,也可以作为返回值
-
作用域:使用范围
-
全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
除了函数以外,其他的任何位置定义的变量都是全局变量
如果页面不关闭,那么就不会释放,就会占空间,消耗内存 -
局部变量:在函数内部定义的变量,是局部变量,外面不能使用
-
全局作用域:全局变量的使用范围
-
局部作用域:局部变量的使用范围
-
块级作用域:
一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,
但是在js中在这个块级作用域中用var定义的变量,外面也能使用; 说明js没有块级作用域,只有函数除外。
为了解决块级作用域,ES6
引入了新的关键字let,const
let:
替代var可以申明一个块级作用域的变量:let声明的变量可以改变,值和类型都可以改变,没有限制。
const
替代var来定义一个块级作用域的常量,const声明的变量不得改变值,const一旦声明变量,就必须立即初始化,不能留到以后赋值
const定义的数组和对象,变量名不指向数据,而是指向数据所在的地址。
const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,通常用全部大写的变量来表示“这是一个常量,不要修改它的值”:
this的使用:
普通函数中的this:
this指当前所处模块的父亲节点,在当前模块下使用this可以访问当前模块的兄弟节点
箭头函数中的this:
箭头函数根本没有自己的this,导致内部的this就是外层代码块的this,即箭头函数中的大括号忽略掉,按普通函数规则来处理,看this的指向节点
隐式全局变量:声明的变量没有var,就叫隐式全局变量
全局变量:使用var 定义是不能被删除的,隐式全局变量是可以被删除的
预解析(变量提升):就是在解析代码之前
预解析做什么事?
它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部
因为JavaScript引擎自动提升了变量的声明,但不会提升变量的赋值
把变量的声明提前了----提前到当前所在的作用域的最上面
函数的声明也会被提前---提前到当前所在的作用域的最上面
常用的高阶函数:
Array的
map(function):传入一个函数,把arr里的单个元素进行函数计算,得到结果作为一个新的arr
filter(function):和map()类似,不同的是,filter()根据返回值是true还是false决定保留还是丢弃该元素。
forEach():和map()类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组。forEach()常用于遍历数组,因此,传入的函数不需要返回值:
sort(function):传入一个函数,对函数定义的方式进行排序,不需要管函数内部怎么进行,返回值为1的在前,返回值为-1的在后,还要有0的情况,
reduce(function);传入一个函数,把arr里的前两个元素进行函数计算,计算得到的结果作为第一个参数继续计算,直到最后只剩两个的时候结束。
every(function) :判断数组的所有元素是否满足函数的测试条件,必须全部满足才为true
findIndex(function)和find(function);用于查找符合条件的“第一个元素”,find返回元素,findIndex返回索引
闭包:当一个函数执行返回了另外一个函数后,其内部相关的局部变量和参数还被新函数引用,这种称为“闭包(Closure)
#六、标准对象
Data、RegExp、JSON
七、錯誤:
错误分两种:
一种是程序写的逻辑和语法不对,导致代码执行异常
一种是执行过程中,程序可能遇到无法预测的异常情况而报错,例如,网络连接中断,读取不存在的文件,没有操作权限等。
第二种需要处理:try ... catch ... finally
有错误catch会捕获,并输出错误,finally无论有没有错误都执行