Object的一些知识点总结

1.hasOwnProperty

obj.hasOwnProperty(prop)

参数

prop: 要检测的属性字符串名称或者Symbol

返回值

用来判断一个对象是否含有指定的属性的Boolean

所有继承了Object的对象,都会继承到hasOwnProperty()方法。这个方法用来检测一个对象是否含有特定的自身属性。和in运算符不同,该方法会忽略那些从原型链上继承到的属性


  1. Object.prototype.a = 'aaa';
  2. var obj = {
  3. b: 'bbb'
  4. }
  5. console.log(obj.hasOwnProperty(a)); // false
  6. for(var item in obj) {
  7. console.log(item); // b a。此结果也找到了从原型链上继承过来的属性
  8. }

如果hasOwnProperty作为属性名


  1. var foo = {
  2. hasOwnProperty: function() {
  3. return false
  4. },
  5. bar: 'bar'
  6. }
  7. foo.hasOwnProperty('bar'); // false
  8. // 如果这种情况下,想调用原型链上的方法
  9. ({}).hasOwnProperty.call(foo, 'bar'); // 即foo对象调用了{}对象的方法。
  10. // 等同于
  11. Object.prototype.hasOwnProperty.call(foo, 'bar')

扩展:遍历一个对象的所有属性

for ... in 只会循环可枚举的属性,所以不应该基于这个循环不可枚举的属性。

2.getOwnPropertyNames

Object.getOwnPropertyNames(obj)

参数

obj 一个对象,其自身的可枚举和不可枚举属性的名称被返回。

返回值

在给定对象上找到的自身属性对应的字符串数组。

Object.getOwnPropertyNames()返回一个数组,数组中包含obj中可枚举和不可枚举的属性。

3.Object.keys()

Object.keys(obj)

参数

要返回其枚举自身属性的对象

返回值

一个表示给定对象的所有可枚举属性的字符串数组

描述

Object.keys()返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性。这些属性的顺序与手动遍历该属性(for...in...)时一致。


  1. var obj = {a:'a',b:'b',c:'c'};
  2. console.log(Object.keys(obj));// ['a', 'b', 'c']

4.Object.values()

Object.keys()返回key值,Object.values()返回value值,规则与Object.keys()相同。

5.Object.assign()

Object.assign()用于将所有可枚举的值从一个对象复制到目标对象。它将返回目标对象。

Object.assign(target, ...sources);

描述

如果目标对象中的属性与源对象中具有相同的属性。则目标对象中的属性将被覆盖。String类型和Symbol类型的属性都会被拷贝。
在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。


  1. const a = {a: 'a', b: 'b'};
  2. var b = Object.assign({}, a);
  3. console.log(b); //{a: 'a', b: 'b'}

深拷贝,Object.assign()只能拷贝对象第一层的属性。如果源对象的属性值是一个指向对象的引用,它也只拷贝那个引用值。


  1. let obj1 = { a: 0 , b: { c: 0}};
  2. let obj2 = Object.assign({}, obj1);
  3. console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
  4. obj1.a = 1;
  5. console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
  6. console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
  7. obj2.a = 2;
  8. console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
  9. console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
  10. obj2.b.c = 3;
  11. console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
  12. console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
  13. // Deep Clone
  14. obj1 = { a: 0 , b: { c: 0}};
  15. let obj3 = JSON.parse(JSON.stringify(obj1));
  16. obj1.a = 4;
  17. obj1.b.c = 4;
  18. console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}

合并对象


  1. var o1 = { a: 1 };
  2. var o2 = { b: 2 };
  3. var o3 = { c: 3 };
  4. var obj = Object.assign(o1, o2, o3);
  5. console.log(obj); // { a: 1, b: 2, c: 3 }
  6. console.log(o1); // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。

