一 JavaScript简介
1、JavaScript起源
https://www.cnblogs.com/linhaifeng/articles/9346219.html
总结JavaScript用途:
#javaScript一般用来编写客户端脚本,来为html页面添加交互行为,是前台语言,而不是后台语言(node.js除外)
总结JavaScript的特点:
#1、解释执行(浏览器就是解释器):事先不编译、逐行执行、无需进行严格的变量声明。
#2、简单易用:可以使用任何文本编辑工具编写,只需要浏览器就可以执行程序。
#3、基于对象:内置大量现成对象,编写少量程序可以完成目标
2、JavaScript组成
#1、ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。
#2、文档对象模型(DOM) Document object model:操作网页上的元素的API。比如让盒子移动、变色、轮播图等。
#3、浏览器对象模型(BOM) Broswer object model:操作浏览器部分功能的API。比如让浏览器自动滚动
二 JavaScript引入方式
1、方式一
<script>
// 在这里写你的JS代码
</script>
2、方式二
<script src="xxx.js"></script>
三 JavaScript语法规范
#1、JavaScript对换行、缩进、空格不敏感。
ps:每一条语句末尾要加上分号,虽然分号不是必须加的,但是为了程序今后要压缩,如果不加分号,压缩之后将不能运行。
#2、所有的符号,都是英语的。比如括号、引号、分号。
#3、JavaScript的注释:
单行注释:
// 我是注释
多行注释:
/*
多行注释1
多行注释2
*/
复制代码
四 变量
1、声明变量的语法
// 1. 先声明后定义
var name; // 声明变量时无需指定类型,变量name可以接受任意类型
name= “egon”;
// 2. 声明立刻定义
var age = 18;
js是弱类型、动态语言
2、变量名命名规范
#1、由字母、数字、下划线、$ 组成,但是不能数字开头,也不能纯数字
#2、严格区分大小写
#3、不能包含关键字和保留字(以后升级版本要用的关键字)。
如: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
#4、推荐驼峰命名法:有多个有意义的单词组成名称的时候,第一个单词的首字母小写,其余的单词首字母写
#5、匈牙利命名:就是根据数据类型单词的的首字符作为前缀
3、ES6中let
ES6之前js没有块级作用域,ES6新增了let命令,用于声明变量(声明的变量属于块级作用域),流程控制语句的{}就是块级作用域。其用法类似于var,但是所声明的变量只在let命令所在的代码块内有效。例如:for循环的计数器就很适合使用let命令。
for(let i=1;i<=5;i++){}
4、常量
ES6新增const用来声明常量。一旦声明,其值就不能改变。
const PI = 3.1415926;
PI=3 //TypeError: “PI” is read-only
五 数据类型与内置方法
js是动态语言:变量里面能够存储数字、字符串等。变量会自动的根据存储内容的类型不同,来决定自己的类型。
1、数值(Number)
JavaScript不区分整型和浮点型,就只有一种数字类型,即number
var x = 3;
var y = 3.1;
var z = 13e5;
var m = 13e-5;
var n = NaN; // typeof n结果"number"
四舍五入
var num=1.3456
num.toFixed(2) // “1.35”
字符串类型转成数字
复制代码
#字符串转numbber
parseInt(“123”) // 返回123
#NaN属性是代表非数字值的特殊值。该属性用于指示某个值不是数字。
parseInt(“ABC”) // 返回NaN
#带有自动净化的功能;只保留字符串最开头的数字,后面的中文自动消失。例如:
console.log(parseInt(“18林海峰”)); //18
#只去末尾的中文,不会去开头的
console.log(parseInt(“林海峰18”)); // NaN
字符串中的数字转浮点
parseInt(“123.456”) // 返回123
parseFloat(“123.456”) // 返回123.456
#自动带有截断小数的功能:取整,不四舍五入
var a = parseInt(“1.3”) + parseInt(“2.6”); //a=3
var a = parseFloat(“1.3”) + parseFloat(“2.6”); //a=3.9
数字类型转成字符串
复制代码
#数字转成字符串类型
var x=10;
var y=‘20’;
var z=x+y; // z=‘1020’
typeof z; //String
#数字转成字符串类型
var m=123;
var n=String(m)
var a=123;
var b=a.toString()
复制代码
2、字符串(String)
var a = “Hello”
var b = "world;
var c = a + b;
console.log©; // 得到Helloworld
常用方法:
3、布尔值(Boolean)
区别于Python,true和false都是小写。
var a = true;
var b = false;
任何数据类型都可以转换为boolean类型:空字符串、0、null、undefined、NaN都是false。
复制代码
#布尔值为假的数据类型
Boolean(’’)
Boolean(0)
Boolean(null)
Boolean(undefined)
Boolean(NaN)
其余数据类型的布尔值均为真,例如
Boolean([])
Boolean(123)
复制代码
4、null和undefined
null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null;
undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。
null表示变量的值是空,undefined则表示只声明了变量,但还没有赋值。
5、常用内置对象
JavaScript 中的所有事物都是对象:字符串、数值、数组、函数…
此外I,JavaScript还提供多个内建对象,比如 Array,Date,Math 等等
对象只是带有属性和方法的特殊数据类型
5.1 数组对象Array
数组对象的作用是:使用单独的变量名来存储一系列的值。类似于Python中的列表。
var x = [“egon”, “hello”];
console.log(x[1]); // 输出"hello"
常用方法:
关于sort()需要注意:
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
var arr = [123,9,1211,11]
arr.sort()
#[11, 1211, 123, 9]
如果想按照其他标准进行排序,就需要提供比较函数,该函数应该具有两个参数 a 和 b,接收传入的a和b,执行函数体代码,然后返回一个值用于说明a和b的大小
返回值 < 0 :代表a小于b
返回值 =0 : 代表a等于b
返回值 > 0 :代表a大于b
// 注意:
var x = "5";
var y = "3";
res = x - y; //res = 2
typeof res //"number"
//实例:
function sortNumber(a,b){
return a - b
}
var arr = [123,9,1211,11]
arr.sort(sortNumber) #[9, 11, 123, 1211]
//关于遍历数组中的元素,可以使用下面的方式:
var arr = [11, 22, 33, 44];
for (var i=0;i<arr.length;i++) {
console.log(i);
}
forEach()
语法:
forEach(function(currentValue, index, arr), thisValue)
var arr=['aa','bb','cc','dd','ee']
arr.forEach(function(v,i,arr){
console.log(v,i,arr);
console.log(this[0]);
},"hello")
splice()
语法:
splice(index,howmany,item1,…,itemX)
参数:
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 可选。表示要删除的项目数量(index对应的值也算一个)。如果不指定默认值为0,代表不会删除项目。
item1, …, itemX 可选。向数组添加的新项目。
var arr=['aa','bb','cc','dd','ee']
arr.splice(1,3,'xxxx') # 删除‘bb’,‘cc’,’dd‘这三个值,然后插入’xxxx‘
arr #["aa", "xxxx", "ee"]
map()
语法:
map(function(currentValue,index,arr), thisValue)
forEach vs map:
1、forEach()返回值是undefined,不可以链式调用。
var res=arr.forEach(function(v,i,arr){
console.log(v,i,arr);
console.log(this[0]);
return 123;
},"hello")
res # undefined
2、map()返回一个新数组,原数组不会改变
var res=arr.map(function(v,i,arr){
v=v + 'SB'
return v;
},"hello")
res #["aaSB", "bbSB", "ccSB", "ddSB", "eeSB"]
在使用forEach()时候,如果数组在迭代的视乎被修改,则其他元素会被跳过
var arr=[11,22,33,44,55]
arr.forEach(function(v){
console.log(v);
if (v === 33){
arr.shift() // 下一次循环应该循环出第索引为3的元素,但此时一旦删除第一个元素,那么值55的索引变成了3
}
})
11
22
33
55
反转字符串
var str = '12345';
Array.prototype.map.call(str, function(x) { //同时利用了call()方法
return x;
}).reverse().join('');
5.2 Date日期对象
创建日期对象只有构造函数一种方式,使用new关键字
//方法1:不指定参数
var d1 = new Date();
console.log(d1.toLocaleString());
//方法2:参数为日期字符串
var d2 = new Date("2018/01/27 11:12:13");
console.log(d2.toLocaleString());
var d3 = new Date("01/27/18 11:12:13"); // 月/日/年 时分秒
console.log(d3.toLocaleString());
//方法3:参数为毫秒数
var d4 = new Date(7000);
console.log(d4.toLocaleString());
console.log(d4.toUTCString());
//方法4:参数为:年,月,日,时,分,秒,毫秒
var d5 = new Date(2018,1,27,11,12,13,700);
console.log(d5.toLocaleString()); //毫秒并不直接显示
5.4 Json对象
# JSON格式的字符串转成对象
var str1='{"name":"egon","age":18}';
var obj1=JSON.parse(str1);
console.log(obj1.name);
console.log(obj1["name"]);
# 对象转成JSON字符串
var obj2={"name":"egon","age":18};
var str2=JSON.stringify(obj2);
5.5 RegExp对象
#1. 创建正则对象的方式1
// 参数1 正则表达式
// 参数2 匹配模式:常用g(全局匹配;找到所有匹配,而不是在第一个匹配后停止)和i(忽略大小写)
// 注意:正则放到引号内,{}内的逗号后面不要加空格
var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$"); // 匹配用户名只能是英文字母、数字和_,并且首字母必须是英文字母。长度最短不能少于6位 最长不能超过12位。
reg1.test("egon_123") // true
#2. 创建正则对象的方式2
var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/; // 不要加引号
reg2.test("egon_123") // true
#3. String对象与正则结合的4个方法
var s1="hello world";
s1.match(/l/g) // 符合正则的内容["l", "l", "l"]
s1.search(/h/g) // 符合正则的内容的索引0
s1.split(/ /) // ["hello", "world"]
s1.replace(/l/g,'L') // "heLLo worLd"
#4. 匹配模式g与i
var s2="name:Egon age:18"
s2.replace(/e/,"赢") // "nam赢:Egon age:18"
s2.replace(/e/g,"赢") // "nam赢:Egon ag赢:18"
s2.replace(/e/gi,"赢") //"nam赢:赢gon ag赢:18"
#5. 注意1:
// 1、如果regExpObject带有全局标志g,test()函数不是从字符串的开头开始查找,而是从属性regExpObject.lastIndex所指定的索引处开始查找。
// 2、该属性值默认为0,所以第一次仍然是从字符串的开头查找。
// 3、当找到一个匹配时,test()函数会将regExpObject.lastIndex的值改为字符串中本次匹配内容的最后一个字符的下一个索引位置。
// 4、当再次执行test()函数时,将会从该索引位置处开始查找,从而找到下一个匹配。
// 5、因此,当我们使用test()函数执行了一次匹配之后,如果想要重新使用test()函数从头开始查找,则需要手动将regExpObject.lastIndex的值重置为 0。
// 6、如果test()函数再也找不到可以匹配的文本时,该函数会自动把regExpObject.lastIndex属性重置为 0。
var reg3 = /egon/g;
reg3.lastIndex
0
reg3.test("egon") // true,匹配成功
true
reg3.lastIndex // 匹配成功reg3.lasIndex=4
4
reg3.test("egon") // 从4的位置开始匹配,本次匹配失败
false
reg3.lastIndex // 匹配失败,lastIndex归为0
0
reg3.test("egon") // 再次匹配成功
true
#6. 注意2:
当我们不加参数调用RegExpObj.test()方法时, 相当于执行RegExpObj.test("undefined"), 并且/undefined/.test()默认返回true。
var reg4 = /^undefined$/;
reg4.test(); // 返回true
reg4.test(undefined); // 返回true
reg4.test("undefined"); // 返回true
七 流程控制
//if->else
var age = 30;
undefined
if(age > 18){
console.log('too old');
}else {
console.log('too young');
}
//if->else if->else
var age=18;
if(age > 18){
console.log('too old');
}
else if(age == 18){
console.log('花姑娘,吆西');
}
else {
console.log('too young');
}
//switch
//switch中的case子句通常都会加break语句,否则程序会继续执行后续case中的语句。
var day = new Date().getDay();
switch (day) {
case 0:
console.log("星期天,出去浪");
break;
case 6:
console.log("星期六,也出去浪");
break;
default:
console.log("工作日,正常上班")
}
for
for (let i=1;i<=3;i++){
console.log(i);
}
while
let i=0;
undefined
while (i<=3){
console.log(i);
i++;
}
//三元运算
var x=1;
var y=2;
var z=x>y?x:y
八 函数
8.1 函数的定义与调用(与python类同)
// 无参函数
function f1() {
console.log("Hello world!");
};
f1();
// 有参数函数
function f2(a, b) {
console.log(arguments); // 内置的arguments对象
console.log(arguments.length);
console.log(arguments[0],arguments[1]);
console.log(a, b);
};
f2(10,20);
// 带返回值的函数
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);
8.2 函数中的arguments参数‘
function add(a,b){
console.log(a+b);
console.log(arguments.length)
}
add(1,2)
注意:
函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回。
8.3 函数的全局变量和局部变量
#局部变量:
在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,局部变量就会被删除。
#全局变量:
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。
#变量生存周期:
JavaScript变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
8.4 作用域
首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。另外函数的作用域关系是在定义阶段就固定死的,与调用位置无关
例1
var city = “BeiJing”;
function f() {
var city = “ShangHai”;
function inner(){
var city = “ShenZhen”;
console.log(city);
}
inner();
}
f(); //输出结果是?
复制代码
例2
复制代码
var city = “BeiJing”;
function Bar() {
console.log(city);
}
function f() {
var city = “ShangHai”;
return Bar;
}
var ret = f();
ret(); // 打印结果是?
复制代码
例3
复制代码
var city = “BeiJing”;
function f(){
var city = “ShangHai”;
function inner(){
console.log(city);
}
return inner;
}
var res = f();
res();