文章目录
历史
在1995 年 Netscape 一位名为 Brendan Eich 的工程师创造了 JavaScript,随后在 1996 年初,JavaScript 首先被应用于 Netscape 2 浏览器上。
又过了几个月,Netscape 将 JavaScript 提交至 Ecma International(一个欧洲标准化组织), ECMAScript 标准第一版便在 1997 年诞生了。
在 1999 年以 ECMAScript 第三版的形式进行了更新,从那之后这个标准没有发生过大的改动。
2009 年 12 月发布的 ECMAScript 第五版,2015 年 6 月发布的第六版,即 ES6 或 ES2015。
语法
类型
- Number(数字):遵循 IEEE 754 标准的双精度 64 位格式浮点数
- String(字符串):一串UTF-16编码单元的序列,每一个编码单元由一个 16 位二进制数表示
- Boolean(布尔):0、空字符串("")、NaN、null 和 undefined 可以被(隐式)转换为 false
- Symbol(符号)(ES2015 新增)
- Object(对象)
- Function(函数)
- Array(数组)
- Date(日期)
- RegExp(正则表达式)
- null(空)
- undefined(未定义):表示一个未初始化的值,实际上是一个不允许修改的常量
变量
在 JavaScript 中声明一个新变量的方法是使用关键字 let 、const 和 var:
- let 语句声明一个块级作用域的本地变量;(ES6新特性)
- const 允许声明一个不可变的常量;(ES6新特性)
- var 是最常见的声明变量的关键字。它没有其他两个关键字的种种限制(整个函数可见)。这是因为它是ES6之前在 JavaScript 声明变量的唯一方法。
运算符
- JavaScript的算术操作符包括 +、-、*、/ 和 % ——求余(与模运算相同);
- JavaScript 中的比较操作使用 <、>、<= 和 >=;
- 相等比较,== 会自动进行类型转换后比较,=== 则不会自动进行类型转换,比较时要求类型和值均一致才行; != 和 !== 同理;
控制结构
JavaScript 的控制结构与其他类 C 语言类似:
- 使用 if 和 else 来定义条件语句;
- 支持 while 循环和 do-while 循环;
- for 循环与 C 中的相同;
- 支持 for (let value of array) { … };
- 支持 for (let property in object) { … };
- && 和 || 运算符使用短路逻辑来进行条件控制;
- 支持 三元操作符?: ;
- 可以使用基于一个数字或字符串的 switch 语句;
对象
概念
JavaScript 中的对象,Object,可以简单理解成“名称-值”对(而不是键值对:现在,ES 2015 的映射表(Map),比对象更接近键值对),不难联想 JavaScript 中的对象与下面这些概念类似:
- Python 中的字典(Dictionary)
- Perl 和 Ruby 中的散列/哈希(Hash)
- C/C++ 中的散列表(Hash table)
- Java 中的散列映射表(HashMap)
- PHP 中的关联数组(Associative array)
定义一个对象
var obj = {
name: "Carrot",
_for: "Max",//'for' 是保留字之一,使用'_for'代替
details: {
color: "orange",
size: 12
}
}
赋值和访问
对象属性可以通过如下两种方式进行赋值和访问:
obj.name = 'Simon';
obj['name'] = 'Simon';
key使用变量来定义
从 ECMAScript 2015 开始,对象键可以在创建时使用括号表示法由变量定义:
let phoneType = 'myKey';
var userPhone = {[phoneType]: 12345}
// 等效于
var userPhone = {};
userPhone[phoneType] = 12345
数组
定义和使用数组
var a = ["dog", "cat", "hen"];
a[100] = "fox";
// 数组的长度是比数组最大索引值多一的数
a.length; // 101
遍历方法
- for (var i = 0; i < a.length; i++);
- for (const currentValue of a);(ES6引入)
- for (var i in a);
- a.forEach(function(currentValue, index, array) { … });(ES5引入)
数组的方法
数组支持的其他方法:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
函数
函数入参
函数实际上是访问了函数体中一个名为 arguments 的内部对象,这个对象就如同一个类似于数组的对象一样,包括了所有被传入的参数。
使用剩余参数来替代这个内部对象可以更简洁:
function avg(...args) { .. }
匿名函数
var avg = function() { .. }
内部函数
JavaScript 允许在一个函数内部定义函数。
闭包
每当 JavaScript 执行一个函数时,都会创建一个作用域对象(scope object),用来保存在这个函数中创建的局部变量。
- 每次函数被执行的时候,就会创建一个新的,特定的作用域对象;
- 与全局对象(如浏览器的 window 对象)不同的是,你不能从 JavaScript 代码中直接访问作用域对象,也没有 可以遍历当前作用域对象中的属性 的方法。
一个闭包,就是 一个函数 与其 被创建时所带有的作用域对象 的组合。
闭包允许你保存状态——所以,它们可以用来代替对象。
ES6 新特性
let const
参见上文
箭头函数
//es5
var fun = function() {
}
//es6
var fn = () => {
}
class类
S6 中支持 class 语法,不过,ES6的class不是新的对象继承模型,它只是原型链的语法糖表现形式。
对象属性加强
- 属性定义支持短语法 obj = { x, y }
- 属性名支持表达式 obj = {[“baz” + quux() ]: 42}
解构赋值
自动解析数组或对象中的值:
[ b, a ] = getVal() //函数返回值的解构
let { a, b, c } = objABC
剩余参数
参见上文
更多
参见:https://fangyinghang.com/es-6-tutorials/
参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript