前端三剑客-05js_ECMAScript

一丶JavaScript历史

Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,但愿这门语言可以成为国际标准。为此体现这门语言的制定者是ECMA,而不是Netscape,这样有利于保证这门语言的开发性和中立性。后来公司倒闭了,你们就继续用,一点都不顾虑了...javascript

所以ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现。css

二丶JavaScript的构成

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

三丶JavaScript引入方式

Script标签内写代码

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

引入额外的JS文件

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

四丶JavaScript语法规范

4.1注释

// 这是单行注释

/*
这是
多行注释
*/

4.2结束符

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

五丶变量声明

  1. JavaScript的变量名可使用_,数字,字母,$组成,不能以数字开头。java

  2. 声明变量使用 var 变量名; 的格式来进行声明python

  3. 变量名是区分大小写的。正则表达式

    推荐使用驼峰式命名规则。json

    保留字不能用作变量名。数组

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

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

六丶JavaScript数据类型

ps:默认刚出来的定义出来的变量的值都是undefined

var x;  // 此时x是undefined
var x = 1;  // 此时x是数字
var x = "Alex"  // 此时x是字符串

6.1数值(Number)

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("123abh")  // 返回123,会自动截断
parseInt("ABC")  // 返回NaN,NaN属性是表明非数字值的特殊值。该属性用于指示某个值不是数字。
parseFloat("123.456")  // 返回123.456

6.2字符串(String)

var a = "Hello"
var b = "world;
var c = a + b;
console.log(c);  // 获得Helloworld

经常使用方法

方法 说明
.length 返回长度
.trim() 移除空白
.trimLeft() 移除左边的空白
.trimRight() 移除右边的空白
.charAt(n) 返回第n个字符
.concat(value, ...) 拼接
.indexOf(substring, start) 子序列位置
.substring(from, to) 根据索引获取子序列
.slice(start, end) 切片
.toLowerCase() 小写
.toUpperCase() 大写
.split(delimiter, limit) 分割

新语法模版字符串 `` 既支持多行文本,也支持字符串的替换

字符串凭借相对于concat推荐使用加号拼接

切片推荐使用slice, substring不支持负数

split两个参数,一个为切分依据,第二个参数表示从切的结果中拿出几个超出了就拿最多, 不会报错

