1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,但愿这门语言可以成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的初版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。css
该标准一开始就是针对JavaScript语言制定的,可是没有称其为JavaScript,有两个方面的缘由。一是商标,JavaScript自己已被Netscape注册为商标。二是想体现这门语言的制定者是ECMA,而不是Netscape,这样有利于保证这门语言的开发性和中立性。html
所以ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。前端
年份 | 名称 | 描述 |
1997 | ECMAScript 1 | 第一个版本 |
1998 | ECMAScript 2 | 版本变动 |
1999 | ECMAScript 3 | 添加正则表达式node 添加try/catchpython |
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 描述了JavaScript语言自己的相关内容。
JavaScript 是脚本语言
JavaScript 是一种轻量级的编程语言。后来出现了node.js,能够做为后端语言来开发项目,js是一个既能作前端又能作后端的语言,可是js这个做者用了10天就开发了这么个语言,因此写的不是很完善,这个语言有不少的槽点,后面学习起来你们就知道啦。
JavaScript 是可插入 HTML 页面的编程代码。
JavaScript 插入 HTML 页面后,可由全部的现代浏览器执行。
JavaScript 很容易学习。
在head标签里面能够写,在body标签里面也能够写,放到head标签里面和放到body标签里面到底有什么区别,咱们后续在讲~
<script> // 在这里写你的JS代码
//console.log('骑士计划!') #f12建打开浏览器的调试窗口,而后在console这个调试台就能看到这个内容了
//alert('骑士计划!') #这个是浏览器窗口一打开我们这个文件,就弹出一个窗口 </script>
console:
alert:
<script src="myscript.js"></script>
// 这是单行注释 /* 这是
多行注释 */
JavaScript中的语句要以分号(;)为结束符。也就是说和缩进不要紧了
1.JavaScript的变量名可使用_,数字,字母,$组成,不能以数字开头。
2.声明变量使用 var 变量名; 的格式来进行声明
var name = "Alex";
也能够分两步,声明变量var name;而后name='Alex',可是一般咱们都是一步写完 var age = 18;
注意:
变量名是区分大小写的。
推荐使用驼峰式命名规则。首字母大写
保留字不能用作变量名。
补充:(ES6新特性,等我们学到 VUE 在细说,简单了解一下就好了)
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 保留字列表
JavaScript拥有动态类型(python也是动态的)
var x; // 此时x是undefined 静态语言好比c:建立变量的时候,要指定变量的类型,python3.6也出现了类型注解的新特性def func(x:int,y:int) --> int: return x + y,意思是参数是int类型,返回值也是int类型的,就是个注释的做用 var x = 1; // 此时x是数字 var x = "Alex" // 此时x是字符串
JavaScript不区分整型和浮点型,就只有一种数字类型。
var a = 12.34; var b = 20; var c = 123e5; // 12300000 var d = 123e-5; // 0.00123
还有一种NaN,表示不是一个数字(Not a Number),也就是说是一个值,但不是数字。
经常使用方法:
parseInt("123") // 返回123 parseInt("ABC") // 返回NaN,NaN属性是表明非数字值的特殊值。该属性用于指示某个值不是数字。 parseFloat("123.456") // 返回123.456
var a = "Hello" var b = "world; var c = a + b; console.log(c); // 获得Helloworld
经常使用方法:
方法 | 说明 |
.length #不加括号的是属性 | 返回长度 |
.trim() #获得一个新值 | 移除空白 |
.trimLeft() | 移除左边的空白 |
.trimRight() | 移除右边的空白 |
.charAt(n) #n相似索引,从0开始,超过最大值返回''空字符串 | 返回第n个字符 |
.concat(value, ...) #s1='hello';s.concat('xx');获得helloxx | 拼接 |
.indexOf(substring, start) #这个start是从索引几开始找,没有返回-1 | 子序列位置 |
.substring(from, to) #不支持负数,因此通常都不用它,了解一下就好了 | 根据索引获取子序列 |
.slice(start, end) #var s1='helloworld';s1.slice(0,-5)看结果,就用它 | 切片 |
.toLowerCase() #所有变小写 | 小写 |
.toUpperCase() #所有变大写 | 大写 |
.split(delimiter, limit)#分隔,s1.splite(' '),后面还能够加参数s1.split(' ',2),返回切割后的元素个数 | 分割 |
拼接字符串通常使用“+”
slice和substring的区别:
string.slice(start, stop)和string.substring(start, stop): 二者的相同点: 若是start等于end,返回空字符串 若是stop参数省略,则取到字符串末 若是某个参数超过string的长度,这个参数会被替换为string的长度 substirng()的特色: 若是 start > stop ,start和stop将被交换 若是参数是负数或者不是数字,将会被0替换 silce()的特色: 若是 start > stop 不会交换二者 若是start小于0,则切割从字符串末尾往前数的第abs(start)个的字符开始(包括该位置的字符) 若是stop小于0,则切割在从字符串末尾往前数的第abs(stop)个字符结束(不包含该位置字符)
补充:
ES6中引入了模板字符串。模板字符串(template string)是加强版的字符串,用反引号(`)标识,ESC键下面那个键就是反引号。它能够当作普通字符串使用,也能够用来定义多行字符串,或者在字符串中嵌入变量。你使用chorme浏览器就行,chorme浏览器支持ES6
// 普通字符串 `这是普通字符串!` // 多行文本 `这是多行的 文本` // 字符串中嵌入变量 var name = "q1mi", time = "today"; `Hello ${name}, how are you ${time}?`
上面的写法是ES6中的,而且在console中输入内容的时候,按着shift+回车来进行换行,就可以不执行代码直接换行了~~~
注意:
若是模板字符串中须要使用反引号,则在其前面要用反斜杠转义。
JSHint启用ES6语法支持:/* jshint esversion: 6 */
区别于Python,true和false都是小写。
var a = true; var b = false;
""(空字符串)、0、null、undefined、NaN都是false。
null表示变量的值是空,undefined则表示只声明了变量,但尚未赋值。
JavaScript 中的全部事物都是对象:字符串、数值、数组、函数...此外,JavaScript 容许自定义对象。
JavaScript 提供多个内建对象,好比 Number、String、Date、Array 等等,经过new实例化的对象都是object类型(var s = new String('hello'),var n = new Number(12)等),数组不须要new生命,类型就是object类型。
对象只是带有属性和方法的特殊数据类型。
数组
数组对象的做用是:使用单独的变量名来存储一系列的值。相似于Python中的列表。
var a = [123, "ABC"]; console.log(a[1]); // 输出"ABC"
经常使用方法:
方法 | 说明 |
.length | 数组的大小 |
.push(ele) | 尾部追加元素 |
.pop() | 获取尾部的元素 |
.unshift(ele) | 头部插入元素 |
.shift() | 头部移除元素 |
.slice(start, end) | 切片 |
.reverse() #在原数组上改的 | 反转 |
.join(seq)#a1.join('+'),seq是链接符 | 将数组元素链接成字符串 |
.concat(val, ...) #连个数组合并,获得一个新数组,原数组不变 | 链接数组 |
.sort() | 排序 |
.forEach() #讲了函数再说 | 将数组的每一个元素传递给回调函数 |
.splice() #参数:1.从哪删(索引), 2.删几个 3.删除位置替换的新元素(可多个元素) | 删除元素,并向数组添加新元素。 |
.map() #讲了函数再说 | 返回一个数组元素调用函数处理后的值的新数组 |
concat示例:
关于sort()须要注意:
若是调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(若有必要),以便进行比较。
上面的这种比较方式不是咱们想要的啊,怎么办?
若是想按照其余标准进行排序,就须要提供比较函数,也就是本身提供一个函数提供排序规则,该函数要比较两个值,而后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具备两个参数 a 和 b,其返回值以下:
若 a 小于 b,在排序后的数组中 a 应该出如今 b 以前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
示例:
function sortNumber(a,b){ return a - b } var arr1 = [11, 100, 22, 55, 33, 44] arr1.sort(sortNumber)
对象数组排序:
var arr= [ { 'sortNo': 2}, { 'sortNo': 1}, { 'sortNo': 5}, { 'sortNo': 6}, { 'sortNo': 7}, { 'sortNo': 3}, { 'sortNo': 9}, { 'sortNo': 4}, { 'sortNo': 0} ]; arr.sort(function(a, b){ return a.sortNo - b.sortNo; }); console.log(arr); //输出结果 //{ 'sortNo': 0} //{ 'sortNo': 1} //{ 'sortNo': 2} //{ 'sortNo': 3} //{ 'sortNo': 4} //{ 'sortNo': 5} //{ 'sortNo': 6} //{ 'sortNo': 7} //{ 'sortNo': 9}
关于遍历数组中的元素,可使用下面的两种方式:
var a = [10, 20, 30, 40]; #方式一 for (var i=0;i<a.length;i++) { console.log(a[i]); } #方式二 for (var i in a){ console.log(a[i]) }
语法:
forEach(function(currentValue, index, arr), thisValue)
参数:
参数 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|
function(currentValue, index, arr) | 必需。 数组中每一个元素须要调用的函数。 函数参数:
|
||||||||
thisValue | 可选。传递给函数的值通常用 "this" 值。 若是这个参数为空, "undefined" 会传递给 "this" 值 |
看使用:
语法:
map(function(currentValue,index,arr), thisValue)
参数:
参数 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|
function(currentValue, index,arr) | 必须。函数,数组中的每一个元素都会执行这个函数 函数参数:
|
||||||||
thisValue | 可选。对象做为该执行回调时使用,传递给函数,用做 "this" 的值。 若是省略了 thisValue ,"this" 的值为 "undefined" |
补充:
ES6新引入了一种新的原始数据类型(Symbol),表示独一无二的值。它是JavaScript语言的第7种数据类型。
JavaScript中的全部事物都是对象:字符串、数字、数组、日期,等等。在JavaScript中,对象是拥有属性和方法的数据。
咱们在学习基本数据类型的时候已经带你们了解了,JavaScript中的Number对象、String对象、Array对象等。
注意var s1 = "abc"和var s2 = new String("abc")的区别:typeof s1 --> string而 typeof s2 --> Object
JavaScript的对象(Object)本质上是键值对的集合(Hash结构),可是只能用字符串做为键。
var a = {"name": "Alex", "age": 18}; console.log(a.name); console.log(a["age"]);
遍历对象中的内容:
var a = {"name": "Alex", "age": 18}; for (var i in a){ console.log(i, a[i]); }
类型查询
typeof "abc" // "string" typeof null // "object" typeof true // "boolean" typeof 123 typeof NAN // "number" typeof undefined //undefined
typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。
对变量或值调用 typeof 运算符将返回下列值之一:
typeof null
返回为object
,由于特殊值null
被认为是一个空的对象引用。