学而时习之,不亦说乎,开启JS学习新乐章~
JS是干啥的?网页特效,它主要是实现控制结构和样式,是一种行为,有多重要,不言而喻吧,页面炫酷的资本。
1. JS输出:
1 alert("hello World!") //第一种输出, alert 属于 window 对象,一般省略。2 console.log()3 console.warn()4 console.error()//第二种输出,只在控制台输出,包含正常、警告、错误等信息,方便进行错误定位5 document.write()//第三种输出,文档打印
2. 变量,就是一个容器 用来装东西的,变量具有不同的基本数据类型,变量有局部变量和全局变量之分,具体区别主要体现在作用域上,这里需要注意的是,写在函数体内部,但是没有var 声明的变量也是全局变量:
1 var ????//变量申明符2 var carName = "hello"; ?//单双引是不分的哦,字符型,可通过“+”来连接,String()/.valueOf/.toString()来强制转换3 var carNum ?= ?12; ?????//数值型,可通过Number()来转换,亦可通过内置函数parseInt()取整,parseFloat()取浮,isNaN()来判断是否为数值4 var car = true; ????????// boolean , 可通过Boolean()来转换5 var a = new Object(); ??//引用型,Object包括:Int,Float,String,Function,Boolean,Array6 var timer = null; ??????// 空类型 null7 var test; ??????????????// 声明变量未给值 undefined,null == undefined(true) ????????????
3. JS书写位置
1 <a href=”javascript:void(0)”></a> ???? //行内式2 <script type=”text/javascript”>...事件代码...</script> ????//内嵌式3 <script src="hello.js" type="text/javascript"></script> ??//外链式 ???
4. 事件,前面说过JS是一种行为,行为就是事件, 事件三要素: 事件源,事件,事件处理程序三部分组成,通常以匿名的形式出现:
事件源.事件 = function() { 事件处理语句;} //匿名函数
1 <script> 2 ????// 获取元素 3 ????var one = document.getElementById("one"); ??// 获取第2个li 4 ????var two = document.getElementById("two"); ??// 获取第2个li 5 ????var pic = document.getElementById("pic"); ??// pic 6 ????// 操作元素 7 ????// 事件源.事件 ?= function() {} 8 ????two.onclick = function() { 9 ????????pic.src = "images/02.jpg";10 ????}11 ????one.onclick = function() {12 ????????pic.src = "images/01.jpg";13 ????}14 </script>15 /*16 ????这里的时间不仅仅局限于noclick,也可以是ondblclick,onkeyup,onchange,onfocus,onblur ,onmouseover ,onmouseout ,onload,onunload等1718 */
5. 函数,函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。通常情况下,函数构建具有三种方式:
<script type="text/javascript"> ????// 尽量要求形参和实参相互匹配,静态方法 ????function fn(a,b) { ????????console.log(a+b); ????????return 3; ?// 终止程序执行,不会执行return 后面的语句 ????} ????console.log(fn(1,2));// 调用函数,并且遵循先声明后调用的基本准则 ???// 动态匿名方法 ???var fun =new function(‘a‘,‘b‘,‘return a+b;‘);单双引号不分哦,不交叉使用即可 ???????// 直接量方法 ???var fun = function(){ ??????????console.log(1); ???}
进行new 操作实现函数构建,与普通方式构建函数差距很明显,new之后会将其看作是对象处理,必然会返回一个对象了,然后就可以更加灵活的使用构造方法以及我们熟悉好用的this。
1、函数预编译过程 this —> window
2、全局作用域里 this —> window
3、obj.func(); ??func()里面的this指向obj), 可以这样理解,谁调用func,则this就指向谁
4、call/apply 可以改变函数运行时this指向,
(1)、call用法:
func.call(要改变后的this, arg1, arg2, ... );
(2)、apply用法:
func.apply(要改变后的this, [arg1, arg2, arg2]);
(3)、apply和call共同点:都是改变this指向,apply和call不同点:传参形式不同,call是将参数一个个传进来,而apply是将所有参数存进一个数组中,然后将该数组传,如下demo:
function demo1() { ???????console.log(this); ???} ???// demo1() <==> this.demo1(); <==> window.demo1() ???demo1(); // window ???// demo2 ???var demo2 = { ???????retThis: function () { ???????????console.log(this); ???????} ???} ???demo2.retThis(); // demo2 = {...} ???// call / apply改变this ???demo1.call(demo2); ?// demo2 = {} ???demo2.retThis.call(window); // window
6. 流程,流程控制语句包括:循环,跳转,选择以及异常处理:
<html><body><script type="text/javascript">//for循环let array1 = [‘a‘,‘b‘,‘c‘];for (let i = 0;i < array1.length;i++){ ?console.log(array1[i]); ?// a ?b ?c }//while循环var j= 1;while(j>0){ console.log(j); j--;}//do while循环do{ console.log(j); j--;}while(j>0);//for in循环var array = [1,2,3,4];for(let index in array) { ?????????console.log(index,array[index]); ?????}; ?var A = {a:1,b:2,c:3,d:"hello world"}; ?for(let k in A) { ?????console.log(k,A[k]); ?} //跳转包括:return; break; continue;//选择包括if(判断语句){。。}else{}, if(判断语句){}else if(判断语句){}else{}// 异常语句try{ console.log(b); console.log("我不会输出的,不要找了") }catch(error){ console.log("发生错误了") }finally { console.log("不管发生不发生错误,我都会执行") }console.log("我try catch后面的代码")//选择语句var i = 4; ????switch (i){ ????????????//i表示要判断的值 ????????case 0: ????????????document.write("星期天") ????????????break; ????????case 1: ????????????????????????????//case里面都是所对应的值,每一个代码段后都要加上一个break让他跳出判断 ????????????document.write("星期一") ????????????break ????????case 2: ????????????document.write("星期二") ????????????break ????????case 3: ????????????document.write("星期三") ????????????break; ????????case 4: ????????????document.write("星期四") ????????????break; ????????default: ?????????????????????????//default的意思是以上case里的值都不是的话,执行default语句里的代码段 ????????????document.write("什么都不是") ????}</script></body></html>
7. 数组,顾名思义,数据的集合,其构建及常见方法如下:
<script type="text/javascript"> //构建var arr1 = new Array(); //创建一个空数组var arr2 = new Array(20); // 创建一个包含20项的数组var arr = new Array("lily","lucy","Tom"); // 创建一个包含3个字符串的数组var arr4 = []; //创建一个空数组var arr5 = [20]; // 创建一个包含1项的数组var arr6 = ["lily","lucy","Tom"]; // 创建一个包含3个字符串的数组//常规方法//join(),将数组的元素组起一个字符串,以"-"为分隔符,可重复插入字符串arr.join("-") //push(), 可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度var count = arr.push("Jack","Sean");console.log(count); // 5console.log(arr); // ["Lily", "lucy", "Tom", "Jack", "Sean"]//pop(), 数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项var item = arr.pop();console.log(item); // Seanconsole.log(arr); // ["Lily", "lucy", "Tom", "Jack"]//shift(), 删除原数组第一项,并返回删除元素的值var item = arr.shift();console.log(item); // Jackconsole.log(arr); // ["Sean", "Lily", "lucy", "Tom"]//unshift, 将参数添加到原数组开头,并返回数组的长度 var count = arr.unshift("Jack","Sean");console.log(count); // 5console.log(arr); //["Jack", "Sean", "Lily", "lucy", "Tom"]//sort(), 按升序排列数组项var arr1 = ["a", "d", "c", "b"];console.log(arr1.sort()); // ["a", "b", "c", "d"]arr2 = [13, 24, 51, 3];console.log(arr2.sort()); // [13, 24, 3, 51]console.log(arr2); // [13, 24, 3, 51](原数组被改变,字符串比较原则)//reverse(), 反转数组项的顺序var arr = [13, 24, 51, 3];console.log(arr.reverse()); //[3, 51, 24, 13]console.log(arr); //[3, 51, 24, 13](原数组改变)//concat(), 将参数添加到原数组中。var arr = [1,3,5,7];var arrCopy = arr.concat(9,[11,13]);console.log(arrCopy); //[1, 3, 5, 7, 9, 11, 13]console.log(arr); // [1, 3, 5, 7](原数组未被修改)//slice(), 返回从原数组中指定开始下标到结束下标之间的项组成的新数组(切片)var arr = [1,3,5,7,9,11];var arrCopy = arr.slice(1);var arrCopy2 = arr.slice(1,4);var arrCopy3 = arr.slice(1,-2);var arrCopy4 = arr.slice(-4,-1);console.log(arr); //[1, 3, 5, 7, 9, 11](原数组没变)console.log(arrCopy); //[3, 5, 7, 9, 11]console.log(arrCopy2); //[3, 5, 7]console.log(arrCopy3); //[3, 5, 7]console.log(arrCopy4); //[5, 7, 9]//splice(), 很强大的数组方法,它有很多种用法,可以实现删除、插入和替换var arr = [1,3,5,7,9,11];var arrRemoved = arr.splice(0,2);console.log(arr); //[5, 7, 9, 11]console.log(arrRemoved); //[1, 3]var arrRemoved2 = arr.splice(2,0,4);console.log(arr); // [5, 7, 4, ?9, 11]console.log(arrRemoved2); // []var arrRemoved3 = arr.splice(1,1,2,4);console.log(arr); // [5, 2, 4, 4, 9, 11]console.log(arrRemoved3); //[7]// indexOf(), 接收两个参数:要查找的项和(可选的)表示查找起点位置的索引,lastIndexOf(),从数组的末尾开始向前查找var arr = [1,3,5,7,7,5,3,1];console.log(arr.indexOf(5)); //2console.log(arr.lastIndexOf(5)); //5//forEach(), 对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值。参数都是function类型,默认有传参,参数分别为:遍历的数组内容;第对应的数组索引,数组本身。var arr = [1, 2, 3, 4, 5];arr.forEach(function(x, index, a){console.log(x + ‘|‘ + index + ‘|‘ + (a === arr));});// 输出为:// 1|0|true// 2|1|true// 3|2|true// 4|3|true// 5|4|true//map(), 指“映射”,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组var arr = [1, 2, 3, 4, 5];var arr2 = arr.map(function(item){return item*item;});console.log(arr2); //[1, 4, 9, 16, 25]//filter(), “过滤”功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];var arr2 = arr.filter(function(x, index) {return index % 3 === 0 || x >= 8;}); console.log(arr2); //[1, 4, 7, 8, 9, 10]//every(), 判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回truevar arr = [1, 2, 3, 4, 5];var arr2 = arr.every(function(x) {return x < 10;}); console.log(arr2); //truevar arr3 = arr.every(function(x) {return x < 3;}); console.log(arr3); // false//some(), 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回truevar arr = [1, 2, 3, 4, 5];var arr2 = arr.some(function(x) {return x < 3;}); console.log(arr2); //truevar arr3 = arr.some(function(x) {return x < 1;}); console.log(arr3); // false//reduce()和 reduceRight(),这两个方法都会实现迭代数组的所有项,然后构建一个最终返回的值。reduce()方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()则从数组的最后一项开始,向前遍历到第一项。var values = [1,2,3,4,5];var sum = values.reduceRight(function(prev, cur, index, array){return prev + cur;},10);console.log(sum); //25<script>
JS学习小结(上)
原文地址:https://www.cnblogs.com/aoaoao/p/9550485.html