let , const 和 var

  javascript 里面的作用域

    一个大括号 是一个作用域 {  }

  var 会 在局部作用定义 被定义时 会提升作用域  如 if 的 {} 就属于 局部作用域

  为了规避 var 关键字的"变量作用域的提升"问题而产生的定义变量语法

    let obj = {}  # 可变的对象

    const obj = {}  # 不可变的对象

    什么是作用域提升?let定义的变量, 其作用域与用var定义的变量有什么区别?

    使用 var 定义在 function 内定义之后

      会先定义 var 然后 再 赋值

      eg:

      function fn(){

        if(1){ var a = 12345 }

        console.log( a ); #12345

      }

      等价于

      function fn(){

        var a ;

        if(1){ a = 12345 }

        console.log( a ); #12345

      }

      故会提升变量的作用域 所以 const 或者 let 会报错 指明了作用域的范围

    闭包传递时, 与用var定义的变量有什么区别?

      闭包 传值时  使用 var 定义 的使用 引用传递

            使用 let 定义 的使用 值传递

      eg:

      //for(var i = 0; i < 10; i++){

      for(let i = 0; i < 10; i++){

        setTimeout(function(){

          console.log( i ); # var : 10 10 10 ...    let: 0 1 2 3 ...

        });

      }

    const到底指的是谁不能变?

      const obj = {};

      obj = 1;  # 直接 改变 obj 的指向 会报错

      obj.a = 1;    #  添加属性不会报错

解构赋值  解决多个变量赋值的问题

    eg: const obj = { a:1, b:2 }

      const {a:x,b} = obj;

      console.log(a,b);

    eg: const [a , b] = [1 , 2]

      console.log(a , b);

  

模版字符串

    不要再用 "+" 号组合字符串

    eg:

      const foo = '3';

      // const bar = foo + 2 + 1   # 321

      const bar = `$(foo)$(2+1)`; # 33

      console.log(bar)

正则表达式的s修饰符

    正则表达式中的 "." 不能匹配换行符 使用 s 修饰符之后 "." 可以匹配换行符

    eg: const str = "Hello \nworld!";

      const reg1 = /Hello.+world!/

      const reg2 = /Hello.+world!/s

      console.log(reg1.test(str));

      console.log(reg2.test(str));

isFinite 和 isNaN

    isFinite 判断是不是 有限数值

      eg: Number.isFinite(1);

    isNaN 判断是不是 NaN (not a number)

      eg: Number.isNaN(1);

isSafeInteger

    JavaScript 能够准确表示的整数范围在 -2^53 到 2^53 之间(不含两个断电), 超过 这个范围, 无法精确表示这个值 isSafeInteger

    Number.MIN_SAFE_INTEGER

    Number.MAX_SAFE_INTEGER

    eg: Number.isSafeInteger(1)   // true

Object 专题

  属性简介表示

      老语法

        const foo = 1

        const bar = 2

        const obj = { foo : foo, bar: bar}

      新语法

        const foo = 1

        const bar = 2

        const obj = {foo ,bar}

  属性名表达式 (将对象的属性的值 做为 另外一个对象的 属性)

      老语法

        function fn(foo, bar){

          const ret = {}

          ret[foo] = 'foo'

          ret[bar] = 'bar'

          return ret;

        }

      新语法

        function fn(foo, bar){

          return {

            [foo]: 'foo',

            [bar]: 'bar'

          }

        }

  函数的 name 属性

      function 对象的 name 属性 , 可以获得函数名

      应用于: 调试工具, 日志打印等

      eg:  查看函数什么时候调用

        function foobar(){

          return {}

        }

        function invoke(fn){

          console.log( fn.name );

          return fn();

        }

        invoke(foobar)

  Object.is

      is 是一种新的相等算法的实现

      == 和 === 的缺点

        == 会自动转换类型  [1] 和 "1" 相等

        === 不认为 NaN 和 NaN 相等, +0 和 -0 相等

      要点: Same-value equality (同值相等)

  Object.assign

      assgin 可以用来浅复制 或者 浅合并对象

      要点: 什么是'浅'?, 什么是'深'?

        浅复制:只对对象第一层的属性进行遍历, 然后把值复制上去

        深复制:复制的对象内的属性为对象时,直接复制 原对象的指针

      面试题: 如何拷贝一个对象?

      const foo = { a: 1, b: 2 }

      const fee = { c: 3, d: {z:2} }

      const check = { c: 3, d: {z:2} }

      // 复制

      const bar = Object.assign({}, foo)  //{ a: 1, b: 2 }

       // 合并

      const baz = Object.assign({}, foo, fee)  // {a: 1, b: 2, c: 3, d: {z:2} }

      console.log( fee.d === baz.d ) // true  表示指向同一个指针

      console.log( check.d === baz.d ) // false  表示不指向同一个指针

  __proto__

      __proto__ 是指向对象原型的指针,只有浏览器承诺支持,其他环境不一定,建议不要直接使用

      相关知识点:

        Object.setPrototypeOf() 和 Object.getPrototype()

      拓展

        原型链

  keys , values, entries

      keys 用来找到找到对象自身可枚举的属性名 ( 不包含 用 Object.setPrototypeof(obj, {a:a}) 设置在原型上的属性);

      values 用来找到找到对象自身可枚举的属性值

      entries 把对象转化为 key-value 的 数组

      拓展

        各种循环遍历对象的方法

         //打印 可枚举属性  自身具有的属性

          const obj = { a:1, b:2, c:3 }

          Object.setPrototypeOf(obj, {x:'x'})

            Object.keys(obj).forEach((ky)=>{ console.log(ky); }) // a b c

          Object.values(val).forEach((val)=>{ console.log(val); }) // 1 2 3

          Object.entries(obj).forEach((obj)=>{ console.log(obj); }) // [a,1] [b,2]

  getOwnPropertyDescriptor

      对象的每个属性都有一个描述对象(Descriptor), 用来控制该属性的行为, Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象

      拓展  可枚举性

        对象字段的enumerable属性, 称为"可枚举性",如果该属性为false,就表示某些操作会忽略当前属性

        1 . for...in循环 :  只遍历对象自身和继承的可枚举的属性

        2 . Object.kes() : 返回对象自身的所有可枚举的属性的键名

        3. JSON.stringify : 只串行化对象自身的可枚举的属性

        4. Object.assign() : 忽略不可枚举的属性, 只拷贝对象自身可枚举的属性

      eg:   定义为  不可枚举 不遍历出  不限时追加的自定义的属性

        const a = [1 ,2 ,3];

        // 获取 a 的 enumerable 的 值  Object.getOwnPropertyDescriptor(a, sum);

        Object.defineProperty(a, 'sum', {

          value: function(){ return 6 },

          enumerable: false

        })

        for(let key in a){

          console.log(key);

        }

  展开运算符

      使用 ... 符号, 可以将对象"展开"

        eg:

        1 . foo = {a: 1, b: 2}

          bar = {...foo, c: 3}

          console.log(bar)  //{a: 1, b: 2, c:3}

          // 其中  ...foo  等价于  Object.keys(foo).forEach((key)=>{bar[key] = foo[key]})

