1. ECMA简述

ECMA是脚本语言规范,是由ECMA国际组织制定和发布的脚本语言规范。而 JavaScript 就是其规范的一种实现。当然了,类似的还有其它脚本语言。但习惯性的把术语 ECMAScript 和 JavaScript 表达为同一意思。

2. ECMA5

ECMA5的兼容性对于各个常用浏览器都是兼容的,除了最恶心的IE浏览器。

IE8: 只支持defineProperty,getOwnPropertyDescriptor部分特性及JSON新特性

IE9: 不支持严格模式,其余都可以

IE10:IE10和其它主流浏览器均支持

总结:PC端开发需要注意IE9以下的兼容,但移动端开发时不需要

2.1 严格模式(strict mode)

顾名思义 :使得 JavaScript 在更严格的语法条件下运行。

目的/作用:

消除JavaScript语法的一些不合理、不严谨之处,减少怪异行为

消除代码运行的一些不安全之处,保证代码运行的安全 eval()

为未来新版本 JavaScript 做好铺垫

使用:在全局或函数的第一条语句定义为 'use strict'; 如果浏览器不支持,只简析为一条简单的语句,没有任何副作用

全局使用:

'use scrict';
// code...
function scrict() {
    'use scrict';
     // code...
}

语法和行为改变:

1. 变量的生命必须使用 var 关键字

2. 创建 eval 函数作用域

3. 禁止 this 执行 window 对象

4. 对象不能用重复属性

5. 函数不能有重名的形参

2.2 JSON对象扩展

JSON对象:JSON对象或数组是一个字符串,console.info(json)会打印出字符串

JS对象:JS对象是Object或Array,console.info(obj/arr)会打印出 > Object/Array[]

JSON对象:

JSON.stringify(obj/arr): js对象(或数组)转换为json对象(或数组)

JSON.parse(json): json对象(或数组)转换为js对象(或数组)

2.3 Object对象扩展

ES5给Object扩展了好几个方一些静态方法,举例两个:

Object.create(prototype[, descriptors]):创建一个新对象

1. 以指定对象为原型创建新的对象

2. 指定新的属性,并对属性进行描述

    value: 指定值

    writable: 标识当前属性是否可修改,默认 true

    set: 监视设置当前属性值变化的回调

    get: 监视获取当前属性值的回调

var obj = {name: 'Tom', setName: function(name) { this.name = name; }};
var new = Object.create(obj, {
    age: {
        value: 12,
        writable: false,
        set: function() { //... },
        get: function() { //... }
    }
});

Object.defineProperty(object, descriptors):为指定对象定义扩展多个属性

2.4 Array对象扩展

ES5给Array扩展了好几个常用又便捷的方法,常用的有5个:

1. Array.prototype.indexOf(value): 得到值在数组中的第一个下标

2. Array.prototype.lastIndexOf(value): 得到值在数组中的最后一个下标

3. Array.prototype.forEach(function(item, index) {}): 数组遍历

4. Array.prototype.map(function(item, index) {}): 遍历数组,返回一个新的数组

5. Array.prototype.filter(function() {}): 遍历过滤出一个新的子数组

6. Array.prototype.reduce(function() {}[, initialVal]): 将数组的每个值(从左到右)将其降低到一个值

场景: 统计一个数组中有多少个不重复的单词

Reduce方法之前:

var arr = ["apple","orange","apple","orange","pear","orange"]; 

function getWordCnt(){

    var obj = {};

    for(var i= 0, l = arr.length; i< l; i++){

        var item = arr[i];

        obj[item] = (obj[item] +1 ) || 1;

    }

    return obj;

}

console.log(getWordCnt());

Reduce方法之后:

var arr = ["apple","orange","apple","orange","pear","orange"];

function getWordCnt(){

    return arr.reduce(function(prev,next){

        prev[next] = (prev[next] + 1) || 1;

        return prev;

    },{});

}

console.log(getWordCnt());

2.5 函数扩展

Function.prototype.bind(obj): 将函数内的 this 绑定为 obj,并将函数返回。

场景: 统计一个数组中有多少个不重复的单词

var name = 'Window';

var obj = {name: 'Tom'};

setTimeout(function() {

    console.info(this.name); // Window

}, 100);

setTimeout(function() {

    console.info(this.name); // Tom

}.bind(obj), 100);