JavaScript 概述

ECMAScript 和 JavaScript的关系

1996年11月,JavaScript 的创造者 Netscape(网景) 公司,决定将 JavaScript 提交给国际标准化组织 ECMA ,希望这门语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。

该标准一开始就是针对JavaScript语言制定的,但是没有称其为JavaScript,有两个方面的原因。一是商标,JavaScript本身已被Netscape注册为商标。二是想体现这门语言的制定者是ECMA,而不是Netscape,这样有利于保证这门语言的开发性和中立性。

因此ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)

ECMAScript的历史

年份 名称 描述
1997 ECMAScript 1 第一个版本
1998 ECMAScript 2 版本变更
1999 ECMAScript 3 添加正则表达式
添加try/catch
  ECMAScript 4 没有发布
2009 ECMAScript 5 添加”strict mode”严格模式
添加JSON支持
2011 ECMAScript 5.1 版本变更
2015 ECMAScript 6 添加类和模块
2016 ECMAScript 7 增加指数运算符(**)
增加Array.prototype.includes

注:ES6就是指ECMAScript 6。

尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:

  • 核心(ECMAScript)
  • 文档对象模型(DOM) Document object model (整合js,css,html)
  • 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)

简单地说,ECMAScript 描述了JavaScript语言本身的相关内容。

  • JavaScript 是脚本语言
  • JavaScript 是一种轻量级的编程语言。
  • JavaScript 是可插入 HTML 页面的编程代码。
  • JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行。
  • JavaScript 很容易学习。

JavaScript语言规范

JavaScript引入方式

Script标签内写代码

<script>// 在这里写你的JS代码
</script>

引入额外的JS文件

<script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。
        <script>可以定义多个。

<script src="myscript.js"></script>

注释(注释是代码之母)- 和 java 注释基本一样

// 这是单行注释/*这是多行注释
*/

结束符

JavaScript中的语句要以分号(;)为结束符。

JavaScript语言基础

变量声明

  • JavaScript的变量名可以使用_,数字,字母,$组成,不能以数字开头。
  • 声明变量使用 var 变量名; 的格式来进行声明
  • 变量名是区分大小写的。
  • 推荐使用驼峰式命名规则。
  • 保留字不能用做变量名。
var name = "lp";
var age = 18;

ES6新增了 let 命令,用于声明变量。其用法类似于 var,但是所声明的变量只在 let 命令所在的代码块内有效。例如:for 循环的计数器就很适合使用 let 命令。

for (let i=0;i<arr.length;i++){...}

ES6新增 const 用来声明常量。一旦声明,其值就不能改变。

const PI = 3.1415;
PI // 3.1415
PI = 3 // TypeError: "PI" is read-only

保留字列表:

abstract
boolean
byte
char
class
const
debugger
double
enum
export
extends
final
float
goto
implements
import
int
interface
long
native
package
private
protected
public
short
static
super
synchronized
throws
transient
volatile

运算符

算数运算符

+ - * / % ++ --

比较运算符

> >= < <= != == === !==

注意:

1 == “1”  // true
1 === "1"  // false

逻辑运算符

&& || !

赋值运算符

= += -= *= /=

流程控制

if-else

var a = 10;
if (a > 5) {console.log("yes");
} else {console.log("no");
}

if-else if-else

var a = 10;
if (a > 5) {console.log("a > 5");
} else if (a < 5) {console.log("a < 5");
} else {console.log("a = 5");
}

switch

var day = new Date().getDay();
switch (day) {case 0:console.log("Sunday");break;case 1:console.log("Monday");break;default:console.log("...")
}

switch中的case子句通常都会加break语句,否则程序会继续执行后续case中的语句。

for

for (var i=0;i<10;i++) {console.log(i);
}

while

var i = 0;
while (i < 10) {console.log(i);i++;
}

三元运算

var a = 1;
var b = 2;
var c = a > b ? a : b

函数

函数定义

JavaScript 中的函数和 Python 中的非常类似,只是定义方式有点区别。

// 普通函数定义
function f1() {console.log("Hello world!");
}// 带参数的函数
function f2(a, b) {console.log(arguments);  // 内置的arguments对象console.log(arguments.length);console.log(a, b);
}// 带返回值的函数
function sum(a, b){return a + b;
}
sum(1, 2);  // 调用函数// 匿名函数方式
var sum = function(a, b){return a + b;
}
sum(1, 2);// 立即执行函数
(function(a, b){return a + b;
})(1, 2);

补充:ES6中允许使用“箭头”(=>)定义函数。

var f = v => v;
// 等同于
var f = function(v){return v;
}

如果箭头函数不需要参数或需要多个参数,就是用圆括号代表参数部分:

var f = () => 5;
// 等同于
var f = function(){return 5};var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2){return num1 + num2;
}

函数中的arguments参数

function add(a,b){console.log(a+b);console.log(arguments.length)
}add(1,2)

注意:函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回

函数的全局变量和局部变量

局部变量:在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除。

全局变量:在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

变量生存周期:

  • JavaScript变量的生命期从它们被声明的时间开始。
  • 局部变量会在函数运行以后被删除。
  • 全局变量会在页面关闭后被删除。

作用域

首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。

几个例子:

// 1.
var city = "BeiJing";
function f() {var city = "ShangHai";function inner(){var city = "ShenZhen";console.log(city);}inner();
}f();  //输出结果是?ShenZhen// 2.
var city = "BeiJing";
function Bar() {console.log(city);
}
function f() {var city = "ShangHai";return Bar;
}
var ret = f();
ret();  // 打印结果是?BeiJing// 3.闭包
var city = "BeiJing";
function f(){var city = "ShangHai";function inner(){console.log(city);}return inner;
}
var ret = f();
ret();

