JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。 
 
 
  
  JavaScript的对象用于描述现实世界中的某个对象。例如,为了描述“小明”这个淘气的小朋友,我们可以用若干键值对来描述他: 
 
 
  
   
   var 
   xiaoming = { 
  
 
   
       name: 
   '小明' 
   , 
  
 
   
       birth: 
   1990 
   , 
  
 
   
       school: 
   'No.1 Middle School' 
   , 
  
 
   
       height: 
   1.70 
   , 
  
 
   
       weight: 
   65 
   , 
  
 
   
       score: null 
  
 
   
   }; 
  
 
   
  
  JavaScript用一个 
  {...} 
  表示一个对象,键值对以 
  xxx: xxx 
  形式申明,用 
  , 
  隔开。注意,最后一个键值对不需要在末尾加 
  , 
  ,如果加了,有的浏览器(如低版本的IE)将报错。 
 
 
  
  上述对象申明了一个 
  name 
  属性,值是 
  '小明' 
  , 
  birth 
  属性,值是 
  1990 
  ,以及其他一些属性。最后,把这个对象赋值给变量 
  xiaoming 
  后,就可以通过变量 
  xiaoming 
  来获取小明的属性了: 
 
 
  
  
  访问属性是通过 
  . 
  操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用 
  '' 
  括起来: 
 
 
  
   
   var 
   xiaohong = { 
  
 
   
       name: 
   '小红' 
   , 
  
 
   
       
   'middle-school' 
   : 
   'No.1 Middle School' 
  
 
   
   }; 
  
 
   
  
  xiaohong 
  的属性名 
  middle-school 
  不是一个有效的变量,就需要用 
  '' 
  括起来。访问这个属性也无法使用 
  . 
  操作符,必须用 
  ['xxx'] 
  来访问: 
 
 
  
   
   xiaohong[ 
   'middle-school' 
   ]; 
   // 
   'No.1 Middle School' 
  
 
   
   xiaohong[ 
   'name' 
   ]; 
   // 
   '小红' 
  
 
   
   
  
  也可以用 
  xiaohong['name'] 
  来访问 
  xiaohong 
  的 
  name 
  属性,不过 
  xiaohong.name 
  的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过 
  object.prop 
  的形式访问一个属性了。 
   
  
  实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型。 
 
 
  
  如果访问一个不存在的属性会返回什么呢?JavaScript规定,访问不存在的属性不报错,而是返回 
  undefined 
  : 
 
 
  
   
   'use strict'; 
  
 
   
   
 
  
 
   
   var xiaoming = { 
  
 
   
       name: '小明' 
  
 
   
   }; 
  
 
   
   
 
  
 
   
  
   Run 
 
 
  
  
  由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性: 
 
 
  
   
   var 
   xiaoming = { 
  
 
   
       name: 
   '小明' 
  
 
   
   }; 
  
 
   
   xiaoming.age; 
   // undefined 
  
 
   
   xiaoming.age = 
   18 
   ; 
   // 新增一个age属性 
  
 
   
   xiaoming.age; 
   // 18 
  
 
   
   delete 
   xiaoming.age; 
   // 删除age属性 
  
 
   
   xiaoming.age; 
   // undefined 
  
 
   
   delete 
   xiaoming[ 
   'name' 
   ]; 
   // 删除name属性 
  
 
   
   
   delete 
   xiaoming.school; 
   // 删除一个不存在的school属性也不会报错 
  
 
   
  
  如果我们要检测 
  xiaoming 
  是否拥有某一属性,可以用 
  in 
  操作符: 
 
 
  
   
   var xiaoming = { 
  
 
   
       
   name: 
   '小明' 
   , 
  
 
   
       
   birth: 
   1990 
   , 
  
 
   
       
   school: 
   'No.1 Middle School' 
   , 
  
 
   
       
   height: 
   1.70 
   , 
  
 
   
       
   weight: 
   65 
   , 
  
 
   
       
   score: 
   null 
  
 
   
   }; 
  
 
   
   'name' 
   in 
   xiaoming; 
   // 
   true 
  
 
   
   'grade' 
   in 
   xiaoming; 
   // 
   false 
  
 
   
  
  不过要小心,如果 
  in 
  判断一个属性存在,这个属性不一定是 
  xiaoming 
  的,它可能是 
  xiaoming 
  继承得到的: 
 
 
  
  'toString' 
  in 
  xiaoming; 
  // 
  true 
 
 
  
  Object.keys(obj), 
  Object.values(obj) 
 
 
  
  var obj ={name:111,sex:12,dress:'sadfasdf'} 
 
 
  
  Object.keys(obj);//  
   ["name", "sex", "dress"] 
 
 
  
  Object.values(obj);//[111, 12, "sadfasdf”] 
 
 
  
  Object.is() 
 
 
  
   ES5 比较两个值是否相等  
 
 
  
   
 
 
 
  
  Object.assign() 
 
 
  基本用法
 
  
  Object.assign 
  方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。 
 
 
  
   
 
 
 
  
  因为 
  toString 
  定义在 
  object 
  对象中,而所有对象最终都会在原型链上指向 
  object 
  ,所以 
  xiaoming 
  也拥有 
  toString 
  属性。 
 
 
  
  要判断一个属性是否是 
  xiaoming 
  自身拥有的,而不是继承得到的,可以用 
  hasOwnProperty() 
  方法: 
 
 
  
   
   var xiaoming = { 
  
 
   
       
   name: 
   '小明' 
  
 
   
   }; 
  
 
   
   xiaoming.hasOwnProperty( 
   'name' 
   ); 
   // 
   true 
  
 
   
   xiaoming.hasOwnProperty( 
   'toString' 
   ); 
   //