JavaScript高级视频(尚硅谷)学习笔记01

1、JavaScript的数据类型

JavaScript数据类型分为两大类:

---基本数据类型

---对象数据类型

基本数据类型分为五种

---数值类型:number 取值:任意数值(包含整数和小数) typeof取值:number     变量 instanceof Object取值:false

---字符串类型: string 取值:任意字符串 typeof取值:string   变量 instanceof Object取值:false

---布尔类型 :boolean 取值:true/false   typeof取值:boolean   变量 instanceof Object取值:false

---undefined类型:undefined   取值:undefined   typeof取值:undefined   变量 instanceof Object取值:false

---null类型   object   取值:null    typeof取值:object     变量 instanceof Object取值:false

对象数据类型分为三种

---对象类型: Object    typeof取值:object     变量 instanceof Object取值:true

---数组类型: Array  typeof取值:object     变量 instanceof Array取值:true

---函数类型: Function   typeof取值:object     变量 instanceof Function取值:true

2、数据、内存、变量

---数据:存储在计算机中用于表示一定含义的实体

---内存:用于存储数据的空间

---变量:值会变化的量

---变量本身没有类型,变量存储的值才有类型

---变量存储的值分为两大类,基本数据类型的值和对象类型的地址

---JavaScript的参数传递是值传递还是引用传递?

---有两种理解:(1)参数传递时值传递(不管传递的值时基本类型本身的值还是对象类型的地址)

(2)传递基本类型时时值传递,传递对象类型时引用传递(这个引用指的是把对象的地址传入进去,而不是对象本身)

3、对象

---对象:一组属性的集合

---对象属性:用一组键值对表示,属性名:字符串类型 属性值:任意类型

---对象方法:特殊属性,属性值为function

---对象属性的引用

---(1).属性名:obj.name  优点:简单

      (2)  [‘属性名']:obj['age']   应用场合:属性名中有特殊字符比如:-、空格 ;属性名不确定

4、函数

---函数:一组功能集合

---函数优点:便于重用、便于交流

---函数定义:

---函数调用:普通调用:a()   对象调用  obj.a()   apply,call:  a.call(obj2)   a.apply(obj2)

5、回调函数

---回调函数:你自己定义的,你没有去调用,它最终执行了

---回调函数的分类:

       ---DOM事件回调函数

       ---定时器回调函数

       ---ajax请求回调函数

       ---生命周期回调函数

6、做前端开发的任务

      ---布局界面(HTML+CSS)

      ---做交互(与用户的交互、与后台的数据交互)

7、IIFE

---IIFE:立即定义并执行函数表达式(匿名函数自调用)

---IIFE作用:隐藏代码、不会污染外部命名空间(全局命名空间)用来编写js模块

  8、this研究

---this是什么?

   ---任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window

   ---所有函数内部都有一个变量this

   ---this的值是调用函数的当前对象

9、关于分号问题

---js语句可加分号也可不加分号,根据个人习惯,尤雨溪(vue.js框架编写者)推荐使用不加分号的风格

---如果不加分号,需要避免下面几种情况可能的错误() []  +-

10、函数的prototype

---每个函数都有一个prototype属性,它默认指向一个Object空对象(即成为:原型对象)

---原型对象中有一个属性constructor,它指向函数对象

---给原型对象添加属性(一般是方法),函数的所有实例对象自动拥有原型中的属性(方法)

11、显式原型与隐式原型

---每个函数都有一个prototype,即显示原型(属性)

---每个实例对象都有一个__proto__,可称为隐式原型(属性)

---实例对象的__proto__指向构造函数的prototype

12、原型链

---对象实例访问属性顺序

---先在自身属性列表中查找,找到后返回

---如果在自身列表中找不到,就到prototype对象中查找,找到后返回

---如果找不到,沿着__proto__原型链向上找

---如果一直找不到,返回undefined

---原型链:隐式原型链

JavaScript高级视频(尚硅谷)学习笔记01

---所有函数(系统函数和自定义函数)的显式原型都是Object的实例对象(但Object除外) 

---所有函数(系统函数和自定义函数)都是Function的实例对象(包括Function自身)

---Object的显式原型对象是原型链的尽头

 

原型链的属性问题

---当读取属性的时候,如果在当前对象里找不到该属性,会自动到原型链中查找

---当设置属性的时候,不会查找原型链,更不会修改原型链的值,如果没有该属性,在当前对象中添加该属性,这个属性会覆盖带掉原型链的同名属性(如果原型链中存在同名属性的话)

---定义对象的时候,一般会将属性通过构造函数定义在对象自身身上,而将对象的方法定义在构造函数的prototype对象上去 ,从而达到属性独立方法公用的目的

 

探索instanceof

A instanceof B的含义是:实例对象A可以通过隐式链找到构造函数B的prototype对象

几个特殊的例子

Object instanceof Object  //true

Function instanceof Object  //true

Object instanceof Function  //true

Function instanceof Function //true

13、变量提升

通过var定义的变量,在变量定义之前就可以访问到,只是其值为undefined,这种现象叫变量提升

通过function声明的函数,在函数声明之前就可以调用,这种现象叫函数提升

通过函数表达式声明的函数,无法享受到函数提升的好处,只能享受变量提升的好处

14、执行上下文

---代码分类:全局代码、函数(局部)代码

---全局执行上下文

---执行全局代码前,浏览器首先确定window为全局执行上下文

   ---对全局数据进行预处理

      ---提升所有定义的变量,添加为window的属性

      ---提升所有定义的函数,添加为window的方法

      ---this当前指针指向window对象

   ---开始指向全局代码

函数执行上下文

---在调用函数,准备执行函数体前,先创建对应的函数执行上下文对象

---对局部数据进行预处理

   ---把形参添加为函数执行上下文的属性

   ---把arguments添加为函数执行上下文的属性

   ---把局部变量添加为函数执行上下文的属性

   ---把局部函数添加为函数执行上下文的属性

   ---this指针指向调用函数的对象,全局为(window)

---开始执行函数体代码

---执行上下文对象栈

---根据函数执行的动态,把不同的上下文对象存入到栈里,最下面的永远是全局上下文栈window,上面依次是依据调用层级进入的函数上下文对象

---作用域与作用域链

  ---在任何情况下,直接引用一个未经声明的变量都会引起系统报错

 

---闭包:函数fn1嵌套函数fn2,在fn2内部引用fn1的变量,就会产生闭包

---闭包产生条件,执行函数fn1