什么是ECMAScript?

ECMAScript简介

ECMAScript 6.0(以下简称 ES6)是JavaScript 语言的下一代标准,已经在 2015年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?

ECMAScript和JavaScript的关系

要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者Netscape 公司,决定将 JavaScript 提交给国际标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一
种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以互换的。

回顾ES5

1.2.1严格模式
JavaScript 严格模式(strict mode)即在严格的条件下运行。
设立严格模式的原因:
● 消除JavaScript语法的一些不合理、不严谨之处,减少一些怪异行为;
● 消除代码运行的一些不安全之处,保证代码运行的安全;
● 提高编译器效率,增加运行速度;
● 为未来新版本的JavaScript做好铺垫。
"严格模式"体现了JavaScript更合理、更安全、更严谨的发展方向,IE 10在内的主流浏览器。“use strict”;//是进入严格模式的标志(老版本的浏览器会把它当作一行普通字符串,加以忽略。)将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。
“use strict”
使用需要记住的几个变化:
● 声明定义变量必须用var

'use strict';
age = 12;
console.log(age);//报错

● 禁止自定义的函数中的this关键字指向全局对象

'use strict';
function Person(name, age) {
        this.name = name;
        this.age = age;
    }
 Person('ujiuye', 39);//报错

● 创建eval作用域, 更安全

'use strict';
var name = 'ujiuye';
eval('var name = "ujiuyeweb";alert(name)');//ujiuyeweb
console.log(name);//ujiuye

1.2.2 JSON对象
JSON对象有两个方法,并且JSON 通常用于与服务端交换数据。分别为JSON.parse()和JSON.stringify()
在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。json.stringfy()将对象、数组转换成字符串。
示例:

var obj = {
        name : 'ujiuye',
        age : 18
    };
obj = JSON.stringify(obj);
console.log( typeof obj);//string
obj = JSON.parse(obj);
console.log(obj);//{name: "ujiuye", age: 18}

1.2.3 Object扩展
ES5给Object扩展了好一些静态方法, 常用的2个:
● Object.create(prototype, [descriptors])
作用: 以指定对象为原型创建新的对象
为新的对象指定新的属性, 并对属性进行描述
value : 指定值
writable : 标识当前属性值是否是可修改的, 默认为false
configurable: 标识当前属性是否可以被删除 默认为false
enumerable: 标识当前属性是否能用for in 枚举 默认为false

var person1 = { name:'ujiuye',age:18 }
    var person2 = Object.create( person1,{
        sex:{
            value:'男',
            writable:true,//可修改的
            // configurable:true//可以删除此属性
            enumerable:true//是否可枚举,是否可遍历(循环、迭代)
        },
        sex2:{
            value:'男',
            writable:true,//可修改的
            // configurable:true//可以删除此属性
            enumerable:true//是否可枚举,是否可遍历(循环、迭代)
        }
    } )//新增的属性不会加到原型上

    console.log(person2.sex);//男
    person2.sex = '女'
    console.log(person2.sex);//女
    delete person2.sex
    console.log(person2,'delete');//已删除sex

    for( var attr in person2 ){
        console.log(attr,person2[attr]);//遍历出sex2属性
    }

● Object.defineProperties(object, descriptors)
作用: 为指定对象定义扩展多个属性
get :用来获取当前属性值得回调函数
set :修改当前属性值得触发的回调函数,并且实参即为修改后的值

var person = {
        firstname:'Marry',
        lastname:'LuCi'
    }
    Object.defineProperties( person,{
        fullName:{
            get: function () {
                return  this.firstname +' '+ this.lastname
            },
            set: function ( value ) {
              //当我们在外部设置此属性的时候,会调用一次set方法
                var names = value.split(' ')
                this.firstname = names[0]
                this.lastname = names[1]
            }
        }
    } )
    person.fullName = 'L Jams'   //
    console.log( person )//{firstname: "L", lastname: "Jams"}

1.2.4 Array扩展
数组的扩展主要体现在一些原型方法上一定要合理的使用,在后续的框架当中也会经常使用。
● Array.prototype.indexOf(value) : 得到值在数组中的第一个下标

var arr = [2, 3, 3, 2, 1, 5];
console.log(arr.indexOf(3));//1

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

var arr = [2, 3, 3, 2, 1, 5];
console.log(arr.lastIndexOf(1));//4

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

var arr = [11,22,33]
arr.forEach(function (item, index) {
     console.log(item, index);
});//依次打印 11 0 | 22 1 | 33 2

● Array.prototype.map(function(item, index){}) : 遍历数组返回一个新的数组,返回加工之后的值

var arr = [11,22,33]
var arr1 = arr.map(function (item, index) {
  return item + 10
});
console.log(arr, arr1);//[11, 22, 33] [21, 32, 43]

● Array.prototype.filter(function(item, index){}) : 遍历过滤出一个新的子数组, 返回条件为true的值

var arr = [1,3,-5,10,6]
var arr2 = arr.filter(function (item, index) {
    return item > 4
});
console.log(arr, arr2);//[1, 3, -5, 10, 6]   [10, 6]

1.2.5 Function扩展
● Function.prototype.bind(obj) :
作用: 将函数内的this绑定为obj, 并将函数返回

function fun(age) {
        this.name = 'Name';
        this.age = age;
 }
var obj = {};
fun.bind(obj, 18)();
console.log(obj.name, obj.age);//Name 18
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值