词法分析(尝试理解)

JavaScript中在调用函数的那一瞬间,会先进行词法分析。

词法分析的过程:

当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:

  1. 函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作。
  2. 函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
  3. 函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。

函数内部无论是使用参数还是使用局部变量都到AO上找。看两个例子:

var age = 18;
function foo(){console.log(age);var age = 22;console.log(age);
}
foo();  // 问:执行foo()之后的结果是?undefined 和 22// 第二题:
var age = 18;
function foo(){console.log(age);var age = 22;console.log(age);function age(){console.log("呵呵");}console.log(age);
}
foo();  // 执行后的结果是?
ƒ age(){console.log("呵呵");} 和 22 和22
词法分析过程:
1、分析参数,有一个参数,形成一个 AO.age=undefine;
2、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,因此不做任何处理
3、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...};最终,AO上的属性只有一个age,并且值为一个函数声明执行过程:
注意:执行过程中所有的值都是从AO对象上去寻找1、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,所以第一个输出的一个函数
2、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,所以在第二个输出的是 22
3、同理第三个输出的还是22, 因为中间再没有改变age值的语句了

前端之 JavaScript 基础相关推荐

  1. Web前端之JavaScript基础

    Web前端之JavaScript基础 JavaScript介绍 变量 变量类型 基本的数据类型Number String Boolean underfined null typeof运算符 引用的数据 ...

  2. 前端之JavaScript基础

    前端之JavaScript基础 JavaScript 将js文件引入页面 外部引入 写在文件内部 行内引入 querySelector语法格式 window.onload 变量 数据类型 JS注释 运 ...

  3. 五、前端开发-JavaScript基础

    五.前端开发语言体系-JavaScript基础 文章目录 五.前端开发语言体系-JavaScript基础 JavaScript基础 变量.值和类型 运算符和表达式 语句 数组 函数和对象 严格模式 类 ...

  4. 前端见微知著JavaScript基础篇:你所不知道的apply, call 和 bind

    在我的职业生涯中,很早就已经开始使用JavaScript进行项目开发了.但是一直都是把重心放在了后端开发方面,前端方面鲜有涉及.所以造成的一个现象就是:目前的前端知识水平,应付一般的项目已然是足够的, ...

  5. 前端学习-JavaScript基础(ES6)

    简介: ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并 ...

  6. 前端学习-JavaScript基础

    一.初识JavaScript 官网: https://www.w3.org/standards/webdesign/script 说明: JavaScript语法规范是ECMAScript,ECMAS ...

  7. Web前端开发JavaScript基础(3)

    JavaScript 一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,它的解释器被称为JavaScript引擎,是浏览器的一部分,并且是被广泛用于客户端的脚本语言,JavaS ...

  8. 【前端】JavaScript基础(二)

    目录 一.内置对象 Math对象 Data日期 数组对象 字符串对象 字符串的不可变 根据字符返回位置 根据位置返回字符(重点) 字符串基本方法(重点) 字符串的替换与转换 二.简单类型和复杂类型 简 ...

  9. 前端学习-JavaScript基础(正则表达式)

    正则表达式 正则表达式在很多程序设计语言都有,大同小异,尤其是在Python爬虫的使用很多,我也就跟他们学习爬爬图片,小视频啥的,咳咳都是学习资料.在JavaScript中,使用比较多的是表单验证,字 ...

最新文章

  1. Anaconda | CentOS7 -解决 Python2和Python3共存
  2. 5G 信令流程 — MM 定时器
  3. 剑桥大学申请start up签证的有用的网站
  4. 为什么Redis是单线程?为什么能处理大并发量?(举例不错)
  5. 使用开源工具ELK可视化 Azure NSG日志
  6. dva源码解析(一)
  7. 内核同步机制-优化屏障和内存屏障
  8. Flask-Uploads文件上传的简单使用
  9. 盘点时间管理方面的一些方法及工具
  10. Java编一个收银小票_Java编程打印购物小票实现代码
  11. 保龄球积分c语言程序,C语言保龄球积分.doc
  12. 【新书推荐】【2019.05】噩梦巷(美国屡次被禁的黑色惊悚小说。一条从头到尾漆黑的巷子——奔跑、遥不可及的光,成了他一生的梦魇...
  13. 华为鸿蒙魔法闪投大小屏幕互动,「老熊科普」魔法闪投,荣耀智慧屏就是你的“超级大手机”...
  14. Dubbo源码解析-——服务导出
  15. 播放器ocx插件——自动获取MP3时长
  16. AutoSAR系列讲解(入门篇)1.2-AutoSAR概述
  17. 经济危机与金融危机的学术解释与通俗到庸俗的解释,包你明白
  18. 网格交易法策略优化-怎么选择合适的投资品种
  19. MyEclipse-6.5注册码生成器源码
  20. 少爷,三年期限已到,不知Redis学的如何?

热门文章

  1. 多线程读取文件File
  2. PV、UV、UIP、VV、CPC、CPM、RPM、CTR指的是什么?
  3. Python 字符串查找子串的方法之 index() 和 find()
  4. ecshop 收货人信息电话必填改为手机必填
  5. 下一步工作的一些思考和问题
  6. git push/pull时总需要输入用户名密码的解决方案
  7. dede后台栏目管理文章统计数量和实际文章数不一致解决办法
  8. 自己动手,实现一种类似ListT的数据结构(二)
  9. Servlet基础知识(二)——web.xml文件的作用
  10. hadoop1常见配置含义