1:ES5简介

ECMAScript 5.1 (或仅 ES5) 是ECMAScript(基于JavaScript的规范)标准的修正。 与HTML5规范进程本质类似,ES5通过对现有JavaScript方法添加语句和原生ECMAScript对象做合并实现标准化。


2:严格模式的意义

  相对于正常模式而言:

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

2:消除代码运行的一些不安全之处,保证代码运行的安全。

3:提高编译器效率,增加运行速度。

4:为未来新版本的Javascript做好铺垫。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。


3:进入严格模式

进入“严格模式”的标志,书写这行语句:"use strict";

老版本的浏览器会把它当作一行普通字符串,加以忽略。


4:如何调用严格模式

"严格模式"有两种调用方法,适用于不同的场合。

针对整个脚本文件:将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。

针对单个函数:将"use strict"放在函数的第一行,则整个函数以"严格模式"运行。

脚本文件的变通写法:因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。

eg:

// a.js (组员a的js代码引入严格模式)
/* 'use strict';
var a = 4;
var b = 3;
console.log(a + b);*/
// b.js(组员b的js代码引入正常模式)
/*
var c = 6;
var d = 7;
console.log(c + d);*/
//项目上线代码合并(如果直接合并代码,组员b的代未按照严格模式规范来coding,语法可能发生各种问题)。
//解决方案:将代码分别封装进入两个匿名自执行函数
(function () {
'use strict';
var a = 4;
var b = 3;
console.log(a + b);
})();
(function () {
var c = 6;
var d = 7;
console.log(c + d);
})();

5:严格模式改变语法和行为

严格模式对Javascript的语法和行为,都做了一些改变。

1:全局变量显式声明。

在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。因此,严格模式下,变量都必须先用var命令声明,然后再使用。

javascrip中的变量讲解中函数内部不加关键字var定义的全局变量如果引入严格模式,运行程序将会检查出语法错误。采用显示声明全局变量。

2:函数形参不允许重复。

3:禁止使用with语句。

4:禁止函数内部this关键字指向全局对象,this指向undefined。

5:函数必须声明在顶层。

将来Javascript的新版本会引入“块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

// if(1){function a(){}} else {function a() {}}


6:ES5新增函数方法

this是函数内部默认内置的一个变量(注:新增方法IE6/7/8均不支持,此处针对是正常的模式的说明。严格模式中this在全局环境中不能指向window,指向undefined)

1:全局环境中,this指向的是window

2:在函数内部,this指向的是window

3:在方法内部,this指向的是方法的拥有者

bind方法:改变了函数内部上下文的this。返回值是函数。在调用返回函数时,传入的实参是在bind中传入参数的基础上往后排的。

var obj = {
name: '张三'
};
var name = '李四';
function hello(x, y) {
var name = '王五';
console.log(arguments);
//输出三个参数,参数的排序是先排bind中的参数,接着是调用参数的实参,则参数:
//arguments[0]=6,arguments[0]=7,arguments[0]=9
console.log(this.name); //张三
console.log(x + y); //13
}
var newHello = hello.bind(obj, 6);
//打印函数的调用可以看出返回值是函数,调用返回函数时,传入的参数则为bind方法的参数,拼接调用返回函数的实参
newHello(7, 9);
var obj={name:"小明"}
var name ="全局变量";
function helloworld () {
var name = "局部变量";
console.log("this.name="+this.name+"||"+"name="+name);
}
helloworld();
//this指向window对象,helloworld()相当于window调用,this指向函数的调用者window,故this.name="全局变量"
console.log("————————————————我是分割线————————————————")
var newhelloworld=helloworld.bind(obj);
newhelloworld();
//bind方法改变函数内部上下文的this指向对象obj,故输出this.name="小明"

释义:函数与方法

  函数(function)是可以执行的javascript代码块,由javascript程序定义或javascript实现预定义。函数可以带有实际参数或者形式参数,用于指定这个函数执行计算要使用的一个或多个值,而且还可以返回值,以表示计算的结果。

  方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。假设有一个函数是fn,一个对象是obj,那么就可以定义一个method:
  
obj.method = fn;   obj.method(); //定义之后的调用 虽然区别对待函数和方法比较有用,但实际比较起来,它们之间并没有想象中那么大的差别。这样讲吧,函数是可以用函数直接量定义,也就是函数可以直接储存在变量之中,因为函数和字符串、数值一样也是数据类型。假如储存函数的变量是全局变量,也即是window对象的一个属性。因此,当你调用这个函数时,实际上也是调用window对象的一个方法。所以在函数和方法之间并没有技术上的区别,真正的差别在于设计和目的,方法是用来对this对象进行操作的,this对象是方法的一个重要属性,当this对象出现在方法主体内部,this值就指向调用该方法的对象。而函数通常是独立的,并不需要经常使用this对象。 function Rect(w, h){ //使用this对象,避免自己调用自己
this.width = w;
this.height = h;
}
function area(){
return this.width * this.height;
}
var r = new Rect(4, 5);
r.area = area; //将函数赋值给对象的属性,来定义方法 var result = r.area(); //20

函数与方法


7:ES5新增数组方法

