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
---原型链:隐式原型链
---所有函数(系统函数和自定义函数)的显式原型都是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