合并具有相同属性的对象,属性被后续参数中具有相同属性的其他对象覆盖。


  1. var o1 = { a: 1, b: 1, c: 1 };
  2. var o2 = { b: 2, c: 2 };
  3. var o3 = { c: 3 };
  4. var obj = Object.assign({}, o1, o2, o3);
  5. console.log(obj); // { a: 1, b: 2, c: 3 }

拷贝 symbol 类型的属性


  1. var o1 = { a: 1 };
  2. var o2 = { [Symbol('foo')]: 2 };
  3. var obj = Object.assign({}, o1, o2);
  4. console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox)
  5. Object.getOwnPropertySymbols(obj); // [Symbol(foo)]

继承属性和不可枚举属性是不能拷贝的


  1. var obj = Object.create({foo: 1}, { // foo 是个继承属性。
  2. bar: {
  3. value: 2 // bar 是个不可枚举属性。
  4. },
  5. baz: {
  6. value: 3,
  7. enumerable: true // baz 是个自身可枚举属性。
  8. }
  9. });
  10. var copy = Object.assign({}, obj);
  11. console.log(copy); // { baz: 3 }

原始类型会被包装为对象


  1. var v1 = "abc";
  2. var v2 = true;
  3. var v3 = 10;
  4. var v4 = Symbol("foo")
  5. var obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
  6. // 原始类型会被包装,null 和 undefined 会被忽略。
  7. // 注意,只有字符串的包装对象才可能有自身可枚举属性。
  8. console.log(obj); // { "0": "a", "1": "b", "2": "c" }

异常会打断后续拷贝任务


  1. var target = Object.defineProperty({}, "foo", {
  2. value: 1,
  3. writable: false
  4. }); // target 的 foo 属性是个只读属性。
  5. Object.assign(target, {bar: 2}, {foo2: 3, foo: 3, foo3: 3}, {baz: 4});
  6. // TypeError: "foo" is read-only
  7. // 注意这个异常是在拷贝第二个源对象的第二个属性时发生的。
  8. console.log(target.bar); // 2,说明第一个源对象拷贝成功了。
  9. console.log(target.foo2); // 3,说明第二个源对象的第一个属性也拷贝成功了。
  10. console.log(target.foo); // 1,只读属性不能被覆盖,所以第二个源对象的第二个属性拷贝失败了。
  11. console.log(target.foo3); // undefined,异常之后 assign 方法就退出了,第三个属性是不会被拷贝到的。
  12. console.log(target.baz); // undefined,第三个源对象更是不会被拷贝到的。

拷贝访问器


  1. var obj = {
  2. foo: 1,
  3. get bar() {
  4. return 2;
  5. }
  6. };
  7. var copy = Object.assign({}, obj);
  8. // { foo: 1, bar: 2 }
  9. // copy.bar的值来自obj.bar的getter函数的返回值
  10. console.log(copy);
  11. // 下面这个函数会拷贝所有自有属性的属性描述符
  12. function completeAssign(target, ...sources) {
  13. sources.forEach(source => {
  14. let descriptors = Object.keys(source).reduce((descriptors, key) => {
  15. descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
  16. return descriptors;
  17. }, {});
  18. // Object.assign 默认也会拷贝可枚举的Symbols
  19. Object.getOwnPropertySymbols(source).forEach(sym => {
  20. let descriptor = Object.getOwnPropertyDescriptor(source, sym);
  21. if (descriptor.enumerable) {
  22. descriptors[sym] = descriptor;
  23. }
  24. });
  25. Object.defineProperties(target, descriptors);
  26. });
  27. return target;
  28. }
  29. var copy = completeAssign({}, obj);
  30. console.log(copy);
  31. // { foo:1, get bar() { return 2 } }

来源:https://segmentfault.com/a/1190000018048690

