影子的知识库

影子的知识库

  • 知识库
  • GitHub

›ES6

JVM系列

  • JVM内存区域
  • 对象创建-布局-访问
  • 内存溢出实战
  • 内存区域回收
  • 四大引用
  • 垃圾回收算法
  • HotSpot回收算法细节

Java系列

  • java注解
  • springboot请求参数绑定
  • springboot请求参数校验框架
  • YAML语法
  • 动态代理
  • classpath和java命令
  • springboot-aop编程
  • springboot统一异常处理
  • springboot数据库和事务
  • springboot拦截器
  • springboot中的web配置
  • docker的简单开发
  • springboot自动配置
  • 数据库的隔离级别
  • springboot监控
  • java类加载
  • java-agent的相关内容
  • 类加载器详解
  • java的SecurityManager
  • maven学习

Node

    JS 基础

    • 语法基础和数据类型
    • 数据类型转换
    • 语句 表达式 运算符
    • 变量与对象
    • 函数
    • 数据处理
    • 常用 API
    • 重点知识

    ES6

    • 块级作用域
    • 字符串和正则表达式
    • 函数
    • 对象
    • Symbol
    • Set和Map
    • 迭代器和生成器
    • 类
    • 数组
    • Promise

    Node 基础

    • 模块系统
    • package.json
    • 内置对象
    • npm脚本的使用
    • Buffer
    • Stream
    • 事件循环机制
    • 示例代码

    stream系列

    • 流的缓冲
    • 可读流
    • 可写流
    • 双工流和转换流
    • 自定义流

后期计划

  • 学习计划
  • 专题研究计划
Edit

本文内容

属性的简写

ES 5

let name = 'czp';
let age = 25;
let obj = {
    name: name,
    age: age
};

ES 6

let name = 'czp';
let age = 25;
let obj = {
    name,
    age
};

这种同名属性我们不用再写 2 遍。(就是个语法糖,我个人觉得挺蠢的,反而增加记忆负担)

方法的简写

ES 5

let obj = {
    sayHello: function () {

    }
};

ES 6

let obj = {
    sayHello() {

    }
};

这种简写方式拥有 ES 5 的全部特性,另外,简写方法还可以使用 super 关键字

可计算属性名

ES 5

let obj = {
    "ha ha": 3
};
console.log(obj["ha ha"]);

ES 6

let attributeName = "ha ha";
let obj = {
    [attributeName]: 3
};
console.log(obj[attributeName]);

ES 6 中,可以在对象字面量中,使用变量来定义属性名称。语法就是将属性名称变量使用中括号括起来,就类似于中括号属性调用一样。

我们也可以用这种方式来定义方法名

let attributeName = "ha ha";
let obj = {
    [attributeName]() {
        return 3;
    }
};
console.log(obj[attributeName]());

甚至,属性名只要是表达式都可以这样来做

let attributeName = "ha ha";
let obj = {
    [attributeName + 3]() {
        return 3;
    }
};
console.log(obj[attributeName + 3]());

新增方法

Object.assign(target, source)

这个方法是一个用来混入的方法,可以将其它对象的属性复制到一个接收对象上,例如

let obj1 = {};
let obj2 = {
    name: 'czp',
    gender: 'man'
};
let obj3 = {
    age: 25,
    name: 'xxx'
};
Object.assign(obj1, obj2, obj3);
console.log(obj1);

输出

(py3.5) czp@:~/workspace/knowledge-base/demos/node_start$ node hello.js
{ name: 'xxx', gender: 'man', age: 25 }

它将后两个对象的所有属性都复制到了第一个对象上,称为混入。

靠后的对象的属性的优先级最高,所以 name 字段的值是 obj3.name 的值

Object.assign 方法不能将访问器属性复制到目标对象上,访问器属性会变成一个数据属性

也就是源对象的属性的 get 方法,将会取消,目标对象仅仅是一个固定值

重复字面量属性

在 ES 5 中,如果字面量里包含有重复的属性,那么将会报错。

在 ES 6 中,不会检测重复属性,如果出现重复,将以最后一个为准,例如

let obj = {
    name: 'czp',
    name: 'aaa'
};
console.log(obj.name); //  aaa

自有属性的枚举顺序

在 ES 6 中,严格定义了对象自由属性的枚举顺序:

  • 所有数字键按照升序排序
  • 所有字符串键按它们被加入对象的顺序排序
  • 所有 symbol 键(后续介绍)按它们被加入对象的顺序排序

例如

let obj = {
    a: 1,
    0: 1,
    c: 1,
    2: 1,
    b: 1,
    1: 1
};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join(',')); //  0,1,2,a,c,b,d

可以看到,数字键都在字符串键前面,数字键按照数字来排序,字符串键按照加入顺序排序

对于 for-in 循环,仍然没有明确的顺序,Object.keys 和 JSON.stringify() 枚举顺序与 for-in 相同,因此也没有明确的顺序

这里规定的顺序仅针对 Object.getOwnPropertyNames 自有属性

super 关键字

这个关键字只能够用于简写方法中,表示的是访问原型上的方法,例如

let obj = {
    hello() {
        return 'hello';
    },
    this() {
        return this;
    }
};
let obj2 = {
    hello() {
        return super.hello() + ', czp';
    },
    this() {
        return super.this();
    }
};
Object.setPrototypeOf(obj2, obj);
console.log(obj2.hello());
console.log(obj2.this() === obj2); // true

说白了这个就是为了补坑的,这种操作跟 Java 基本是一致的

super 关键字只能用在简写方法中

Last updated on 11/8/2020
← 函数Next →
  • 属性的简写
  • 方法的简写
  • 可计算属性名
  • 新增方法
    • Object.assign(target, source)
  • 重复字面量属性
  • 自有属性的枚举顺序
  • super 关键字
影子的知识库
Docs
Getting Started (or other categories)Guides (or other categories)API Reference (or other categories)
Community
User ShowcaseStack OverflowProject ChatTwitter
More
BlogGitHub
Copyright © 2020 Cen ZhiPeng