文章目录
- 1. 数据类型
- 1.1. 常见数据类型
- 1.2.数据类型判断:
- 1.3.underfined与null的区别
- 1.4.什么时候给变量赋值为null
- 1.5. 严格区别变量类型与数据类型:
- 2. 数据变量和内存
- 2.1. 什么是数据
- 2.2. 什么是内存
- 2.3. 什么是变量
- 2.4.内存、数据、变量三者关系
- 问题1:var a=xxx,a内存中到底保存的是什么?
- 问题2:关于引用变量赋值问题
- 问题3. 在js调用函数时传递变量参数时,是值传递还是引用传递?
- 问题4. JS引擎如何管理内存
- 3. 对象
- 3.1 什么是对象?
- 3.2 为什么要用对象?
- 3.3 对象的组成属性
- 3.4 如何访问对象内部数据?
- 什么时候必须使用['']方式
- 4. 函数
- 为什么要用函数?
- 如何定义函数?
- 如何调用函数?
- 回调函数
- IIFE
1. 数据类型
1.1. 常见数据类型
1.基本(值)类型: String、Number、boolean、undefined、null、Symbol(es6新增)
2.对象(引用)类型:
object:任意对象
function:一种特别的对象(可以执行)
Array:一种特别的对象(数值下标、内部数据是有序的)
1.2.数据类型判断:
- typeof: 返回数据类型的字符串表达,
- 可以判断undefined、数值、字符串、布尔值、function
- 不能判断:null与object 、object与array
- instanceof:判断引用对象是不是某对象的实例(具体类型)
- === / ==:可以判断undefined、null
var b1 = {b2:[1,'atguigu',console.log],b3:function (){console.log('b3')
}}
console.log(b1 instanceof Object,b1 instanceof Array) // true false
console.log(b1.b2 instanceof Array,b1.b2 instanceof Object) // true true
console.log(b1.b3 instanceof Function,b1.b3 instanceof Object) // true true
console.log(typeof b1.b3 === 'function') // true
1.3.underfined与null的区别
underfined代表定义未赋值
null定义赋值了,但值为null
1.4.什么时候给变量赋值为null
初始赋值为null,表明将要赋值为对象,确定对象就赋值;
最后赋值为null(让指向的对象成为垃圾对象被垃圾回收器回收)释放内存
1.5. 严格区别变量类型与数据类型:
- 数据类型
- 基本类型
- 对象类型
- 变量类型(变量内存值的类型)
- 基本类型:保存的是基本类型的数据
- 引用类型:保存的是地址值
2. 数据变量和内存
2.1. 什么是数据
- 存储在内存中代表特定信息的东西,本质上是0101二进制数据
- 特点:可传递、可运算
2.2. 什么是内存
内存条通电后产生的可存储数据的空间(临时的),而硬盘的空间是持久的
内存产生和死亡:内存条(电路版)=>通电=>产生内存空间=>存储数据=>处理数据=>断电=>内存空间和数据都消失
- 释放内存:清空内存中的数据,标识内存可以再分配使用(内存不释放就不能复用)
- 自动释放:栈空间的局部变量
- 垃圾回调器回调:堆空间的垃圾对象(没有一个指针指向的时候就是垃圾对象)
内存分类:
- 栈:全局变量/局部变量
- 堆:对象
2.3. 什么是变量
可变化的量,由变量名和变量值组成;
每个变量都对应一块小内存,变量名用来查找对应的内存,变量值就是内存中保存的数据
变量名就是内存地址的别名
var obj={name:'Tom'};var a=obj
obj读的是内容,但内容是一个地址
2.4.内存、数据、变量三者关系
内存是用来存储数据的空间
问题1:var a=xxx,a内存中到底保存的是什么?
xxx如果是基本数据,保存的就是这个数据;
如果是对象,保存的就是对象的地址值;
如果是一个变量,保存的是xxx的值(基本数据或地址值)
问题2:关于引用变量赋值问题
- 几个引用变量指向同一个对象(引用变量指向的都是同一个地址值),其中一个变量修改数据其他变量的数据也会改变
- 2个变量指向同一个对象,让其中的一个引用变量指向另一个引用对象,另一个引用变量依然指向前一个对象
var a={age:12]
var b=a 前两行a和b都指向同一个地址值的堆
a={name:'BOB'] 这里a指向先前的地址改变了,重新指向了name这块地址;而b还是不变,因此b只有age,没有name
console.log(b.age)
2:结果是13;函数里就相当于 var obj = a; obj = {age:15};在调用完函数后函数内部的局部变量会被释放
问题3. 在js调用函数时传递变量参数时,是值传递还是引用传递?
理解1:值(基本/地址值)传递(把传参的值传递给形参)
理解2:可能是值传递也可能是引用传递(实参传给形参的值根据自身而定,实参如果是一个对象,传递的就是地址值)
var a=3;function fn(a){a=a+1;}fn(a);console.log(a);//3
问题4. JS引擎如何管理内存
-
内存生命周期:
分配小内存空间,得到他的使用权 存储数据,可以反复进行操作
释放小内存空间
var a=3;obj={};obj=null
占两个内存空间,{}对象被释放掉了 -
释放内存
局部变量:函数执行完自动释放
对象:成为垃圾对象==>垃圾回收器回收
3. 对象
3.1 什么是对象?
代表现实中的某个事物,是该事物在编程中的抽象
多个数据的集合体(封装体)
用于保存多个数据的容器
3.2 为什么要用对象?
便于对多个数据进行统一管理
3.3 对象的组成属性
代表现实事物的状态数据
属性:由属性名(字符串类型)和属性值组(任意类型)组成
方法:一种特殊属性,属性值是函数
代表现实事物的行为数据
3.4 如何访问对象内部数据?
.属性名: 编码简单,但有时不能用
[‘属性名1’]: 编码麻烦,但通用
什么时候必须使用[‘’]方式
1.属性名包含特殊字符:- 空格
2.变量名不确定(属性名是个变量)
yar propName ='myAge'
var value =18//p.propName value //不能用
p[propName]=value
4. 函数
实现具有特定功能的封装体
为什么要用函数?
提高代码复用
如何定义函数?
函数声明、表达式
如何调用函数?
1.test():直接调用
2.obj,test():通过对象调用
3.new test():new调用
4.test.call/apply(obj):临时让test成为obj的方法进行调用
回调函数
自己定义一个函数,没有自己调,系统去帮你调用,这就是回调函数
常见的回调函数:
dom事件回调函数
定时器回调函数
ajax请求回调函数
生命周期回调函数
IIFE
立即调用函数表达式(匿名函数自调用)
作用:1.隐藏内部实现
2.不会污染外部(全局)命名空间