对象字面量

属性的简洁表示法

ES6允许对象的属性直接写变量,这时候属性名是变量名,属性值是变量值。

const age = 12;
const name = "Amy";
const person = {age, name};
console.log(person); //{age: 12, name: "Amy"}
//等同于
const person = {age: age, name: name}

方法名也可以简写

const person = {
sayHi(){
console.log("Hi");
}
}
person.sayHi(); //"Hi"
//等同于
const person = {
sayHi:function(){
console.log("Hi");
}
}
person.sayHi();//"Hi"

如果是Generator 函数,则要在前面加一个星号:

const obj = {
* myGenerator() {
yield 'hello world';
}
};
//等同于
const obj = {
myGenerator: function* () {
yield 'hello world';
}
};

属性名表达式

ES6允许用表达式作为属性名,但是一定要将表达式放在方括号内。

const obj = {
["he"+"llo"](){
return "Hi";
}
}
console.log(obj.hello()); //"Hi"

注意点:属性的简洁表示法和属性名表达式不能同时使用,否则会报错。

const hello = "Hello";
const obj = {
[hello]
};
obj //SyntaxError: Unexpected token } const hello = "Hello";
const obj = {
[hello+"2"]:"world"
};
obj //{Hello2: "world"}

对象的拓展运算符

拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象。

基本用法

let person = {name: "Amy", age: 15};
let someone = { ...person };
console.log(someone); //{name: "Amy", age: 15}

可用于合并两个对象

let age = {age: 15};
let name = {name: "Amy"};
let person = {...age, ...name};
console.log(person); //{age: 15, name: "Amy"}

注意点

自定义的属性和拓展运算符对象里面属性的相同的时候:自定义的属性在拓展运算符后面,则拓展运算符对象内部同名的属性将被覆盖掉。

let person = {name: "Amy", age: 15};
let someone = { ...person, name: "Mike", age: 17};
console.log(someone); //{name: "Mike", age: 17} 拓展符内的同名属性将被覆盖

自定义的属性在拓展运算度前面,则变成设置新对象默认属性值。

let person = {name: "Amy", age: 15};
let someone = {name: "Mike", age: 17, ...person};
console.log(someone); //{name: "Amy", age: 15}
let a={name:"bob"};
let b={name:"tom"};
console.log({...a,...b});//tom

拓展运算符后面是空对象,没有任何效果也不会报错。

let a = {...{}, a: 1, b: 2};
console.log(a); //{a: 1, b: 2}

拓展运算符后面是null或者undefined,没有效果也不会报错。

let b = {...null, ...undefined, a: 1, b: 2};
console.log(b); //{a: 1, b: 2}

对象的新方法

Object.assign(target, source_1, ···)

用于将源对象的所有可枚举属性复制到目标对象中。

基本用法

let target = {a: 1};
let object2 = {b: 2,d:{e:4,f:{g:6,h:[{i:3},[1,2,3,4,5]]}}};
let object3 = {c: 3};
Object.assign(target,object2,object3);
// 第一个参数是目标对象,后面的参数是源对象
console.log(target); // {a: 1, b: 2, d: {…}, c: 3}
  • 如果目标对象和源对象有同名属性,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。
  • 如果该函数只有一个参数,当参数为对象时,直接返回该对象;当参数不是对象时,会先将参数转为对象然后返回。
  • console.log(Object.assign(3));         // Number {3}
    console.log(Object.assign([1,2,3]));// [1, 2, 3]
    console.log(Object.assign(true));//Boolean {true}
    // console.log(Object.assign(null));//报错
    // console.log(Object.assign(undefined));//报错
    console.log(Object.assign("hahaha"));//String {"hahaha"}
    typeof Object.assign(3); // "object"

因为 null 和 undefined 不能转化为对象,所以会报错:

Object.assign(null);       // TypeError: Cannot convert undefined or null to object
Object.assign(undefined); // TypeError: Cannot convert undefined or null to object
// 当参数不止一个时,null 和 undefined 不放第一个,即不为目标对象时,会跳过 null 和 undefined ,不报错
Object.assign(1,undefined); // Number {1}
Object.assign({a: 1},null); // {a: 1} Object.assign(undefined,{a: 1}); // TypeError: Cannot convert undefined or null to object

注意点

assign 的属性拷贝是浅拷贝:

let sourceObj = { a: { b: 1}};
let targetObj = {c: 3};
Object.assign(targetObj, sourceObj);
console.log(targetObj);//{c: 3, a: {…}}
targetObj.a.b = 2;
console.log(sourceObj.a.b); // 2

同名属性替换

targetObj = { a: { b: 1, c:2}};
sourceObj = { a: { b: "hh"}};
Object.assign(targetObj, sourceObj);
console.log(targetObj); // {a: {b: "hh"}}

数组的处理

console.log(Object.assign([2,3], [5]));  // [5,3]

会将数组处理成对象,所以先将 [2,3] 转为 {0:2,1:3} ,然后再进行属性复制,所以源对象的 0 号属性覆盖了目标对象的 0。

Object.is(value1, value2)

用来比较两个值是否严格相等,与(===)基本类似。

基本用法

基本用法

Object.is("q","q");      // true
Object.is(1,1); // true
Object.is([1],[1]); // false
Object.is({q:1},{q:1}); // false

与(===)的区别

//一是+0不等于-0
Object.is(+0,-0); //false
+0 === -0 //true
//二是NaN等于本身
Object.is(NaN,NaN); //true
NaN === NaN //false

最新文章

  1. js 数组,字符串,json互相转换
  2. web响应式图片设计实现
  3. MySQL的数据库,数据表,数据的操作
  4. 嵌入式Linux驱动学习之路(四)u-boot编译分析
  5. SharePoint 2013 一些小技巧
  6. Android广播机制简介
  7. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)
  8. 浅谈thinkphp中将字符串转换成json数组的方法
  9. NOI 国家集训队论文集
  10. .NET 面试题(1)
  11. 【记录】解析具有合并单元格的Excel
  12. 适合Linux新手的发行版有哪些?
  13. Drrols规则引擎
  14. Javascript获取服务器时间
  15. 在vue中使用echarts图表
  16. mongodb常用的sql语句总结
  17. Java并发编程:线程池的使用(转载)
  18. Android学习之基础知识四-Activity活动3讲(Intent的使用)
  19. 8 -- 深入使用Spring -- 2...3 使用@Resource配置依赖
  20. VS2013运行C++报错:This function or variable may be unsafe. Consider using fopen_s instead.

热门文章

  1. Linux内存、性能诊断中vmstat命令的详解
  2. C++ OpenMp的并行编程
  3. Python操作redis学习系列之(集合)set,redis set详解 (六)
  4. RSA加密算法详解(一)
  5. HTTP 05 安全
  6. Python3集合
  7. Windows更新导致的打印问题
  8. Spring Boot Starter 的基本封装
  9. [原]CentOS7安装Rancher2.1并部署kubernetes (一)---部署Rancher
  10. 域渗透之通过DCSync获取权限并制作黄金票据