1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,但愿这门语言可以成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的初版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。css
该标准一开始就是针对JavaScript语言制定的,可是没有称其为JavaScript,有两个方面的缘由。一是商标,JavaScript自己已被Netscape注册为商标。二是想体现这门语言的制定者是ECMA,而不是Netscape,这样有利于保证这门语言的开发性和中立性。html
所以ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。python
JavaScript 已经由 ECMA(欧洲电脑制造商协会)经过 ECMAScript 实现语言的标准化。es6
年份 | 名称 | 描述 |
---|---|---|
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 |
注: ECMAScript 6 也称为 ECMAScript 2015。 ECMAScript 7 也称为 ECMAScript 2016。
尽管 ECMAScript 是一个重要的标准,但它并非 JavaScript 惟一的部分,固然,也不是惟一被标准化的部分。实际上,一个完整的 JavaScript 实现是由如下 3 个不一样部分组成的:正则表达式
JavaScript 是一种轻量级的编程语言。编程
JavaScript 是可插入 HTML 页面的编程代码。数组
JavaScript 插入 HTML 页面后,可由全部的现代浏览器执行。浏览器
JavaScript 很容易学习。数据结构
在head标签里面能够写,在body标签里面也能够写,放到head标签里面和放到body标签里面到底有什么区别,咱们后续在讲~ <script> // 在这里写你的JS代码 //console.log('骑士计划!') #f12建打开浏览器的调试窗口,而后在console这个调试台就能看到这个内容了 //alert('骑士计划!') #这个是浏览器窗口一打开我们这个文件,就弹出一个窗口 </script>
<script src="1.js"> </script> //有点相似于在html引入css样式,就如link
// 这是单行注释 /* 这是
多行注释 */
JavaScript中的语句要以分号(;)为结束符。也就是说和缩进不要紧了闭包
1.JavaScript的变量名可使用_,数字,字母,$组成,不能以数字开头。(和大多数编程语言相似)
2.声明变量使用 var 变量名; 的格式来进行声明(这个比较不同)
var a='今每天气真好'
也能够分两步,声明变量var a;而后a='今每天气真好',可是一般咱们都是一步写完 var b = 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 | else | instanceof | super |
boolean | enum | int | switch |
break | export | interface | synchronized |
byte | extends | let | this |
case | false | long | throw |
catch | final | native | throws |
char | finally | new | transient |
class | float | null | true |
const | for | package | try |
continue | function | private | typeof |
debugger | goto | protected | var |
default | if | public | void |
delete | implements | return | volatile |
do | import | short | while |
double | in | static | with |
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 123*10^5 var d = 123e-5; // 0.00123
还有一种NaN,表示不是一个数字(Not a Number),也就是说是一个值,但不是数字。
经常使用方法:
parseInt("123") // 返回123 parseInt("ABC") // 返回NaN,NaN属性是表明非数字值的特殊值。该属性用于指示某个值不是数字。 parseFloat("123.456") // 返回123.456
字符串(String)
var a='python';
var b='牛逼';
var c=a+b;
console.log(c) ; //返回python牛逼 能够拼接
经常使用方法:
方法 | 说明 |
.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)个字符结束(不包含该位置字符) slice和substring的区别
补充:
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 */
也只有true和false,和pyhon的差异就是python是大写,二这个是小写
var a=true;
var b=false;
全部的'空'都是假的 :""(空字符串)、0、null、undefined、NaN都是false.
null表示变量的值是空,undefined则表示只声明了变量,但尚未赋值。
JavaScript 中的全部事物都是对象:字符串、数值、数组、函数...此外,JavaScript 容许自定义对象。
JavaScript 提供多个内建对象,好比 String、Date、Array 等等。
对象只是带有属性和方法的特殊数据类型。
数组(arry)
数组对象的做用是:使用单独的变量名来存储一系列的值。相似于Python中的列表。
var a=['1',2,'3']
conselo.log(a[1]) //返回2
经常使用方法:
方法 | 说明 |
.length | 数组的大小 |
.push(ele) | 尾部追加元素 |
.pop() | 获取尾部的元素 |
.unshift(ele) | 头部插入元素 |
.shift() | 头部移除元素 |
.slice(start, end) | 切片 |
.reverse() #在原数组上改的 | 反转 |
.join(seq)#a1.join('+'),seq是链接符 | 将数组元素链接成字符串 |
.concat(val, ...) #连个数组合并 | 链接数组 |
.sort() | 排序 |
.forEach() #讲了函数再说 | 将数组的每一个元素传递给回调函数 |
.splice() | 删除元素,并向数组添加新元素。 |
.map() #讲了函数再说 | 返回一个数组元素调用函数处理后的值的新数组 |
语法:
splice(index,howmany,item1,.....,itemX)
参数:
参数 | 描述 |
---|---|
index | 必需。规定从何处添加/删除元素。 该参数是开始插入和(或)删除的数组元素的下标,必须是数字。 |
howmany | 必需。规定应该删除多少元素。必须是数字,但能够是 "0"。 若是未规定此参数,则删除从 index 开始到原数组结尾的全部元素。 |
item1, ..., itemX | 可选。要添加到数组的新元素 |
关于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 a=[1,2,3,4];
for (i=0,i<a.length,i++) //先打印i再自加1,由于i的优先级很低
{onsole.log(a[i])}
typeof "abc" // "string" typeof null // "object" typeof true // "boolean" typeof 123 typeof NAN // "number"
typeof undefined //undefined
typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。
对变量或值调用 typeof 运算符将返回下列值之一:
+ - * / % ++ -- i++,是i自加1,i--是i自减1 //i++.i--的优先级都比较低
> >= < <= != == === !==
注意:
1 == “1” // true #弱等于,将1转换为字符串'1',在=号两个数据类型不一样的时候,会自动给你变成相同的,具体怎么一个变换规则,先不用理他,由于这种比较很差,由于之后我们就尽可能用===。
1 === "1" // false #强等于,比较类型也比较值 //经常使用的是这个
提一个输入法的高级用法:搜狗输入法的一个高级用法:不认识的字:先输入一个字母uhuohuohuo,就看到了焱,不会写大写的12345怎么办?先输入一个v12345,你就看到壹万贰仟叁佰肆拾伍了。
&& || ! #and,or,非(取反)!null返回true
= += -= *= /= #n += 1其实就是n = n + 1
var a = 10; if (a > 5){ console.log("yes"); }else { console.log("no"); }
var a = 10; if (a > 5){ console.log("a > 5"); }else if (a < 5) { console.log("a < 5"); }else { console.log("a = 5"); }
var day = new Date().getDay(); //示例化一个今天的日期对象,getDay()是获取天数的编号,0表示星期日 switch (day) { //这里day这个参数必须是一个值或者是一个可以获得一个值的算式才行,这个值和后面写的case后面的值逐个比较,知足其中一个就执行case对应的下面的语句,
而后break,若是没有加break,还会继续往下判断 case 0: //若是day是0 console.log("Sunday"); //执行它 break; //而后break跳出 case 1: console.log("Monday"); break; default: //若是没有任何知足条件的,就执行它 console.log("...") }
switch中的case子句一般都会加break语句,不然程序会继续执行后续case中的语句。
for (var i=0;i<10;i++) { //就这么个写法,声明一个变量,变量小于10,变量每次循环自增1,for(;;){console.log(i)};这种写法就是个死循环,会一直循环,直到你的浏览器崩了,就不工做了,回头能够拿别人的电脑试试~~ console.log(i); }
var i = 0; while (i < 10) { console.log(i); i++; }
var a = 1; var b = 2; var c = a > b ? a : b //若是a>b这个条件成立,就把冒号前面的值给c,不然把冒号后面的值给c //python中的:a = x if x>y else y
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; //在js中,若是你想返回多个值是不行的,好比return a ,b;只能给你返回最后一个值,若是就想返回多个值,你能够用数组包裹起来 return [a,b]; } sum(1, 2); // 调用函数 sum(1,2,3,4,5)参数给多了,也不会报错,仍是执行前两个参数的和,sum(1),少参数或者没参数也不报错,不过返回值就会是NAN // 匿名函数方式,多和其余函数配合使用,后面咱们就会用到了 var sum = function(a, b){ //在es6中,使用var,可能会飘黄,是由于在es6中,建议你使用let来定义变量,不过不影响你使用 return a + b; } sum(1, 2); // 当即执行函数,页面加载到这里,这个函数就直接执行了,不须要被调用执行 (function(a, b){ return a + b; })(1, 2); //python中写能够这么写:ret=(lambda x,y:x+y)(10,20) 而后print(ret)
补充:
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; }
function add(a,b){ console.log(a+b); console.log(arguments.length) //获取传入的参数的个数,arguments就是指的你传入的全部的实参,放在一个数组里面,这个arguments.length是统计这个数组的元素的个数。 } add(1,2)
输出:
3 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(); ---> ShangHai
JavaScript中在调用函数的那一瞬间,会先进行词法分析。
词法分析的过程:
当函数调用的前一瞬间,会先造成一个激活对象:Avtive Object(AO),并会分析如下3个方面:
1:函数参数,若是有,则将此参数赋值给AO,且值为undefined。若是没有,则不作任何操做。
2:函数局部变量,若是AO上有同名的值,则不作任何操做。若是没有,则将此变量赋值给AO,而且值为undefined。
3:函数声明,若是AO上有,则会将AO上的对象覆盖。若是没有,则不作任何操做。
函数内部不管是使用参数仍是使用局部变量都到AO上找。
看两个例子:
var age = 18; function foo(){ console.log(age); //分析到这一步的时候,发现你下面有age变量声明,那么age变量就在AO对象上村上了,而且值为undefined,因此函数在执行的时候,尚未到age=22这步的时候,age=undefined var age = 22; //若是没有这个变量声明,那么打印的结果应该是18 console.log(age); } foo(); // 问:执行foo()以后的结果是?
undefined
22
第二题:
var age = 18; function foo(){ console.log(age); var age = 22; console.log(age); function age(){ #发现age这个函数名也是变量,将OA上的变量给替换了,那么函数在执行的时候,去OA上找,发现OA是个函数,而后执行到age=22的时候,age才被从新赋值 console.log("呵呵"); } console.log(age); } foo(); // 执行后的结果是?
结果:
function age(){
console.log("呵呵");
}
22
22
答案解析:
词法分析过程: 一、分析参数,有一个参数,造成一个 AO.age=undefine; 二、分析变量声明,有一个 var age, 发现 AO 上面已经有一个 AO.age,所以不作任何处理 三、分析函数声明,有一个 function age(){...} 声明, 则把原有的 age 覆盖成 AO.age=function(){...}; 最终,AO上的属性只有一个age,而且值为一个函数声明 执行过程: 注意:执行过程当中全部的值都是从AO对象上去寻找 一、执行第一个 console.log(age) 时,此时的 AO.age 是一个函数,因此第一个输出的一个函数 二、这句 var age=22; 是对 AO.age 的属性赋值, 此时AO.age=22 ,因此在第二个输出的是 22 三、同理第三个输出的仍是22, 由于中间再没有改变age值的语句了
这些内容就是好多人搞不明白的,常常写js代码的时候,发现本身的结果不对啊,什么状况,就是由于这个没搞清楚~~~
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]); }
建立对象:
var person=new Object(); // 建立一个person对象 person.name="Alex"; // person对象的name属性 person.age=18; // person对象的age属性
面向对象,在ES5中没有类的概念,只有个构造函数,命名的首字母要大写,实例化的时候使用new关键字进行实例化
function Person(name){ this.name=name } console.log(p1.name)
Person.prototype.func1 = function(){ //添加一些方法,使用prototype,叫作原型链 方法
console.log(this.name,'爱编程!')
}
var p1 = new Person('chao');
p1.func1() #chao
#chao 爱编程! 相似于python中的面向对象,了解一下就能够了
注意:
ES6中提供了Map数据结构。它相似于对象,也是键值对的集合,可是“键”的范围不限于字符串,各类类型的值(包括对象)均可以当作键。
也就是说,Object结构提供了“字符串--值”的对应,Map结构提供了“值--值”的对应,是一种更完善的Hash结构实现。
map的使用:(map也是了解内容,有兴趣的能够研究一下)
扩展:JavaScript面向对象之继承:(目前做为了解,你们有兴趣的能够自行研究一下)
建立Date对象
//方法1:不指定参数 var d1 = new Date(); //获取当前时间 console.log(d1.toLocaleString()); //当前时间日期的字符串表示 //方法2:参数为日期字符串 var d2 = new Date("2004/3/20 11:12"); console.log(d2.toLocaleString()); var d3 = new Date("04/03/20 11:12"); console.log(d3.toLocaleString()); //方法3:参数为毫秒数,了解一下就行 var d3 = new Date(5000); console.log(d3.toLocaleString()); console.log(d3.toUTCString()); //方法4:参数为年月日小时分钟秒毫秒 var d4 = new Date(2004,2,20,11,12,0,300); console.log(d4.toLocaleString()); //毫秒并不直接显示
Date对象的方法:
var d = new Date(); //getDate() 获取日 //getDay () 获取星期 //getMonth () 获取月(0-11) //getFullYear () 获取完全年份 //getHours () 获取小时 //getMinutes () 获取分钟 //getSeconds () 获取秒 //getMilliseconds () 获取毫秒 //getTime () 返回累计毫秒数(从1970/1/1午夜)
练习:
编写js代码,将当前日期按“2017-12-27 11:11 星期三”格式输出。
详细Date对象方法:点我
var str1 = '{"name": "Alex", "age": 18}'; var obj1 = {"name": "Alex", "age": 18}; // JSON字符串转换成对象 var obj = JSON.parse(str1); // 对象转换成JSON字符串 var str = JSON.stringify(obj1);
RegExp相关:用的比较多
Math: