1.分类:
基本(值)类型
基本数据类型都是单一的值“hello” 123 true
创建的对象都是独立的,不能成为一个整体
- String:任意字符串
- Number:任意的数字
- boolean:true/false
- undefined:undefined
- null:null
对象(引用)类型
属于一种复合的数据类型,在对象中可以保存多个不同的数据类型
- 内建对象 - - -由ES标准中定义的对象,在任何的ES的实现中都可以使用,比如:Math,String,Number,Boolean,Function,Object…
- 宿主对象 - - -由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象,比如BOM,DOM
- 自定义对象 - - -由开发人员自己创建的对象
- Object:任意对象
- Function:一种特别的对象(可以执行)
- Array:一种特别的对象(数值下标,内部数据是有序的)
2、判断
-
typeof:返回数据类型的字符串表达
可以判断:undefined/数值/字符串/布尔值/function
不能判断:区别 null与Object object与array -
instanceof:判断对象的具体类型
-
===
可以判断undefined
3.几个例子:
- 值类型判断
var a;
console.log(a,typeof a );//undefined 'undefined'
console.log(a,typeof a ,typeof a==='undefined',a===undefined)
//undefined,'undefined',true,true
console.log(undefined==='undefined');//false
var a=null;
console.log(typeof a,a===null);//'object'
- 对象类型判断
var b1={
b2:[1,'abc',console.log],
b2:function(){
console.log('b3');
return function(){
return 'hh';
}
}
}
console.log(b1 instanceof Object,b1 instanceof Array);//true false
console.log(b1.b2 instanceof Array,b1.b3 instanceof Object);//true true
console.log(b1.b3 instanceof Function);//true
console.log(typeof b1.b3==='function')//true
在对象类型中,需要注意不能只局限于表面的,如b1.b3执行的是函数,返回的也是函数,在输出时出现以下代码
console.log(b1.b3()());//输出hh
4. 几个问题:
- 什么是类型对象和实例对象?
function Person(name,age){//构造函数 类型对象
this.name=name;
this.age=age;
}
var p=new Person('tom',12)//根据类型创建的实例对象
//Person('tom',12);//也可以调用函数,但不是作为构造函数来调用,一般不会这么使用
- undefined与null的区别
- undefined代表定义未赋值
- null代表定义赋值为null
- 什么时候给变量赋值为null
- 初始赋值,表明将要赋值为对象
- 结束前,让对象成为垃圾对象(被垃圾回收器回收)
-
严格区别变量类型与数据类型
数据的类型 * 基本类型 * 对象类型 变量的类型(变量内存值的类型) * 基本类型:保存的就是基本类的数据 *引用类型:保存的是地址值
-
内存
2个数据: 内部存储的数据 地址值
内存分类:
栈:全局变量和局部变量 堆:对象
基本数据类型的值直接在栈内存中存储,值与值之间是独立的,修改一个变量不会影响其他的
对像是保存到内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存的地址(对象的应用)
- 内存,数据,变量三者之间的关系
内存用来存储数据的空间
变量是内存的标识
var a=xxx;
a内存中保存的是什么
xxx是基本数据,保存的就是这个数据
xxx是对象,保存的是对象的地址值
xxx是一个变量,保存的xxx
的内存内容(可能是基本数据,也可能是地址值)
- 关于引用变量赋值问题
- 2个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数据
var obj1={name:'Tom'};
//2个引用变量指向同一个对象
var obj2=obj1;
obj1.name='Jack';
obj2.age=12;
console.log(obj2.name);//Jack
console.log(obj1.age);//12
function fn(obj){
obj.name='A';
}
fn(obj1);
console.log(obj2.name);//A
- 2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个对象依然指向前一个对象
var a={age:12};
var b=a;
a={name:'Bob',age:13};
console.log(b.age,a.name,a.age);//12,Bob,13
function fn2(obj){
obj={age:15}
}
fn2(a);
/*初始将a赋值给obj(obj=a),
a和obj指向同一个对象(age:13),
进入函数后obj指向新的对象(age:15),
而a还指向原来的对象(age:13),
函数执行完obj被释放成为垃圾对象*/
console.log(a.age);//13
- js调用函数传递变量参数时,是值传递还是引用传递
都是值传递(基本值或者地址值)
可能是值传递,也可能是引用传递(地址值)
- JS引擎如何管理内存
-
内存生命周期
- 分配小内存空间,得到他的使用权
- 存储数据,可以反复进行操作
- 释放小内存空间
- -
释放内存
- 局部变量:函数执行完自动释放
- 对象:成为垃圾对象==》垃圾回收器回收
-
function fn(){
var b={};
}
fn();//b是自动释放,b所指向的对象实在后面的某个时刻由垃圾回收器回收