数据类型
-
分类
-
基本(值)类型
- String : 任意字符串
- Number : 任意数据
- Boolean : true/false
- Undefined : undefined
- Nul : null
-
对象(引用)类型
- Object : 任意对象
- Function : 一种特别的对象(可以执行)
- Array : 一种特别的对象(数值下标, 内部数据是有序的)
- Object : 任意对象
-
-
判断
-
typeof
- typeof 可以判断 :undefined / 数值 / 字符串 /布尔值 /function
- 不能判断: null和object / array和object
- typeof返回数据类型的字符串表达
-
instanceof
- 判断对象的具体类型
-
===
- 可以判断: undefined , null (因为这两个只有一个值)
//基本类型 var a; console.log(a, typeof a, typeof a==='undefined', a===undefined); //undefined 'undefined' true true var a = 2; console.log(typeof a==='number'); //true var a = 'abc'; console.log(typeof a==='string'); //true var a = true; console.log(typeof a==='boolean'); //true var a = null; console.log(typeof a, a===nyll); //'object' true//对象 var b1 = { b2: [1, 'abc', console.log], b3: function () { console.log('b3'); return function () { return 'blackC' } } } 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 Object, b1.b3 instanceof Object); //true true console.log(typeof b1.b3==='function') //true console.log(typeof b1.b2[2]==='function') //true b1.b2[2](4); //4 相当于输出语句输出4 console.log(b1.b3()()); //b3 'balckC'
-
-
Q&A
-
undefined和null的区别
- undefined代表定义未赋值
- null代表定义并赋值了, 只是值为null
-
什么时候给变量赋值为null
初始赋值为null, 表明将要赋值为对象
-
结束前赋值为null, 目的是让其指向的对象成为垃圾对象(没有引用指向它), 以便于被浏览器中的垃圾回收器回收(释放对象)
var b = null; b = ['xyx', 12]; b = null; //此时['xyx', 12]没有引用指向它, 就变成了垃圾对象
-
严格区分变量类型和数据类型
- 数据的类型
- 基本类型
- 对象类型
- 变量的类型(变量内存值的类型)
- 基本类型: 保存就是基本数据的数据
- 引用类型: 保存的是地址值
- 数据的类型
-
数据_变量_内存
-
数据
- 存储在内存中代表特定信息的, 本质上是0101..(二进制数)
- 数据的特点: 可读与可传递
-
内存
- 内存条通电后产生的可存储数据的空间(临时的)
- 内存产生和死亡: 内存条(电路板) ==> 通电 ==> 产生内存空间 ==> 处理数据 ==> 断电 ==> 内存空间和数据都消失
- 内存的空间是临时的, 硬盘的空间是持久的
- 释放内存: 清空内存中的数据, 标识内存可以再分配使用(内存不释放就不能复用)
- 自动释放: 栈空间的局部变量
- 垃圾回调器回调: 堆空间的垃圾对象
- 一块内存的2个数据
- 内部存储的数据
- 地址值
- 内存分类
- 栈 : 全局变量/ 局部变量(空间较小)
- 堆 : 对象(空间较大)
-
变量
- 可变化的量, 由变量名和变量值组成
- 每个变量都对应的一块小内存, 变量名用来查找对应的内存, 变量值就是内存中保存的数据
-
内存/数据/变量三者之间的关系
- 内存用来存储数据的空间
- 变量是内存的标识
-
关于赋值和内存的问题
- var a = xxx , a内存中保存的是什么?
- xxx是基本数据, 保存的就是这个数据
- xxx是对象, 保存的是对象的地址值
- xxx是变量, 保存的是变量的内存内容(可能是基本数据, 也可能是地址值)
- var a = xxx , a内存中保存的是什么?
-
关于引用变量赋值问题
-
n个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 其他所有变量看到的是修改之后的数据
var obj1 = {name: 'Tom'} var obj2 = obj1; obj2.age = 12; console.log(obj1.age);//12 function fn (obj) { obj.name = 'BOb' } fu(obj1); console.log(obj2.name); //Bob -
2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一个引用变量依然指向前一个对象
var a = {age: 12} var b = a a = {name: 'bob', age: 13} console.log(b.age, a.name, a.age) // 12 bob 13var a = {name: 'bob', age: 13} function fn(obj){ //obj是形参 obj = {age: 15} } fn(a)//形参指向另一个对象, 所以实参a的值不变 console.log(a.age) //13
-
-
关于数据传递的问题
-
在js调用函数时传递变量参数时, 是值传递还是引用传递
是值(基本/地址值)传递
-
可能是值传递, 也可能是引用传递(地址值)
var a = 4; function fn(a){ a = a + 1 } fn(a) console.log(a) //4 function fn2(obj){ console.log(obj.name) } var obj = {name: 'tom'} fn2(obj)
-
-
内存管理
-
JS引擎如何管理内存
-
内存生命周期
- 分配小内存空间, 得到它的使用权
- 存储数据, 可以反复进行操作
- 释放小内存空间
-
释放内存
- 局部变量: 函数执行完自动释放
- 对象: 成为垃圾对象 ==> 垃圾回收器回收
var a = 3; var obj = {} obj = undefined function fn(){ var b = {} } fn() // b是自动释放, b所指向的对象时在后面的某个时刻由垃圾回收器回收
-
-