B02 数据类型
基本(值)类型:
String
Number
boolean
undefined
null
对象(引用)类型:
Object 任意对象
Function 一种特别对象(可执行)
Array 一种特别对象(数值下标)
判断
typeof 不能判断null与object object与array
instanceof 判断对象的具体类型
=== 可以判断undefined null
B03
1、undefined与null的区别
undefined是定义了未赋值
null是定义并赋值了
2、什么时候用null
var b = null;初始赋值,表明将要赋值为对象
b=['dsfsdf',12];
b=null;//回收垃圾 让对象成为垃圾对象
3、严格区分变量类型和数据类型
变量类型:
基本类型
对象类型
数据类型:(变量内存值的类型)
基本类型:保存的是基本类型的数据
引用类型:保存的是地址值
B4
1。什么是数据
存储在内存中代表特定信息的东西,本质上是0101…
*数据的特点:可传递、可运算
*一切皆数据
*内存中所有操作的目标:数据
2。什么是内存
内存条通电后可存储数据的空间(临时的)
栈:全局变量、局部变量
堆:对象
3。什么是变量
可变化的量。由变量名和变量值组成
每个变量都对应一块小内存,变量名用来查找对应的内存
4。内存、数据、变量三者之间的关系
- 内存是容器, 用来存储不同数据
- 变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据
B5
问题: var a = xxx, a内存中到底保存的是什么?
* xxx是基本数据, 保存的就是这个数据
* xxx是对象, 保存的是对象的地址值
* xxx是一个变量, 保存的xxx的内存内容(可能是基本数据, 也可能是地址值)
关于引用变量赋值问题
- 2个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 另一个变量看到的是修改之后的数据
- 2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象
B07
1、什么是对象?
多个数据的封装体
用来保存多个数据的容器
2、为什么要用对象?
统一管理多个数据
3、对象的组成
属性:由属性名(字符串)和属性值组成
方法:一种特别的属性(属性值是函数)
4、如何访问属性内部数据
.属性名
[‘属性名’]
以下两种情况只能用[]访问:
属性名包括特殊字符
变量名不确定
B08 函数
1、什么是函数
实现特定功能的封装体
只有函数是可执行的
2、为什么要用函数?
提高代码复用
便于阅读交流
3、如何定义函数
函数声明:function A(){}
表达式: var a = function(){}
4、如何调用执行函数?
test():直接调用
obj.test():通过对象调用
test.call/apply(obj):临时让test成为obj方法调用 test.call(obj)==obj.tets2()
B09 回调函数
1、什么是回调函数
你定义的 你未调用的 但最终它执行的
2、常用的回调函数
dom事件回调函数 .οnclick=…
定时器回调函数 setTimeout
B10 IIFE
1、理解
全称: Immediately-Invoked Function Expression
(function(){ //匿名函数自调用
console.log(...)
})()
2、作用
隐藏实现
不会污染外部命名空间
用其编写js模块
B11 函数中的this
1、this是什么?
任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
所有函数内部都有一个变量this
它的值是调用函数的当前对象
2、如何确定this的值
test(); : window
p.test() :p
new test();:新创建的对象
p.call(obj):obj
B12 语句分号
js一条语句后面可以不加分号
以下不加分号会有问题:
小括号开头的前一条语句
中方括号开头的前一条语句
B15 原型
1、函数的prototype属性
每个函数都有一个prototype属性,它默认指向一个Object空对象(即原型对象)
原型对象中有一个属性constructor,它指向函数对象
2、给原型对象添加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)
B16 显示原型与隐式原型
函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象
对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
程序员能直接操作显示原型,但不能直接操作隐式原型(ES6之前)
B17 原型链
访问一个对象的属性时,
先在自身属性中查找,找到返回
如果没有,再沿着__proto__这条链向上查找,找到返回
如果最终没找到,返回undefined
别名:隐式原型链
作用:查找对象的属性(方法)
B18 原型链
1、函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
2、所有函数都是Function实例,包括Function本身。
Function.proto_ === Function.prototype
3、Object的原型对象时原型链的尽头
Object.prototype.proto //null
B19 原型链-属性问题
读取对象属性时:会自动到原型链中查找
设置对象属性时:不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
方法一般定义在原型中,属性一般通过构造函数定义在对象本身上
B20 探索instanceof
A instanceof B
判断左边对象(A)是不是右边(B)的实例
如果B函数的显式原型链对象在A对象的原型链上,返回true,否则返回false
B22 变量提升与函数提升
var a =3
function fn(){
console.log(a)
var a = 4
}
fn()
//面试题: 输出undefined
//以上过程等于 function fn(){
var a
console.log(a)
a = 4
}
1、变量声明提升
通过var定义声明的变量,在定义语句之前就可以访问到
值:undefined
2、函数声明提升
通过function声明的函数,在之前就可以直接调用
值:函数定义
先执行变量提升,再执行函数提升
B23 执行上下文
1、代码的分类
全局代码
函数(局部)代码
2、全局执行上下文
在执行全局代码前将window确定为全局执行上下文
对全局数据进行预处理:
*var定义的全局变量==>undefined,添加为window的属性
*function声明的全局函数==>赋值(fun),添加为window的方法
*this==>赋值(window)
开始执行全局代码
3、函数执行上下文
在调用函数,准备执行函数体之前,创建相应的函数执行上下文
对局部数据进行预处理
*形参变量==>赋值(实参)>添加为执行上下文属性
*arguments>赋值(实参列表),添加为执行上下文属性
*var定义的局部变量==>undefined,添加为执行上下文的属性
*function声明的函数==>赋值(fun),添加为执行上下文属性
*this==>赋值(调用函数的对象)
开始执行函数体代码
B27 作用域与作用域链
- 理解:
- 作用域: 一块代码区域, 在编码时就确定了, 不会再变化
- 作用域链: 多个嵌套的作用域形成的由内向外的结构, 用于查找变量
- 分类:
- 全局
- 函数
- js没有块作用域(在ES6之前)
- 作用
- 作用域: 隔离变量, 可以在不同作用域定义同名的变量不冲突
- 作用域链: 查找变量
- 区别作用域与执行上下文
- 作用域: 静态的, 编码时就确定了(不是在运行时), 一旦确定就不会变化了
- 执行上下文: 动态的, 执行代码时动态创建, 当执行结束消失
- 联系: 执行上下文环境是在对应的作用域中的
B30 闭包理解
1、如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包
2、闭包是什么
使用chrome调试查看,
理解一:闭包是嵌套的内部函数(绝大部分人)
理解二:包含被引用变量(函数)的对象(极少数人)
注意:闭包存在于嵌套的内部函数中
3、产生条件
函数嵌套
内部函数引用了外部函数的数据