[JavaScript语法学习]全面介绍对象

对象的属性判断方法

1. in

2. hasOwnProperty()

 

JS中的对象的属性(键名)必须是字符串,为了弥补和其他语言的差距(键名可以是任意类型)

在最新ES6标准中引入了Map和Set

 

在ES6标准中引入了iterable类型,Array  Map Set都属于iterable类型,可以使用for...of循环来遍历

for...of循环只会循环集合本身元素

 

ES5.1标准 forEach

forEach(element, index, array)

 

 

ES6对Object的扩展

1. 属性的简洁表示法

允许直接写入变量和函数作为对象的属性和方法,只写属性名,这样属性值等同于同名属性的变量。

var foo = "bar";
var baz = {
    foo
};

// 等价于 {foo: foo}


function f(x, y){
    return {x, y};
}

// 等价于返回 {x: x, y: y}

2. 方法可以简写

var o = {
    method(){
        return "hello, es6";
    }
}

 

3. ES6允许使用表达式作为对象字面量定义中的属性名

属性名的表达式和属性名的简洁写法不能同时使用

 

4. Object.is() 用来比较两个值是否严格相等,与 === 运算符基本一致

但是有两个例外,我们知道在ES5中NaN 和 NaN 是不相等的,但是用Object.is(NaN, NaN) 得到的就是 true

+0 和 -0 是相等的,但是用Object.is(+0, -0)得到的就是 false

 

5. Object.assign() 用来将源对象的所有可枚举属性复制到目标对象上,针对同名属性,后面的对象的属性会覆盖前面对象的属性。

只复制自身属性。 而不可枚举属性和继承属性都不会被复制

这个方法只是浅复制,需要深度复制可以使用 _.defaultsDeep (Lodash库)

如果将这个方法运用到了数组上,那么会将数组的成员索引值看做成属性名。

Object.assign([1,2,3], [4,5])
// 得到 [4,5,3]
// [1,2,3] 看成 {"0": 1, "1": 2, "2": 3}
// [4, 5] 看成 {"0": 4, "1": 5}

运用场景: 简化给对象添加属性和方法的写法

Object.assign(SomeClass.prototype, {
    someMethod(arg1, arg2){
    
    }

    anotherMethod(){
    
    }
});

//给某个对象类的原型上添加方法

克隆对象

合并多个对象

为属性指定默认值

 

6. 在ES5中,可以通过getOwnPropertyDescriptor()方法获取对象属性的描述

ES5中,有三个操作会忽略不可枚举属性( enumerable = false) 

for ... in 

Object.keys()

JSON.stringify()

在ES6中,新增两个会忽略不可枚举属性的操作

Object.assign()

Reflect.enumerate()

ES6明确规定所有Class的原型方法都是不可枚举的

 

7. 对象的属性遍历

ES6一共有6种可以遍历对象属性的方法

a.  for...in  遍历对象自身的和继承的所有可枚举的属性

b.  Object.keys(obj) 返回一个包含对象自身的所有可枚举的属性的数组

c.  Object.getOwnPropertyNames(obj)    返回一个包含对象自身的所有属性的数组 (包含不可枚举的属性)

d.  Object.getOwnPropertySymbols(obj)  返回一个包含对象自身的所有Symbol属性的数组

e.  Reflect.ownKeys(obj) 返回一个包含对象自身的所有属性的数组 (包含Symbol属性,不可枚举属性)

f.   Reflect.enumerate(obj) 返回一个Iterator对象,遍历对象自身的和继承的所有可枚举的属性 与 for...in 相同

遍历对象属性时的顺序按照如下规则

1. 遍历所有属性名为数值的属性,按照数字排序

2. 遍历所有属性名为字符串的属性,按照生成时间排序

3. 遍历所有属性名为Symbol值的属性,按照生成时间排序

 

 8. 对象的扩展运算符

对象的rest参数,解构赋值时,会将对象自身的所有可遍历当尚未被读取的属性分配到指定对象上,所有键和值都会被复制到新对象上。注意,这个复制也是浅赋值。

如果某个键值是复合类型,那么复制的只是这个值的引用。

 

对象的扩展运算符是用于取出参数对象的所有可遍历的属性,然后复制到当前对象中。类似于Object.assign()

 

posted @ 2017-04-30 13:36  小碎石  阅读(195)  评论(0编辑  收藏  举报