2. 现代 javascript 新语法 及 对象专题的更多相关文章

  1. JavaScript 新语法详解:Class 的私有属性与私有方法

    译者按: 为什么偏要用 # 符号? 原文:JavaScript's new #private class fields 译者:Fundebug 本文采用意译,版权归原作者所有 proposal-cla ...

  2. 一、JavaScript概述 二、JavaScript的语法 三、JavaScript的内置对象

    一.JavaScript的概述###<1>JavaScript的概念 又称ECMAScript,和java没有任何关系 嵌入在HTML元素中的 被浏览器解释运行的 一种脚本语言. ###& ...

  3. 总结常见的ES6新语法特性

    前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...

  4. JavaScript基本语法(四)

    一.     JavaScript 函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.我们可以将一些常用的代码封装成函数,待用到的时候就能直接调用使用.利用函数可以使代码的组织结构 ...

  5. javascript基础语法——表达式

    × 目录 [1]原始表达式 [2]复杂表达式 前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascr ...

  6. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  7. 总结常见的ES6新语法特性。

    前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...

  8. 前端入门10-JavaScript语法之对象

    声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...

  9. ES6新语法

    ES6新语法概览 简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委 ...

随机推荐

  1. VLC搭建RTSP服务器的过程

    第一步,打开VLC 第二步:在媒体下拉菜单下!有一个子菜单“串流”如图所示: 点击“串流”子菜单 弹出一个窗口!如下图所示. 添加一个你要串流的本地文件,我刚才传给你的那个长一点的文件. 第三步,会出 ...

  2. netty权威指南学习笔记六——编解码技术之MessagePack

    编解码技术主要应用在网络传输中,将对象比如BOJO进行编解码以利于网络中进行传输.平常我们也会将编解码说成是序列化/反序列化 定义:当进行远程跨进程服务调用时,需要把被传输的java对象编码为字节数组 ...

  3. Spring Boot2(005):关于代码结构

    spring boot 对于工程代码结构并没有特殊得要求,但以下几个有用的最佳实践建议参考参考: 1.不鼓励而且应该避免使用 default 包 没有 package 声明的类被认为是在 defaul ...

  4. oracle开机启动

    第一步 修改oratab (root用户执行) /etc/oratab的配置格式如下: $ORACLE_SID:$ORACLE_HOME:Y 例如:orclqdgw:/var/app/oracle/p ...

  5. Go语言 一维数组的使用

    程序源码 package main import ( "fmt" // 导入 fmt 包,打印字符串是需要用到 ) func main() { // 声明 main 主函数 var ...

  6. HDU 4819 二维线段树

    13年长春现场赛的G题,赤裸裸的二维线段树,单点更新,区间查询 不过我是第一次写二维的,一开始写T了,原因是我没有好好利用行段,说白一点,还是相当于枚举行,然后对列进行线段树,那要你写二维线段树干嘛 ...

  7. Python PIP包管理器

    版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...

  8. docker安装出现"Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?"

    今天按照这个教程使用WSL安装docker时遇到了个问题: 使用命令:$ docker search mysql 出现:Cannot connect to the Docker daemon at u ...

  9. oracle数据库语言(1)--数据定义语言

      1.数据定义语言 (DDL)DATE DEFINITION LANGUAGE 作用是用于增删改 数据库对象 (1) 创建表格 CREATE TABLE EMP ( -------创建 名为 EMP ...

  10. docker-compose 安装 mongodb

    1. 修改 docker-compose.yml version: "2.1" services: php7.1: build: ./php image: php7.1-ext p ...