ES6 新增了哪些新特性 (二)

es6.png

关于 ES6规范及新特性

对象字面量申明增强


ES6 之前,申明对象字面量方式其实就是直接定义一个json对象.存在的仅仅是对象的属性和值.

ES6 之后,对象字面量被扩展支持直接设置原型, 简洁属性赋值和方法, 超类调用, 这也让对象字面量和类声明的关系更密切,并让基于对象的设计更便利


ES6之前:


var obj = {
   __proto__: theProtoObj,
   // 下面的写法不会设置内部原型
   '__proto__': theProtoObj,
   // 方法
   toString() {
    // 调用父对象的方法
    return "d " + super.toString();
   },
   // 属性名是一个表达式
   [ "prop_" + (() => 42)() ]: 42
};

proto: theProtoObj proto属性需要原生支持,这一属性在ECMAScript前一个版本中一度被废弃,目前 ES6 再度使用起来.

'proto': theProtoObj 上面这种设置内部原型的方法不会被支持, proto 并不是一个字符串,所以这种字符串设置方式不会被支持.

对象字面量支持方法调用: toString(){ //调用父级对象的方法 return "d " + super.toString(); }

//属性名支持表达式 [ “prop_” + (() => 42)() ]

模版字符串

允许对字符串构建的定制化,避免注入攻击或其他需求


// 普通字符串
`This is a  string.`

// 多行字符串
`This is
a  string.`

// 字符串中嵌入变量
var name = "world", time = "today";
`Hello ${name}, how are you ${time}?`

// 模版标签
String.raw`In ES5 "\n" is a line-feed.`

// 下面构造一个HTTP请求头,来解释差值替换和构造
GET`http://foo.org/bar?a=${a}&b=${b}
    Content-Type: application/json
    X-Credentials: ${credentials}
    { "foo": ${foo},
      "bar": ${bar}}`(myOnReadyStateChangeHandler);
      

函数默认参数

ES6 终于支持参数默认值了


function f(x, y=12) {
  // 如果不传递y或传递undefined,y的值为12
  return x + y;
}
f(3) == 15

Let

它的功能是定义变量,当时和 var 有很大区别. let 定义的变量只有在它所在的代码块内有效. 它解决了一个问题,javascript 存在很大的缺陷就是没有作用域,所以定义的变量互相覆盖.

Let 的出现成功解决了这个问题.


function test() {
  {
    let m{
        m=100;
    }
    // let变量可以再次赋值
    m=200;
    
    // 在块作用域中重复声明将会报错,如下
    let x = 300;
  }
}

Const

const也用来声明变量的关键字,但是它声明的是常量. 在 let 代码块中不能使用 Const 申明常量

如下代码是不允许的:

function test() {
  {
    let x;
    {
      // 块作用域
      const x = "test";  //不允许这样代码块中的常量定义
    }
  }
}

支持换行

如果没有模板字符串,对于一个长字符串,你大概要写成这样的:

var sql =
  "SELECT * FROM Users " +
  "WHERE FirstName='Mike' " +
  "LIMIT 5;"

当然也可以这样通过数组的形式实现:


var sql = [
  "SELECT * FROM Users",
  "WHERE FirstName='Mike'",
  "LIMIT 5;"
].join(' ')

现在 ES6 支持这样的方式实现换行:

let sql = `
SELECT * FROM Users
WHERE FirstName='Mike'
LIMIT 5;
`

出自:ES6 新增了哪些新特性 (二)



回到顶部