基本数据类型:
- String
- Number
- Boolean
- Undefined
- Null
- Symbol
- BigInt
对象类型
- Object:任意对象
- Array: 一种特别的对象(拥有数值下表,内部数据是有序的)
- Function: 一种特别的对象(可以执行)
判断数据类型的方法
- typeof
- 返回数据类型的字符串表达式(全小写)
- 无法区分object和null,object和array(都返回object)
- instanceof
- 判断对象的具体类型
- 用来判断A是否为B的实例,表达式为:
A instanceof B
,如果A是B的实例,则返回true,否则返回false。instanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型
- ===
可以判断undefined,null
- Object.prototype.toString()
Object.prototype.toString.call('') //[object String]
最准确的判断方法
- constructor
- 当一个函数F被定义时,JS引擎会为F添加prototype原型,然后在prototype上添加一个constructor属性,并让其指向F的引用,F利用原型对象的constructor属性引用了自身,当F作为构造函数创建对象时,原型上的constructor属性被遗传到了新创建的对象上,从原型链角度讲,构造函数F就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型
''.constructor == String //true
undefined和null的区别?
- undefined代表定义未赋值
- null定义并赋值了,只是值为null
什么时候给变量赋值为null?
- 初始赋值,表明将要赋值为对象
- 结束前,让对象成为垃圾对象(被垃圾回收器回收)
严格区别变量类型和数据类型?
- 数据的类型
- 变量的类型(变量内存值的类型)
- 基本类型:保存的就是基本类型的数据
- 引用类型:保存的是地址值
数据的特点
内存中所有操作的目标:数据
什么是内存?
- 内存条通电猴产生的可储存数据的空间(临时的)
- 内存产生和死亡:内存条(电路板)->通电->产生内存空间->存储数据->处理数据->断电->内存空间和数据消失
- 一块小内存的2个数据
- 内存分类
什么是变量
- 可变化的量,由变量名和变量值组成
- 每个变量都对应的一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
内存,数据,变量三者之间的关系
var a = xxx,a内存中到底保存的是什么?
- xxx是基本数据,保存的就是这个数据
- xxx是对象,保存的是对象的地址值
- xxx是一个变量,保存的xxx的内存内容(可能是基本数据,也可能是地址值)
var a = {age: 12}
var b = a
a = {name: 'Bob',age: 13}
b.age = 14
console.log(b.age,a.name,a.age) // 14 Bob 13
a = {name: 'Bob',age: 13}
function fn(obj) {
obj = {age: 15}
}
fn(a)
console.log(a.age) //13
//因为刚开始a指向{age:13}的内存空间,在fn函数中,obj被赋值a,故它一开始也指向了{age:13}的内存空间,但后面又重新定义了obj, obj = {age: 15},此时obj不再指向{age:13},而是指向{age: 15}。现在obj和a指向的不是同一块内存空间
在js调用函数时传递变量参数时,是值传递还是引用传递?
js引擎如何管理内存?
- 内存生命周期
- 分配小内存空间,得到它的使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
- 释放内存
- 局部变量:函数执行完自动释放
- 对象:成为垃圾对象->垃圾回收器回收
什么是对象
- 多个数据的封装体
- 用来保存多个数据的容器
- 一个对象代表现实中的一个事物
为什么要用对象?
对象的组成
- 属性:属性名(字符串)和属性值(任意)组成
- 方法:一种特别的属性(属性值是函数)
什么时候必须使用['属性名']的方式?
什么是函数
- 实现特定功能的n条语句的封装体
- 只有函数是可以执行的,其它类型的数据不能执行
为什么要用函数
如何调用(执行)函数
- test():直接调用
- obj.test():通过对象调用
- new test():new调用
- test.call/apply(obj):临时让test成为obj的方法进行调用
什么是回调函数
常见的回调函数
document.getElementById('btn').onclick = function() {
...
}
- 定时器回调函数
- ajax请求回调函数
- 生命周期回调函数
this是什么?
- 任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
- 所有函数内部都有一个变量this
- 它的值是调用函数的当前对象
如何确定this?
- test(): window
- p.test(): p
- new test(): 新创建的对象(该构造函数创建出来的实例对象)
- p.call(obj): obj