ES6中引入了模板字符串。模板字符串(template string)是加强版的字符串,用反引号(`)标识。它能够当作普通字符串使用,也能够用来定义多行字符串,或者在字符串中嵌入变量。

注意:

若是模板字符串中须要使用反引号,则在其前面要用反斜杠转义。

6.3布尔值

var a = true;
var b = false;

""(空字符串)、0、null、undefined、NaN都是false。

null和undefined

  • null表示值是空,通常在须要指定或清空一个变量时才会使用,如 name=null;
  • undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。

七丶JavaScript对象(Object)

对象只是带有属性和方法的特殊数据类型。

7.1数组

数组对象的做用是:使用单独的变量名来存储一系列的值。相似于Python中的列表。

var a = [123, "ABC"];
console.log(a[1]);  // 输出"ABC"

经常使用方法:

方法 说明
.length 数组的大小
.push(ele) 尾部追加元素
.pop() 获取尾部的元素
.unshift(ele) 头部插入元素
.shift() 头部移除元素
.slice(start, end) 切片
.reverse() 反转
.join(seq) 将数组元素链接成字符串
.concat(val, ...) 链接数组
.sort() 排序
.forEach() 将数组的每一个元素传递给回调函数
.splice() 删除元素,并向数组添加新元素。
.map() 返回一个数组元素调用函数处理后的值的新数组

splice方法 在把须要传的参数传了后续的传别的不会报错

concat 至关于python的extend

forEach()

语法:

forEach(function(currentValue, index, arr), thisValue)

两个参数时候打印数值元素和序号

splice的用法为先删回加

map()

类型查询

typeof "abc"  // "string"
typeof null  // "object"
typeof true  // "boolean"
typeof 123 // "number"

typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。

对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 若是变量是 Undefined 类型的
  • boolean - 若是变量是 Boolean 类型的
  • number - 若是变量是 Number 类型的
  • string - 若是变量是 String 类型的
  • object - 若是变量是一种引用类型或 Null 类型的

7.2运算符

算数运算符

+ - * / % ++ --
var x=10;
var res1=x++;
var res2=++x;

res1;
10
res2;
12

这里因为的x++和++x在出现赋值运算式,x++会先赋值再进行自增1运算,而++x会先进行自增运算再赋值!

比较运算符

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

注意:

1 == “1”  // true  弱等于
1 === "1"  // false 强等于//上面这张状况出现的缘由在于JS是一门弱类型语言(会自动转换数据类型),因此当你用两个等号进行比较时,JS内部会自动先将//数值类型的1转换成字符串类型的1再进行比较,因此咱们之后写JS涉及到比较时尽可能用三等号来强制限制类型,防止判断错误

逻辑运算符

&& || !

对应python 的 and or not

赋值运算符

= += -= *= /=

7.3流程控制

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++;
}

7.4三元运算

var a = 1;
var b = 2;
var c = a > b ? a : b
//这里的三元运算顺序是先写判断条件a>b再写条件成立返回的值为a,条件不成立返回的值为b;三元运算能够嵌套使用;

7.5函数

函数定义

// 普通函数定义
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;
}

函数中的arguments参数

一般配合 .length 来统计数量判断

可以获取到函数接受到的全部的参数,能够更具该参数实现对函数调用时参数的限制

function add(a,b){
  console.log(a+b);
  console.log(arguments.length);
 console.log(arguments[0]);//arguments至关于将出传入的参数所有包含,这里取得就是第一个元素1
}

add(1,2)

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

局部变量

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

全局变量:

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

变量生存周期:

JavaScript变量的生命期从它们被声明的时间开始。

局部变量会在函数运行之后被删除。

全局变量会在页面关闭后被删除。

做用域

首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。与python做用域关系查找如出一辙!

词法分析(尝试理解)

当函数调用的前一瞬间,会先造成一个激活对象: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

八丶内置对象和方法

8.1内置对象

类型 内置对象 介绍
数据类型 Number 数字对象
String 字符串对象
Boolean 布尔值对象
组合对象 Array 数组对象
Math 数学对象
Date 日期对象
高级对象 Object 自定义对象
Error 错误对象
Function 函数对象
RegExp 正则表达式对象
Global 全局对象

8.2自定义对象

JavaScript的对象(Object)本质上是键值对的集合(Hash结构),可是只能用字符串做为键。

var a = {"name": "Alex", "age": 18};
for (var i in a){
  console.log(i, a[i]);
}

8.3建立对象:

var person=new Object();  // 建立一个person对象
person.name="Alex";  // person对象的name属性
person.age=18;  // person对象的age属性

for (var i in a) {
    console.log(i, a[i]);
}

8.4Date对象

//方法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());  //毫秒并不直接显示

8.5Date对象的方法:

var d = new Date(); 
//getDate()                 获取日
//getDay ()                 获取星期
//getMonth ()               获取月(0-11)
//getFullYear ()            获取完全年份
//getYear ()                获取年
//getHours ()               获取小时
//getMinutes ()             获取分钟
//getSeconds ()             获取秒
//getMilliseconds ()        获取毫秒
//getTime ()                返回累计毫秒数(从1970/1/1午夜)

注意点,这边的月是按序号来的 须要+1才是正确月份

8.6JSON对象

var str1 = '{"name": "Alex", "age": 18}';
var obj1 = {"name": "Alex", "age": 18};
// JSON字符串转换成对象
var obj = JSON.parse(str1); 
// 对象转换成JSON字符串
var str = JSON.stringify(obj1);

8.7RegExp对象

/ 定义正则表达式两种方式
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}");
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;

// 正则校验数据
reg1.test('jason666')
reg2.test('jason666')

/*第一个注意事项,正则表达式中不能有空格*/ 

// 全局匹配
var s1 = 'egondsb dsb dsb';
s1.match(/s/)
s1.match(/s/g)
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g
reg2.test('egondsb');
reg2.test('egondsb');
reg2.lastIndex;
/*第二个注意事项,全局匹配时有一个lastIndex属性*/

// 校验时不传参数
var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
reg2.test();
reg2.test(undefined);

var reg3 = /undefined/;
reg3.test();
相关文章
相关标签/搜索