JavaScript之对象

1.生成方法
对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

    var  obj={
        foo:'red',    //键值对    
        bar:'blue'
    };
    console.log(obj);
   /* Object{
    bar : "blue"
    foo : "red"
    }
    */

释义:大括号定义了一个对象,特备赋值给变量obj,所以obj就指向一个对象,该对象内包含两个键值对(或者成员),
其中,foo是“键名(成员名)” 字符串red是键值(成员的值), 其中,键名与键值之间用冒号分隔,两个键值之间用逗号分隔。(对象的每一个键名又称之为属性(property))

1.1如果键名是数值,则被自动转为字符串
1.2键名不符合标志明的条件(比如第一个字符为数字或者空格,运算符),并且也不是数字的时候,必须加上单引号,否则会报错

//报错
var obj={
       1p:'hello'
   };


//正确
var obj={
       '1p':'hello'//开头字母为数字
       'h w':'hello',  //含有空格
       'p+q':'hello'   //含有运算符
   };

1.3对象的每一个键名又称为“属性”(property) ,他的“键值可以是任何数据类型”,如果一个属性的值为“函数” 通常把这个属性成为“方法”。它可以像函数那样被调用

  var obj={
      p:function (x) {
          return x*x;
      }

  }
      console.log( obj.p(2));  //4

1.4如果属性的值还是一个对象,就可以形成链式引用


var O1={};
var O2={bar:'hello'};

O1.foo=O2;   //o1对象的foo属性指向o2
   console.log( O1.foo.bar);   //hello

1.5属性可以动态添加,不用在对象声明时候就指定

var   obj={};
obj.foo='hello';
console.log(obj.foo);  //hello

2.对象的引用
2.1如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

  var ob1={};
    var ob2=ob1;
    ob1.a=2;
    console.log(ob2.a);    //2
    /*
ob1和ob2指向同一个对象
因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。

*/

2 .2如果取消某一个变量对于原对象的引用,不会影响到另一个变量

  var ob1={};
    var ob2=ob1;
    ob1.a=2;
    console.log(ob2);    //object 
    ob1和ob2指向同一个对象,然后ob1的值变为2,这时不会对ob2产生影响。ob2还是指向原来的对象。

2.3这种引用仅局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

var x=1;
var y=x;
x=2;
console.log(y);    //1
当x的值发生变化后,y的值还是原本的1,这表明x和y不是指向同一个内存地址

3.关于大括号内是表达式(对象)还是语句
为了避免这种歧义,JavaScript 规定,如果行首是大括号,一律解释为语句(即代码块)。如果要解释为表达式(即对象),必须在大括号前加上圆括号。

  console.log(eval('{foo:123}'));   //123
    console.log(eval('({foo:123})'))   //{foo:123}
    //第一个大括号内为语句块,输出的是语句的内容值
    //第二个大括号内的为对象(表达式)  输出的类型为对象

4.属性的操作
4.1读取属性:1.使用点运算符 2.使用方括号

 var obj={
      p:'hello'
  };
  console.log(obj.p);   //hello
  console.log(obj['p'])    //hello
  (特别注意:如果使用方括号 键名必须放在单引号里面,否则会被当作变量)

var foo='bar';
var obj={
    foo:1 ,
    bar :2
}
console.log(obj.foo) ; // 1
    console.log(obj[foo]);   //2 
《上面的例子就是对象obj引用foo属性的,输出的值就是字符串1(数字键可以不加引号,会自动转换为字符串),然而方括号引用的时候,没有加单引号,所以foo会被当作变量和使用。指向的是字符串bar》

数字键可以不加引号,因为可以自动转换为字符串,但是你在读取属性值的时候,点运算符需要加没法用,只能用方括号,将属性值直接写在方括号里面即可。

  var obj={
       123:'hello world'
   };

   //obj.123;//报错

   console.log( obj[123]) ;   //hello world

4.2属性的赋值:(1.点运算符 2.方括号运算符)
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。

 var obj={

 };
 obj.foo='hello';
 obj['bar']='world';  //必须加引号
  console.log(obj.foo); //hello
 console.log(obj.bar); //world

4.3查看使用属性(Object.keys)
查看一个对象本身的所有属性,可以使用Object.keys方法。


var obj={
    key1:1,
    key2:2

};
console.log(Object.keys(obj));
//['key1','key2']

4.4delete命令
1.delete命令用于删除对象的属性,删除成功后返回true。

    var obj = {p: 1};
    console.log(obj);
    console.log(Object.keys(obj));  //["p"]
   console.log( delete  obj.p) ;// true
    console.log(obj.p);   //undefined
    console.log(Object.keys(obj));   //[]

2.删除一个不存在的属性,delete不报错。而且返回true

var obj={

};
console.log(delete obj.p);   //true
不能根据delete命令的结果,认定某个属性是存在的。

3.delete返回false,本篇不做记录
4.delete只能删除对象本身的属性,无法删除继承的属性

5.in运算符
1.in运算符用于检查对象是否包含某个属性(注意,检查的是键名,不是键值),如果包含就返回true,否则返回false。

var obj={p:1};
console.log('p' in obj);   //true

但是in运算符的一个问题是,他无法识别哪些属性是自身的,哪些属性是继承的。
2.for..in循环 (用来遍历一个对象的全部属性)

var obj={
    a:1,
    b:2,
    c:3
};
for(var i in obj){
    console.log(obj[i])
}  
//1
//2
//3

3.for…in循环来提取对象属性

var obj={
    x:1,
    y:2
};
var Arr=[]; //定义一个数组来存值
var i=0;
for(var a in obj){
    Arr[i++]=a
}
console.log(Arr);  //['x','y']

注意:
1.它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
2.它不仅遍历对象自身的属性,还遍历继承的属性。

var obj={

};
obj.toString();
for(var p in obj){
    console.log(p)
}   //没有任何输出
对象obj继承了toString属性,该属性不会被循环遍历到,因为该循环默认为“不可遍历”。

3.一般情况下,都是只想遍历对象自身的属性,所以使用for…in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。

var person={
    name:'张三'
};
for(var key in person){
    if(person.hasOwnProperty(key))
   console.log(key);  //name
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值