1.数据类型
1.1数据类型分两类
- 基本(值)类型
- string:任意字符串
- number:任意的数字
- boolean:true/false
- undefined:undefined
- null:null
- 对象(引用)类型
- object:任意对象
- function:一种特别的对象(可以执行)
- array:一种特别的对象(数值下标)
1.2判断数据类型
- typeof:
- 可以判断:undefined、数字、字符串、布尔值、function
- 不可判断:unll与object、array与object
- instanceof:
- 判断对象的具体类型
- ===
- 可以判断:undefind,null
代码示例
var a = {
b:[1,4,'tom'],
c: function() {
console.log(c);
}
}
console.log(a instanceof Object,a instanceof Array) // true false
console.log(a.b instanceof Array,a.c instanceof Function) // true true
console.log(typeof a.b === 'array') // true
1.3相关问题:
1.undefined与null的区别?
- undefined代表定义了但未赋值
- null代表定义了也赋值了,只是值为null
var a
console.log(a) //undefined
a = null
console.log(a) // null
2.什么时候给变量赋值为null?
- 初始赋值,表明将要赋值为对象
- 结束前,让对象成为垃圾对象(被垃圾回收器回收)
var b = null //初始赋值为null,表明将要赋值为对象
//确定对象就赋值
b = ['Tom',123]
//最后
b = null //让b指向的对象成为垃圾对象(被垃圾回收器回收)
3.严格区别变量类型与数据类型?
- 数据的类型
- 基本类型
- 对象类型
- 变量的类型 (变量内存值的类型)
- 基本类型:保存的就是基本类型的数据
- 引用类型:保存的是地址值
2.数据_内存_变量
2.1 什么是数据?
- 存储在内存中代表特定信息的东西,本质上是010101001…
- 数据的特点:可传递,可运算。
- 一切皆数据,函数也是数据。
2.2 什么是内存?
- 内存条通电后产生的可存储数据的空间(临时的)。
- 内存产生和死亡:内存条(电路板)==> 通电 ==> 产生内存空间 ==> 存储数据 ==> 处理数据 ==> 断电 ==> 内存空间和数据都消失。
- 一块小内存的两个数据
- 内部存储的数据
- 地址值
- 内存分类
- 栈:全局变量/局部变量
- 堆:对象
- 什么是变量?
- 可变化的量,由变量名和变量值组成
- 每个变量都对应一块小内存,变量名用来查找对应的内存,变量值就是内存中的保存的数据
2.3 内存、数据、变量三者之间的关系
- 内存用来存储数据的空间
- 变量是内存的标识
2.4 相关问题:
1.关于赋值和内存的问题
问:var a = xxx , a内存中保存的到底是什么?
- xxx是基本数据,保存的就是这个数据
- xxx是对象,保存的是对象的地址值
- xxx是一个变量,保存的是xxx的内存内容(可能是基本数据,也可能是地址值)
2.关于引用变量赋值的问题
- n个引用变量指向同一个对象,通过一个引用变量修改对象内部数据,其他所有引用变量看到的都是修改后的数据
- n个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,其他所有引用变量依然指向前一个对象
<script type="text/javascript">
var obj1 = {name:'Tom'}
var obj2 = obj1
obj2.age = 12
console.log(obj1.age) // 12
function fn(obj) {
obj.name = 'Jack'
}
fn(obj1)
console.log(obj2.name) // Jack
**************************************
var a = {age:12}
var b = a
a = {name:'Bob',age:18}
b.age = 14
console.log(b.age,a.name,a.age) // 14 Bob 18
function fn2(obj) {
obj = {age:15}
}
fn2(a)
console.log(a.age) // 18
</script>
3.关于数据传递的问题
问:在js调用函数传递变量参数时,是值传递还是引用传递
- 理解1:都是值(基本值/地址值)传递
- 理解2:可能是值传递,也可能是引用传递(传递地址值)
<script type="text/javascript">
var a = 3;
function fn() {
a = a + 1;
console.log(a,'a2') // 4 a2
}
fn(a)
console.log(a,'a1') // 3 a1
function fn2(obj) {
console.log(obj.name) //Tom
}
var obj = {name:'Tom'}
fn2(obj)
</script>
4.问:JS引擎如何管理内存?
1.内存生命周期
- 分配小内存空间,得到它的使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
2.释放内存
<script type="text/javascript">
var a = 3
var obj = {}
obj = undefined
function fn(){
var b = {}
}
fn() //b是自动释放,b所指向的对象是在后面的某个时刻由垃圾回收器回收
</script>