1:forEach方法:遍历数组。第二个参数为可选的上下文参数(改变this指向)。

形参释义:v:代表value  k:代表key  arr:代表array数组

forEach方法中的function回调支持3个参数,第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。forEach不会遍历空位置的内容。如:[1, , 3],只会遍历1和3。

// 数组对象新增的方法
var arr = [1, 4, 7, 9];
// forEach方法
// 语法:arr.forEach(function (v, k, arr) {}, context);
arr.forEach(function (v, k, arr) {
console.log(this);//小明
console.log(v, k, arr);
}, '小明');

2:map方法:将数组映射成新数组。回调函数需要有返回值。

var newArr = arr.map(function (v) {
return v * 2;
});

3:filter方法:指数组过滤后,返回过滤后的新数组。 filter的callback函数需要返回布尔值true或false。

// 语法:arr.filter(function (v, k, arr) {}, context)
var newArr = arr.filter(function (v) {
if(v > 5) {
return true;//返回true将值添加到新的数组
}
     else {
return false;//返回false将值不添加新的数组
} });

4:some方法:指是否“某些项”合乎条件。返回布尔值。只要数组中有一项符合条件,则返回true。

// 语法:arr.some(function (v, k, arr) {}, context)
var bool = arr.some(function (v) {
if(v > 10) {
return true;//只要进入此语句接收到的返回值true,否则为false
} else {
return false;
}
});

5:every方法:所有项都必须合乎条件。返回布尔值。

// 语法:arr.every(function (v, k, arr) {}, context)
var bool = arr.every(function (v) {
if(v > 0) {
return true;
} else {
return false;//只要进入此语句接收到的返回值false,否则为true
} }); 

语法:array.every(callback, [ thisobject]); 必须每一项都要符合条件,否则返回false。

6:indexOf方法:返回整数索引值,如果没有匹配(严格匹配),返回-1。 fromIndex可选,表示从这个位置开始搜索,若缺省或格式不合要求,使用默认值0。

var arr=[1,4,7,9];
arr.indexOf(7,-2)
//2 从-2的位置开始从左向右查找7,下标为2
arr.indexOf(4,-2)
//-1 从-2的位置从左向右开始查找4,未找到4 输出-1

7:lastIndexOf方法:从数组的末尾开始查找,而不是从开头。还有一个不同就是fromIndex的默认值是array.length - 1而不是0。

// lastIndexOf:在数组中查找某个元素。从右往左

var arr = [1, 4, 7, 9, 8, 7, 10];

var iIndex = arr.lastIndexOf(7, 4);
//从数组值为8的位置4,从右向左查找 返回数组下标注 返回值为2 console.log(iIndex); 

8:reduce方法:归并。递归减少。

 reduce语法:arr.reduce(function (previous, current, index, arr) {}, initialValue);

callback函数接受4个参数:之前值、当前值、索引值以及数组本身。initialValue参数可选,表示初始值。

1》若指定,则当作最初使用的previous值;

案例:

var arr = [1, 4, 7, 9];

var result = arr.reduce(function (previous, current) {
console.log(previous, current);
return previous + current;
}, 10); console.log(result); //结果为31

结果列表:

解析:previous值:initialValue初始值 10,current值:数组的第一个元素arr[0]=1,紧接着进行迭代current值即当前值  ,最终结果为数组arr元素值得和加初始值,则为31

2》如果缺省,则使用数组的第一个元素作为previous初始值,同时current往后排一位,相比有initialValue值少一次迭代。

案例:

var arr = [1, 4, 7, 9];

var result = arr.reduce(function (previous, current) {
console.log(previous, current);
return previous + current;
}); console.log(result); //结果为21

结果列表:

解析:previous值:initialValue初始值为数组arr[0]=1,current值:数组的第一个元素arr[1]=4,紧接着进行迭代current值即当前值  ,最终结果为数组arr元素值得和加初始值,则为21

1:因为initialValue不存在,因此一开始的previous值等于数组的第一个元素。

2:从而current值在第一次调用的时候就是2。

3:最后两个参数为索引值index以及数组本身array。

9:reduceRight方法:和reduce用法类似,实现上差异在于reduceRight是从数组的末尾开始实现。

案例:

var arr = [1, 4, 7, 9];

var result = arr.reduceRight(function (previous, current) {
console.log(previous, current);
return previous + current;
}, 10); console.log(result);

结果列表:

10:Array.isArray():判断一个变量是否为数组。


8:ES5新增字符串方法

  trim方法:去除字符串首尾的空白字符。

// trim:忽略字符串左右两侧的空格。

var str = '  hello world  ';

console.log(str.trim());//值:hello world

9:ES5新增JSON(javascript object notation)对象方法 

1:JSON.stringify:将对象转换成JSON格式的字符串。

var obj = {
name: '张三',
hello: function () {
console.log('hello world!')
}
};
console.log(JSON.stringify(obj));
//将对象属性转换成字符串,函数直接省略

2:JSON.parse:将一个JSON格式的字符串转换成对象。(字符串内对应对象的键必须用双引号,单引号有问题)

