珠峰培训

js数据类型详解二

作者:wy

2016-07-08 09:18:33

230

javascript引用数据类型

上一讲 Js数据类型详解一主要了解了下基本数据类型,本讲我们来了解下引用数据类型

引用数据类型包含对象数据类型和特殊类型(function)

引用数据类型之对象类型

1.基本数据类型和对象类型的区别:

  • 基本数据类型的数据只能存储一个值存,只能是一种数据类型
    对象类型的数据可以存储多种数据类型的数据,是多种数据类型的复合载体.
  • 对象类型的数据是由多个属性组成(或者说是多个键值对组成),每个键值对之间都相互有些关联,整体就构成了对这个对象的描述

那定义变量时该定义成什么数据类型的呢?这是由需求决定的,是由你看待事物的角度不一样决定的

比如:var money = 10 ,这样就定义了一个10块钱的人民币
但是如果你这样定义:

var money = {"price":10,"width":"40px","height":"50px","weight":"10px"},那我们通过定义对象的方式,对这个人民币整体描述了下它的特征,所以你到底是只想知道这仅仅是10块钱,还是想知道这个10块钱具体的特征,比如长宽重量等

2.对象的概念

一个对象有多个属性组成,每个属性名和属性值之间以逗号隔开,一对属性名和属性值也称之为键值对

例如:

 var objPerson = {"name":"Lucy","age":18,"height":"165","hobby":"sleep","address":"beijing"};

3.定义一个对象的方式


var obj1 = {};//对象直接量的方式
var obj2 = new Object(); //创建实例的方式
var obj3 = Object.create(null);//一般用在对象继承的场合

4.操作对象

对象的操作可以参考对数据库的操作,从四个方面 增,删,改,查 并且都有两种方式来操作,一个是打点的方式,另一种是数组表示法
以下为了演示,把这两种方式都写了下


var obj = {};//定义了一个空对象
->增加
obj.name = "rose";//打点的方式
obj["name"]="rose";//数组表示法
obj->{"name":"rose"}
->修改
obj.name = "amy"
obj["name"] = "amy";
obj->{"name":"amy"}
修改和增加的操作方式一样的,如果存在这个属性名,则给这个属性名重新赋值时表示修改,如果不存在这个属性名,则表示添加
->删除 真删除和假删除
obj.name = null;
obj["name"] = null;
obj ->{name: null} 这种方式是假删除,因为name属性还存在,如果想从内存中彻底消失,则得通过delete来删除

delete obj.name
delete obj["name"] 真删除
obj -> {}

5.对象的引用

var obj = {“name”:”aa”};
其实定义了一个对象 ,在内存空间里进行了三步操作:

  • 1.在栈内存里开辟一个空间,存储变量obj
  • 2.在堆内存里开辟一个内存空间,假设引用地址是xxff00,把属性名和属性值存进来
  • 3.把引用地址xxff00赋值给obj,这样obj就指向了开辟的堆内存

注意:引用类型的数据操作都是引用地址,并非直接操作的是内存空间

6.表达式还是语句?

对象定义的方式采用{“name”:”lily”}的方式,在Javascript中,如果行首是{},一律会被解析成语句(即代码块)

因此如果你直接这样写:
{“name”:”lily”}
会报这样的错Uncaught SyntaxError: Unexpected token ,
那如果想要在对象这边表达的是表达式,而非语句,要怎么办呢?
只需要拿()把对象包起来即可
({“name”:”lily”})

对像这边的细节知识点:
如果对象的属性名是数字,操作的时候只能以[]的方式获取,方括号里的引号可有可无,一般不写
var obj={0:”11”,1:”22”,2:”33”}
属性名可以是数字,操作时只能这样
获得第一个属性值->obj[0]
修改第一个属性值->obj[0] = “aaa”;

对象是由多个属性组成的,如果需要依次的获得每个属性名和属性值,则得对对象进行遍历
遍历对象通过for…in..循环来遍历

 var objPerson = {"name":"Lucy","age":18,"height":"165","hobby":"sleep","address":"beijing"};

for(var attr in objPerson){

console.log(attr);//把每个属性名打印出来
console.log(objPerson[attr]);//把每个属性值打印出来

}
对for..in 循环分析:
in关键词用来判断对象中是否存在某个属性 例如 "name" in objPerson 如果存在则返回true,不存在则返回false
上面()里表示:在objperson对象里,定义了一个变量attr,遍历时,分别表示每个属性名,也就是说attr的值是一直变化的
第一次 attr -> "name"
第二次 attr -> "age"
第三次 attr -> "height"
......

注意:上面objPerson[attr]把每个属性值打印出来,不能写成objPerson[“attr”]或者objPerson.attr 这两种写法操作的都是固定的一个属性名attr.而在for…in…循环中attr是个变量,一直变化的值

学到后面大家还会知道for…in…遍历还有两个特点:
  • 1.它遍历的是对象所有可遍历(enumberable)的属性,会跳过不可遍历的属性
  • 2.它不仅遍历对象自身的属性,还遍历继承的属性