var myObj={ key:value, ... }
var myObj=new Object(); myObj.key=value;
var myObj={ a:2 }; myObj.a;//2——属性访问 myObj["a"];//2——键访问
能够在文字形式中使用[ ]包裹一个表达式来看成属性名。数组
从技术角度来讲,函数永远不会“属于”一个对象,因此把对象内部引用的函数称为“方法”是不妥的。
数组期待的是数值下标。最好只用对象来存储键/值对,只用数组来存储数值下标/值对。
若是试图向数组添加一个属性,可是属性名“看起来”像一个数组,那么它会变成一个数值下标(所以会修改数组的内容而不是添加一个属性)。
var newObj=Object.assign( {},myObject );
Object.assign方法的第一个参数是目标对象,以后还能够跟一个或多个源对象。它会遍历一个或多个源对象的全部可枚举的自有键,并把它们复制(使用=操做符赋值)到目标对象,最后返回目标对象。
var myObj={ a:2 }; Object.getOwnPropertyDescriptor(myObj,"a"); /*{ value:2, writable:true, enumerable:true, configurable:true }*/
普通的对象属性对应的属性描述符除了key:value,还包含另外三个特性:writable(可写)、enumerable(可枚举)、configurable(可配置,将其修改成false是单向操做,没法撤消)。函数
可使用Object.defineProperty(...)
来添加一个新属性或者修改一个已有属性(若是它是configurable)并对特性进行设置。this
Object.preventExtensions(...)
。Object.seal(...)
会建立一个密封的对象,其实是在一个现有对象上调用Object.preventExtensions(...)
并把全部现有属性标记为configurable:false。因此密封以后不只不能添加新属性,也不能从新配置或者删除任何现有属性(虽然能够修改属性的值)。Object.freeze(...)
会建立一个冻结对象,其实是在现有对象调用Object.seal(...)
并设置为writable:false,这样就没法修改它们的值。这是应用在对象上的级别最高的不可变性。对象默认的内置[[GET]]操做首先在对象中查找是否有名称相同的属性,若是找到就会返回这个属性的值。若是不管如何都没有找到名称相同的属性,那[[GET]]操做会返回值undefined。须要注意的是,这种方法和访问变量时是不同的。若是你引用了一个当前词法做用域中不存在的变量,并不会像对象属性同样返回undefined,而是会派出一个ReferenceError异常。code
一般来讲getter和setter是成对出现的。对象
var myObj={ a:2 }; ("a" in myObj);//true ("b" in myObj);//false myObj.hasOwnProperty("a");//true myObj.hasOwnProperty("b");//false
in操做符会检查属性是否在对象及其[[Prototype]]原型链中。hasOwnProperty(...)只会检查属性是否在myObj中,不会检查[[Prototype]]。ip
*:in实际上检查的是某个属性名是否存在。对于数组来讲这个区别很是重要,4 in [2,4,6]的结果并非你的期待的true,由于[2,4,6]这个数组中包含的属性名是0、一、2,没有4。原型链
propertyIsEnumerable(...)//会检查给定的属性名是否直接存在于对象中 Object.keys(...)//会返回一个数组,包含全部可枚举属性 Object.getOwnpropertyNames(...)//会返回一个数组,包含全部属性,不管是否可枚举
forEach(...)//会遍历数组中的全部值并忽略回调函数的返回值 every(...)//会一直运行直到回调函数返回false some(...)//会一直运行直到回调函数返回true
var myArray=[1,2,3]; for(var v of myArray){ console.log(v); } //1 //2 //3
var myObj={ a:2, b:3 }; Object.defineProperty(myObj,Symbol.iterator,{ enumerable:false, writable:flse, configurable:true, value:function(){ var o=this; var idx=0; var ks=Object.keys(o); return{ next:function(){ return{ value:o[ks[idx++]], done:(idx>ks.length) }; } }; } }); //手动遍历myObj var it=myObj[Sysbol.iterator](); it.next();//{value :2,done:false} it.next();//{value :3,done:false} it.next();//{value :undefined,done:true} //用for...of遍历myObj for (var v of myObj){ console.log(v); ; //2 //3