JS数据结构

1.分类:

基本(值)类型
基本数据类型都是单一的值“hello” 123 true
创建的对象都是独立的,不能成为一个整体

  • String:任意字符串
  • Number:任意的数字
  • boolean:true/false
  • undefined:undefined
  • null:null

对象(引用)类型
属于一种复合的数据类型,在对象中可以保存多个不同的数据类型

  1. 内建对象 - - -由ES标准中定义的对象,在任何的ES的实现中都可以使用,比如:Math,String,Number,Boolean,Function,Object…
  2. 宿主对象 - - -由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象,比如BOM,DOM
  3. 自定义对象 - - -由开发人员自己创建的对象
  • Object:任意对象
  • Function:一种特别的对象(可以执行)
  • Array:一种特别的对象(数值下标,内部数据是有序的)

2、判断

  • typeof:返回数据类型的字符串表达
    可以判断:undefined/数值/字符串/布尔值/function
    不能判断:区别 null与Object object与array

  • instanceof:判断对象的具体类型

  • ===
    可以判断undefined

3.几个例子:

  1. 值类型判断
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'
  1. 对象类型判断
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. 几个问题:

  1. 什么是类型对象和实例对象?
function Person(name,age){//构造函数  类型对象
this.name=name;
this.age=age;
}
var p=new Person('tom',12)//根据类型创建的实例对象
//Person('tom',12);//也可以调用函数,但不是作为构造函数来调用,一般不会这么使用
  1. undefined与null的区别
  • undefined代表定义未赋值
  • null代表定义赋值为null
  1. 什么时候给变量赋值为null
  • 初始赋值,表明将要赋值为对象
  • 结束前,让对象成为垃圾对象(被垃圾回收器回收)
  1. 严格区别变量类型与数据类型

    数据的类型
    			* 基本类型
    			* 对象类型
    变量的类型(变量内存值的类型)
    			* 基本类型:保存的就是基本类的数据
    			*引用类型:保存的是地址值
    
  2. 内存

2个数据: 内部存储的数据 地址值
内存分类:
栈:全局变量和局部变量 堆:对象
基本数据类型的值直接在栈内存中存储,值与值之间是独立的,修改一个变量不会影响其他的
对像是保存到内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存的地址(对象的应用)

  1. 内存,数据,变量三者之间的关系

内存用来存储数据的空间
变量是内存的标识

  1. var a=xxx;a内存中保存的是什么

xxx是基本数据,保存的就是这个数据
xxx是对象,保存的是对象的地址值
xxx是一个变量,保存的xxx
的内存内容(可能是基本数据,也可能是地址值)

  1. 关于引用变量赋值问题
  • 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
  1. js调用函数传递变量参数时,是值传递还是引用传递

都是值传递(基本值或者地址值)
可能是值传递,也可能是引用传递(地址值)

  1. JS引擎如何管理内存
    1. 内存生命周期
      - 分配小内存空间,得到他的使用权
      - 存储数据,可以反复进行操作
      - 释放小内存空间
      -

    2. 释放内存

      • 局部变量:函数执行完自动释放
      • 对象:成为垃圾对象==》垃圾回收器回收
function fn(){
var b={};
}
fn();//b是自动释放,b所指向的对象实在后面的某个时刻由垃圾回收器回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值