var str = '{"name": "张三", "age": 28, "hello":{"child": "李四"}}';
//严格按照对象的属性进行创建字符串,字符串内可包含对象的属性及嵌套的对象,不能包含函数
console.log(JSON.parse(str));

  

从零开始学习前端JAVASCRIPT — 2、JavaScript基础ES5的更多相关文章

  1. 李洪强和你一起学习前端之(3)Css基础和选择器

    大家好! 经过了前面的学习,是不是对前端的学习有了初步的了解.虽然我之前有iOS开发的经验,现在接触一门新的语言,对我来说 有一定的优势,但是一门技术对于谁来说都是公平的,我承认,我在接触新知识的时候 ...

  2. 从零开始学习前端JAVASCRIPT — 1、JavaScript基础

    1:定义:javascript是一种弱类型.动态类型.解释型的脚本语言. 弱类型:类型检查不严格,偏向于容忍隐式类型转换. 强类型:类型检查严格,偏向于不容忍隐式类型转换. 动态类型:运行的时候执行类 ...

  3. 从零开始学习前端JAVASCRIPT — 10、JavaScript基础ES6(ECMAScript6.0)

    ECMAScript 6.0(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发 ...

  4. 从零开始学习前端JAVASCRIPT — 7、JavaScript基础EVENT

    1:事件驱动 1)事件:所谓事件就是js侦测到的用户的操作或是页面的一些行为(怎么发生的) 2)事件源对象:引发事件的元素.(发生在谁的身上) 3)事件处理程序:对事件处理的程序或是函数 (发生了什么 ...

  5. 从零开始学习前端JAVASCRIPT — 9、JavaScript基础RegExp(正则表达式)

    1:正则的概念 正则表达式(regular expression)是一个描述字符规则的对象.可以用来检查一个字符串是否含有某个子字符串,将匹配的子字符串做替换或者从某个字符串中取出符合某个条件的子串等 ...

  6. 从零开始学习前端JAVASCRIPT — 8、JavaScript基础COOKIE

    1:通信协议 定义:通信协议是指双方实体完成通信或服务所必须遵循的规则和约定.协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到 ...

  7. 从零开始学习前端JAVASCRIPT — 4、JavaScript基础Math和Date对象的介绍

    Math对象的介绍 1:Math对象 Math 对象用于执行数学任务.并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math().您无需创建它,通过把 Math 作为对象使用就 ...

  8. 从零开始学习前端JAVASCRIPT — 3、JavaScript基础string字符串介绍

    1:字符串 JS中的任何数据类型都可以当作对象来看.所以string既是基本数据类型,又是对象. 2:声明字符串 基本数据类型:var sStr = '字符串'; 对象的方法:var oStr = n ...

  9. 从零开始学习前端JAVASCRIPT — 6、JavaScript基础DOM

    1:DOM(Document  Object  Model)的概念和作用 document对象是DOM核心对象:对html中的内容,属性,样式进行操作. 节点树中节点之间的关系:父子,兄弟. 2:DO ...

随机推荐

  1. windows下查看端口占用情况及关闭相应的进程

    经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,如何知道谁占有了我们需要的端口,很多人都比较头疼,下面就介绍一种非常简单的方法. 例如:需要查看9001端口被谁占用,并将其进程强制关闭 在 ...

  2. springBoot系列教程08:拦截器(Interceptor)的使用

    拦截器intercprot  和 过滤器 Filter 其实作用类似 在最开始接触java 使用struts2的时候,里面都是filter 后来springmvc时就用interceptor 没太在意 ...

  3. oracle 导入 dmp

    执行命令 imp his/his@orcl File=/home/oracle/core_his50_common.dmp FULL=Y

  4. 最新swift4.0 图片进行尺寸大小及体积压缩

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Menlo; color: #4dbf56; background-color: #282b3 ...

  5. golang 栈操作

    Monk's Love for Food   Our monk loves food. Hence,he took up position of a manager at Sagar,a restau ...

  6. value toDF is not a member of org.apache.spark.rdd.RDD

    idea显示toDF() 没有这个函数,显示错误: Error:(82, 8) value toDF is not a member of org.apache.spark.rdd.RDD[com.d ...

  7. 【Java框架型项目从入门到装逼】第八节 - 用EasyUI绘制主界面

    1.引入资源包 在上一节中,我们把基本的框架都搭好了,用了Spring,SPringMVC.这一节,我们先来画页面,前端框架采用EasyUI来实现. easyui是一种基于jQuery的用户界面插件集 ...

  8. Python进阶内容(四)--- 迭代器(Iterator)与生成器(Generator)

    迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  9. 使用GPA针对android应用的绘制分析

    使用GPA针对android应用的绘制分析 以前经常用GPA来perf端游的绘制,很多perf工具例如perfhud,pix对于加壳的程序总是束手无策,但是GPA却不受这个限制,可以自动HOOK 3D ...

  10. 7、ABPZero系列教程之拼多多卖家工具 修改注册功能

    本篇开始进入重头戏,之前的几篇文章都是为了现在的功能作准备.前面教程已经讲到修改User表结构,接下来就需要修改注册逻辑代码. 注册页面 修改Register.cshtml,备注如下代码: 文件路径: ...