Object的各种方法的更多相关文章

  1. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  2. 利用Object.prototype.toString方法,实现比typeof更准确的type校验

    Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型. 调用方法: Object.prototype.toString.call(value) 不同 ...

  3. Object类clone方法的自我理解

    网上搜帖: clone()是java.lang.Object类的protected方法,实现clone方法: 1)类自身需要实现Cloneable接口 2)需重写clone()方法,最好设置修饰符mo ...

  4. Cloneable接口和Object的clone()方法

    为什么要克隆 为什么要使用克隆,这其实反映的是一个很现实的问题,假如我们有一个对象: public class SimpleObject implements Cloneable { private ...

  5. JavaScript:Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. var arr = []; console.log(Obje ...

  6. 方法object面试题分析:7JAVA中Object的clone方法详解-克隆-深克隆

    时间紧张,先记一笔,后续优化与完善.     每日一道理 翻开早已发黄的页张,试着寻找过去所留下的点点滴滴的足迹.多年前的好友似乎现在看来已变得陌生,匆忙之间,让这维持了多年的友谊变淡,找不出什么亲切 ...

  7. Object类的方法

    一 Object:类Object是类层次结构的跟类,每个类都使用Object作为超类,每个类都是直接或者间接的继承自Object类. Object类的方法: ①public int hashCode( ...

  8. javascript Object的新方法

    今天复习es6,又看到Object的一堆方法,与es5的表现又有不一致,耗费了一整天,整理一下: 前几天在司徒正美的书里又看到了es5 Object的字眼,为了向下兼容,大神们也是牛逼的整理出一系列i ...

  9. Object 及toString() 方法的重写

    Object: 是所有的类的父类  ,Object中所有的方法 , 子类都能使用  ,   接口不是Object子类. Person: /*将父类的equals方法 重写 * 不改变父类的源代码 eq ...

  10. Object中的方法以及对象相等的判定

    看图说话 Object有以下几个方法 getClass() final类型,主要是用来获得运行时的类型 hashCode() 返回该对象的哈希码值,方法是为了提高哈希表(例如 java.util.Ha ...

随机推荐

  1. webpack报错no postcss config...

    终端里运行的错误: 查了好多资料,最后找到解决办法,改为: const webpack = require('webpack'); // const autoprefixer = require('a ...

  2. Jquery 中 .trigger 的用法

    项目中有个需求,数据加载完成后,默认模拟点击某个元素节点(选中某个元素节点)并触发事件 $('.course_list dd').on('click', function () {     //取当前 ...

  3. hdu1575 Tr A 矩阵快速幂模板题

    hdu1575   TrA 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 都不需要构造矩阵,矩阵是题目给的,直接套模板,把对角线上的数相加就好 ...

  4. CLR via 笔记 5.3 值类型的装箱和拆箱

    1.装箱 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(Boxing)的机制. 1.在托管堆中分配好内存.分配的内存量是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员(类 ...

  5. Apache Kafka源码分析 – Broker Server

    1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...

  6. Python3中的urlencode和urldecode

    在Python3中,将中文进行urlencode编码使用函数 urllib.parse.quote(string, safe='/', encoding=None, errors=None) 而将编码 ...

  7. 监控之snmpd 服务

    监控离不开数据采集,经常使用的Mrtg ,Cacti,Zabbix,等等监控软件都是通过snmp 协议进行数据采集的! 1 什么是snmp 协议? 简单网络管理协议(SNMP,Simple Netwo ...

  8. ActiveMQ 详解

    1. 如何同步索引库 方案一: 在taotao-manager中,添加商品的业务逻辑中,添加一个同步索引库的业务逻辑; 缺点:业务逻辑耦合度高,业务拆分不明确; 方案二: 业务逻辑在taotato-s ...

  9. Linux下的物理内存管理2-slab缓存的管理

    2017-03-02 在Linux下的物理内存管理中,对SLAB机制大致做了介绍,对SLAB管理结构对象也做了介绍,但是对于小内存块的分配没有介绍,本节重点介绍下slab对小内存块的管理. 内核中使用 ...

  10. redis之django-redis

    自定义连接池 这种方式跟普通py文件操作redis一样,代码如下: views.py import redis from django.shortcuts import render,HttpResp ...