一、什么叫JS?
1、JS的概念
JS,是JavaScript的缩写形式,而JavaScript是一种基于对象和事件驱动并且具有相对安全性的客户端脚本语言。它在Web开发中JS占据着举足轻重的地位,所有交互、逻辑层的代码都应该由它来实现。
2、JS所扮演的角色
如果把网站建设比喻成盖楼房,那么HTML就是这个楼房的钢筋水泥,CSS就是楼房的布局装饰,而JS就是楼房中大大小小无处不在的开关了。从这样的角度而言,JS就是Web开发中负责逻辑层的语言,而现如今相当火热的“用户体验”的概念,最重要的代码部分还是需要JS来编写。
3、使用/引用JS的三种方式
① 在HTML标签中,直接内嵌JS(并不提倡使用):
eg:<button οnclick="alert('你还真点呀!!')">点我呀!!!</button>
>>>不符合w3c关于内容与行为分离的要求!!!
代码如下:
运行结果如下:
② 在HTML页面中使用<script></script>包裹JS代码;’
eg:
<script type="text/javascript">
//JS代码
</script>
>>>script标签可以放到页面的任何位置。
③ 引入外部的js文件:
eg:<script language="JavaScript" src="js/01-课堂笔记.js"></script>
[注意事项]
①<script></script>可以嵌入到页面的任意位置,但是,位置的不同会导致js代码的执行顺序不同。
比如:<script></script>放到<body>前面,则js代码会在页面加载之前就执行;
②引入外部的js代码,<script></script>必须是成对出现的标签,而且标签中不能再有任何的js代码。
二、JS中的变量
1、js中变量声明的写法
var num = 10; //使用var声明的变量,属于局部变量,只在当前作用域有效;
num = 10; //不用var声明的变量,默认为全局变量,在整个js文件中都有效;
var x=8,y,z=10; //使用一行语句,同时声明多个变量。上式中,y属于已声明,但是是未赋值状态,结果为undefined(定义了,没有赋值的);
[声明变量的注意事项]
①js中所有变量的声明均使用var关键字。变量具体是什么数据类型,取决于给变量赋值的类型;
②js中同一个变量,可以在多次不同赋值时,修改变量的数据类型;
var a = 10; //从初始声明时,a属于整数型;
a = "hahaah" //重复赋值时,整数型的a被修改成字符串类型;
③变量可以使用var声明,也可以不使用var声明。
[区别] 使用var声明为局部变量,不使用var声明为全局变量;
④只用var声明,但是不赋值。结果为undefined;但是,如果不声明也不赋值的a,直接使用会报错;
例如:var a; //a为undefined。
⑤同一变量名,可以多次使用var声明。但是,后面的var并没有什么卵用。第二次在使用var声明时,只会被理解成普通的赋值操作。
2、js中变量名的命名要求
①变量名只能有字母、数字、下划线组成;
②开头不能是数字;
③变量名区分大小写,大写字母与小写字母为不同变量;
3、js中变量名的命名规范
① 要符合小驼峰法则(骆驼命名法):第一个单词的首字母小写,之后每个单词的首字母大写;
eg:myNameIsZhangSan √
② 或者使用匈牙利命名法:所有字母小写,单词之间用_分隔;
eg:my_name_is_zhang_san √
③ mynameiszhangsan × 能用,但是不规范。
4、js中的数据类型(重点)
①Undefined: 未定义。 已经使用var声明的变量,但是没有赋值。 var a;
②Null: 表示空的引用。
③Boolean: 布尔类型。 表示真、假,只有两个值:true/flase;
④Number: 数值类型。 可以是整数,也可以是小数;
⑤String: 字符串类型。用""或''包裹的内容,称为字符串;
⑥Object: 对象类型;
5、[常用的数值函数](重点)
①isNaN():判断一个变量或常量是否是NaN(not a num 非数值);使用isNaN()判断时,会尝试使用Number()函数进行转换,如果最终结果能够转换为数字,则不是NaN,结果是false;
②Number()函数,将其他类型的数据,尝试转换为数值型;
[字符串类型]
>>>字符串为纯数值字符串,会转为对应的数字;"111"->111
>>>字符串为空字符串,会转为0; ""->0
>>>字符串包含任何其他字符时,都不能转; "1a" ->NaN
[Boolean类型]
>>>true—>1 flase->0;\
[Null/Undefined]
Null ->0 ; Undefined ->NaN
③ParseInt():将字符串转为整数类型;
>>>纯数值字符串,能转。
"12"->12; "12.9"->12(小数转化时,直接抹掉小数点,不进行四舍五入)
>>>空字符串,不能转。 ""->NaN
>>>包含其他字符的字符串,会截取第一个非数值字符串前的数字部分;
"123a456"->123; "a123b456"->NaN
>>>ParseInt()只能转字符串,转其他类型,全是NaN。
[Number函数与ParseInt函数的区别]
1、Number函数可以转各种数据类型,ParseInt函数只能转字符串。
2、两者在转字符串时,结果不完全相同。(详见上面解释)
④ParseFloat:将字符串转为数值型;转换规则与ParseInt相同,只是如果有小数,则保留小数点;如果没有小数,则依然是整数;
eg:"12.5"->"12.5" "12"->12
⑤typeof():检测变量的数据类型:
字符串->String 数值->Number 未定义->Undefined
true/false->Boolean 函数/null->function 对象/null->object
三、JS中常用的输入输出语句
1、document.write()
将()中的内容,打印输出到浏览器屏幕上;使用时需注意:除变量/常量外的所有内容,必须放到""中。变量和常量必须放到""外面;如果同时有变量和字符串,必须用+链接;
eg:document.write("左手中的纸牌"+left+"</br>");
2、alert(); 使用弹窗输出
弹窗警告,()中的内容与上述要求相同。
3、prompt();弹窗输入
接收两部分参数;
①输入框上面的提示内容,可选;
②输入框里面的默认信息,可选;
当只写一部分时,表示输入框上面的提示内容;可以定义变量,接收输入内容。点击确定按钮,变量将被赋值为输入的内容;点击取消按钮,变量将被赋值为null;输入内容时,默认接收的数据类型都是字符串!!!!!!!
代码1:
运行结果:
代码2:
运行结果:
一、JS中的运算符
1、算术运算(单目运算符)
+ 加、-减、*乘、 /除、 %取余、++自增运算符 、--自减运算符;
>>>+:有两种作用,链接字符串/加法运算符。当+两边全为数字时,进行加法运算;当+两边有任意一边为字符串时,起链接字符串的作用,链接之后的结果为字+符串。除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字;
>>>/:结果会保留小数点。
>>>++:自增运算符,将变量在原有基础上+1;
--:自减运算符,将变量在原有基础上-1;
[a++和++a的异同点]
①相同点:无论a++还是++a,运算完以后,a的值均会+1;
②不通电:a++,先用a的值去运算,再把a+1;
++a,先把a+1,再用a+1以后的值去运算;
eg:
所以,a=5,b=5,c=7;
2、赋值运算
= 赋值号(把右边的值赋给左边); += -= *= /= %=
+=:a+=b; 相当于a=a+b;但是,前者的运算效率要比后者快,所以推荐使用+=的写法;
eg:
3、关系运算
==(等于)、 ===(严格等于)、 !=(不等于)、!==(不全等/不严格等于)>、<、>=、<=
>>> 关系运算符,运算之后的结果,只能是boolean类型(true或false);
>>> 判断一个数字是否处于某个区间,必须用&&链接
eg:
var a=3;
alert(a<10 && a>2); √
10>a>0 ×
>>> ===(严格等于:不但数值相同,类型也必须相同;类型不同,结果直接为false;类型相同,再进行下一步判断;)
==(等于。类型相同,与===效果一样。类型不同时,会先尝试用number函数将两边转为数字,然后再进行判断。但是有个别特例,如null==false × null==undefined √)
4、条件运算符(多目运算符)
a>b?true:false
有两个重要符号:?和:
当?前面部分运算结果为true时,执行:前面的代码;
当?前面部分运算结果为false时,执行:后面的代码;
冒号两边可以为数值,则整个式子可用于赋值。 var a = 1<2?1:2;
冒号两边可以为代码块,将直接执行代码。 1<2?alert(1):alert(2);
多目运算符可以多层嵌套。 var a = 1<2?alert(1):(1>0?4:5);
5、位运算符、 逻辑运算符
&&(与,and)、||(或)、!(非)
&& 两边都成立,结果为true
|| 两边有任意一边成立,结果为true
&&和||同时存在,先算&&(&&的优先级高)
6、运算符的优先级
7、实例
①判断水仙花数
运行结果:
②四则运算器
二、JS中的分支结构
[if-else结构]
1、结构的写法:
if(判断条件){
//条件为true时,执行if的{}
}else{
//条件为false时,执行else的{}
}
2、注意事项:
①else{}语句块可以根据情况进行省略。
②if和else后面的{}可以省略,但是省略{}后,if和else后面只能跟一条语句;(所以,并不建议省略{})
3、if的()中的判断条件,支持的情况:
①Boolean:true为真,false为假;
②String:空字符串为假,所有非空字符串为真;
③Number:0为假,一切非0数字为假;
④Null/Undefined/NaN: 全为假;
⑤object: 全为真;
[多重if、阶梯if结构]
1、结构写法:
if(条件一){
//条件一成立,执行的操作
}else if(条件二){
//条件一不成立&&条件二成立,执行的操作
}else{
//上述所有条件都不成立时,执行的操作
}
2、多重if结构中,各个判断条件是互斥的,执行选择其中一条路执行。遇到正确选项并执行完以后,直接跳出结构,不再判断后续分支;
[嵌套if结构]
1、结构写法:
2、在嵌套if结构中,如果省略{},则else结构永远属于离它最近的一个if结构。
3、嵌套结构可以多层嵌套,但是一般不推荐超过3层。能用多重if结构的一般不推荐使用嵌套if。
分类: JS
循环结构的执行步骤
1、声明循环变量;
2、判断循环条件;
3、执行循环体操作;
4、更新循环变量;
然后循环执行2~4,直到条件不成立时,跳出循环。
[While循环]
while循环()中的表达式,运算结果可以是各种类型。但是最终都会转为真假,转换规则同if结构;
①Boolean:true为真,false为假;
②String:空字符串为假,所有非空字符串为真;
③Number:0为假,一切非0数字为真;
④Null/Undefined/NaN: 全为假;
⑤object: 全为真;
运行结果:
[do-while循环]
while循环特点:先判断,再执行;
do-while循环特点:先执行,再判断;即使初始条件不成立,do-while循环也至少执行一次;
运行结果:
[for循环]
1、for循环有3个表达式:①声明循环变量;②判断循环条件;③更新循环变量;
三个表达式之间,用;分隔;
for循环三个表达式都可以省略,但是两个;缺一不可;
2、for循环的执行特点:先判断,再执行;与while相同;
3、for循环三个表达式都可以由多部分组成,第二部分多个判断条件与&&、||链接,第一三部分用逗号分隔;
运行结果:
[循环控制语句]
1、break:跳出本层循环,继续执行循环后面的语句。如果循环有多层嵌套,则break只能跳出一层。
2、continue:跳过本次循环剩余的代码,继续执行下一次循环。
①对于for循环,continue之后执行的语句,是循环变量更新语句i++;
②对于while、do-while循环,continue之后执行的语句,是循环条件判断;
因此,使用这两个循环时,必须将continue放到i++之后使用。否则,continue将跳过i++导致死循环。
运行结果:
[循环嵌套的规律]
外层循环控制行数。内层循环控制每行中的元素的个数。
[图形题做题思路]
1、确定图形一共几行,行数即为外层循环的次数;
2、确定每行中有几种元素组成。有几种元素即表示有几个内层循环;
3、确定每种元素的个数,这个个数即为每个内层循环的次数;
tips:如果每种元素的个数不固定。则,找出每种元素个数,与行号的关系,这个关系表达式,即为内层循环的最大值。(循环变量从0开始)
长方形问题:
直角三角形问题
平行四边形问题
数字三角形问题:
一、数组
1、数组的基本概念
数组是在内存空间中连续存储的一组有序数据的集合。元素在数组中的顺序,称为下标。可以使用下标访问数组的每个元素。
2、如何声明一个数组
①使用字面量声明:var arr = [];在JS中,同一数组可以存储各种数据类型; eg: var arr = [1,"wuhao",true,{},null,func]
②使用new关键字声明:var arr = new Array(参数);
>>>参数可以是:
a.参数省略,表示创建一个空数组
b.参数为一个整数,表示声明一个length为指定长度的数组。但是这个length可以随时可变可追加
c.参数为逗号分隔的多个数值,表示数组的多个值。new array(1,2,3) == [1,2,3]
3、数组中元素的读写/增删
①读写:通过下标访问元素。下标从0开始 arr[1] = "haha";
②增删:
a.使用delete关键字,删除数组的某一个值。删除后,数组的长度不变,对应的位置变为Undefined。 eg:delete arr[1];
b.arr.pop():删除数组的最后一个值。相当于arr.length -= 1;
c.arr.shift():删除数组的第一个值。
d.arr.unshift(值):在数组的第0个位置新增一个值;
e.arr.push(值):在数组的最后一个位置新增一个值;
f. 直接访问数组没达到的下标,可以动态追加。
eg:arr[8]="嘿嘿"; arr[100]=1; 中间如果有空余下标,将存入Undefined。
4、数组中的其他方法(非常非常常用!!!!面试题特爱考!!!尤其是sort)
①join():将数组用指定分隔符链接为字符串。当参数为空时,默认用逗号分隔。
运行结果为:
②concat():[原数组不会被改变] 将数组,与两个或多个数组的值链接为一个新数组。concat连接时,如果有二维数组,则至多能拆一层[]
eg: [1,2].concat([3,4],[5,6]); -->[1,2,3,4,5,6]
[1,2].concat([3,4,[5,6]]); -->[1,2,3,4,[5,6]]
③push():在数组最后增加一个 unshift():数组开头增加一个 -->返回新数组的长度 pop():在数组最后删除一个 shift():数组开头删除一个-->返回被删除的值;
[上述方法,均会改变原数组]
运行结果为:
④reverse():[原数组被改变]将数组翻转,倒叙输出。
eg: var arr = [1,2,3,4,5,6,7,8];
arr.reverse();
console.log(arr);
运行结果为:
⑤slice(begin,end):[原数组不会被改变]截取数组中的某一部分,并返回截取的新数组。
>>>传入一个参数,表示开始区间,默认将截到数组最后;
>>>传入两个参数,表示开始和结束的下标,左闭右开区间(包含begin,不包含end);
>>>两个参数可以为负数,表示从右边开始数,最后一个值为-1;
运行结果为:
⑥sort():[原数组被改变]将数组进行升序排列;
>>>默认情况下,会按照每个元素首字母的ASCII值进行排序;
eg:[1,5,13,12,7,6,4,8].sort() -->[1,12,13,4,5,6,7,8];
>>>可以传入一个比较函数,手动指定排序的函数算法;
函数将默认接收两个值a,b,如果函数返回值>0,则证明a>b,如果函数返回值<0,则证明a<b
arr.sort(function(a,b){
return a-b; //升序排列;
return b-a; //降序排列;
});
⑦indexOf(value,index):返回数组中第一个value值所在的下标,如果没有找到则返回-1;lastIndexOf(value,index):返回数组中最后一个value值所在的下标,如果没有找到则返回-1;
>>>如果没有指定index,则表示全数组查找value;
>>>如果指定了index,则表示从index开始,向后查找value;
运行结果为:
⑧forEach():专门用于循环遍历数组。接收一个回调函数,回调函数接收两个参数,第一个参数为数组的每一项的值,第二个参数为下标(IE8之前,不支持此函数!!!!!)
var arr = [1,5,6,3,4,2,7,6,4,8];
arr.forEach(function(item,index){
console.log(item);
})
运行结果为:
⑨map():数组映射,使用方式与forEach()相同。不同的是,map可以有return返回值,表示将原数组的每个值进行操作后,返回给一个新数组。(IE8之前,不支持此函数!!!!!)
var arr1 = arr.map(function(item,index){
console.log(item);
return item+2;
});
console.log(arr1);
5、二维数组与稀疏数组(了解)
①二维数组:数组中的值,依然是一个数组形式。
eg:arr=[[1,2,3],[4,5,6]]; //相当于两行三列,读取二维数组:arr[行号][列号];
②稀疏数组:数组中的索引是不连续的。(length要比数组中实际的元素个数大)
运行结果为:
6、基本数据类型和引用数据类型
①基本数据类型:赋值时,是将原变量中的值,赋值给另一个变量,复制完成后,两个变量相互独立,修改其中一个的值,另一个不会变化。
②引用数据类型:赋值时,是将原变量在内存中的地址,赋值给另一个变量。赋值完成后,两个变量中存储的是同一个内存地址,访问的是同一份数据,其中一个改变另一个也会发生变化。
③数值型、字符串、布尔型等变量属于基本数据类型;数组,对象属于引用数据类型;
运行结果为:
二、内置对象
Boolean 类(布尔类)
有两种声明方式:可以使用字面量方式声明一个单纯的变量; 用typeof检测为Boolean类型,也可以使用new Boolean()声明一个Boolean类型的对象; 用typeof检测为Object类型。
运行结果为:
Number类
Number.MAX_VALUE:返回Number类可表示的最大值
Number.MIN_VALUE:返回Number类可表示的最小值
.toString():将数值类型转换为字符串类型;
运行结果为:
.toLocaleString():将数值按照本地格式顺序转换为字符串,一般从右开始,三个一组加逗号分隔;
运行结果为:
.toFixed(n):将数字保留n位小数,并转为字符串格式;
运行结果为:
.toPrecision(n):将数字格式化为指定长度;n表示不含小数点的位数长度。如果n<原数字长度,则用科学计数法表示。如果n>原数字长度,则小数点后补0;
运行结果为:
.valueOf():返回Number对象的基本数字值;
运行结果为:
String类
1、属性: str.length 返回字符串的长度,也就是字符数。字符串支持类似数组的下标访问方式:str.[0];
2、方法(很重要)
.toLowerCase():将字符串所有字符转成小写;
.toUpperCase():将字符串所有字符转成大写;
.charAt(n):截取数组的第n个数组,相当于str[n];
.indexOf("str",index):从index位置开始,查找子串在字符串中出现的位置,如果没有找到返回-1;其他从数组的indexOf方法;
.lastIndexOf("str",index):同数组;
.substring(begin,end):从字符串中截取子串
>>>只传入一个参数,表示从begin开始,到最后;
>>>传入两个参数,表示begin和end的区间,左闭右开区间;
.split("分隔符"):将字符串已指定分隔符分隔,存入数组中。存入空""表示将字符串的每个字符分开放入数组;
.replace("old","new"):将字符串的第一个old替换为new。
>>>第一个参数,可以是普通字符串,也可以是正则表达式;
>>>如果是普通字符串,则只替换第一个old。如果是正则表达式,则可以根据正则的写法要求,进行替换;
Date 日期类
1、 new Date():返回当前最新时间;new Date("2017,8,31,12:34:56");返回指定的时间
2、常用方法:
.getFullYear():获取4位年份;
.getMonth():获取月份0~11
.getMonth():获取一个月中的第几天 1~31
.getDay():获取一周中的第几天 0~6,0表示周天
.dates.getHours():获取小时
.getMinutes():获取分钟
.getSeconds():获取秒
如何制作动态日期
运行结果为:
三、自定义对象
1、基本概念
①对象:对象是拥有一系列无序属性和方法的集合。
②键值对:对象中的数据,是以键值对的形式存在。对象的每个属性和方法,都对应着一个键名,以键取值。
③属性:描述对象特征的一系列变量,称为属性。[对象中的变量]
④方法:描述对象行为的一系列函数,称为方法。[对象中的函数]
2、对象的声明
①字面量声明: var obj = {
key1 : value,
key2 : value,
func : function(){},
}
>>>对象中的数据是以键值对形式存储,键与值之间用:分隔。多个键值对之间用,分隔。
>>>对象中的键可以是除了数组/对象以外的任何数据类型。但是一般我们只用普通变量名作为键。
>>>对象中的值可以是任何数据类型,包括数组和对象。
②使用new关键字声明: var obj = new Object()
obj.key1 = value1,
obj.func1= function(){}
3、对象中属性和方法的读写:
①.运算符
对象内部:this.属性 this.方法(); 对象外部:对象名.属性 对象名.方法;
②通过["key"]调用:对象名.["属性名"] 对象名.["方法名"]();
>>>如果键中包括特殊字符,则只能使用第②中方式;
>>>对象中,直接写变量名,默认为调用全局变量。如果需要调用对象自身的属性或者方法。需要使用对象名.属性,或者this.属性。person.age this.age 。都可以,但推荐使用this关键字;
③删除对象的属性和方法:delete 对象名.属性名/方法名。delete person.age;