一、入门
JavaScript 是一种具有面向对象能力的、解释型的程序设计语言。 作用: 它的主要目的是,验证发往服务器端的数据、增加 Web 互动、加强用户体验度等。 js的使用方式: 函内js : 定义在标签上的js代码 在标签上定义不同的事件,触发js代码的执行 内部js : 在html内部定义is代码 在html的内部定义script标签对,标签对中定义js代码 外部js : 在外部定义js文件,在html内部引入 通过script标签的src属性引入外部的js代码
注意: 如果一个script如果已经用来定义js代码,就不能引入外部的js文件
--> 按钮
二、定义位置
script标签可以定义在页面中的任意位置 推荐: 1.head中,规范,便于后期维护 有可能遇到获取不到元素的情况->window.onload
2.body结束之前 在所有元素加载完毕之后执行,遇到获取不到元素的情况
<html> <head> <meta charset="utf-8" /> <title></title> <script> /* window.onload 在页面中所有内容加载完成之后再触发函数的执行 */ window.onload = function(){ console.log(document.getElementById("box")); } </script> </head>• <body> <div id="box">页面中的div</div> </body> </html>
三、变量
注释: 与java类似 变量: 可变的量 优点: 提高代码的复用性 简化代码 定义: 通过var关键字声明变量 1)声明的同时赋值 2)先声明后赋值 3)同时声明多个变量,同时为多个变量赋值 注意: 一个变量之声明不赋值存在默认值 undefined 局部->只看函数
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <script> //单行注释 /*多行注释*/ //1)声明的同时赋值 var i = 1; var age; age = 18; console.log(i,age); //3) var name="zhangsan",gender = "女"; console.log(name,gender); var x,y,z; x=y=z=10; console.log(x,y,z); //var可以省略 hobby = "抽烟"; console.log(hobby); //一个变量之声明不赋值存在默认值 undefined var j; console.log(j); </script> </body> </html>
四、运算符
运算符 typeof typeof(数据) typeof 数据 返回数据类型小写的字符串形式
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title> typeof</title> </head> <body> <script> console.log(typeof 123); console.log(typeof NaN); console.log(typeof('ab')); console.log(typeof("")); console.log(typeof(false)); console.log(typeof(true)); console.log(typeof(undefined)); console.log(typeof(null)); //object function fn(){} console.log(typeof(fn)); console.log(typeof {}); //object </script> </body> </html>
五、数据类型
数据类型: 基础数据类型 数值型 Number -> 蓝色 整数与小数,整数与负数 NaN : not a number 1)直接赋值NaN 2)运算无法正确得到结果,得到一个NaN 字符串 String ->黑色 一对''|""包裹1~n个字符 布尔类型 Boolean ->蓝色 表示对于错 true|false 未定义 Undefined -> 灰色 1)直接赋值undefined 2)变量之声明不赋值默认undefined 空 Null 1)直接赋值null 2)为获取到元素,得到null 函数型 Function function 函数名(参数列表){ 函数体; } 复合数据类型 对象类型 Object -> {} 键值对的集合 { key : value, key : value, .... } 键值对之间使用,分隔 键与值之间使用 : 分隔 key : 字符串,当key的名字符合标识符的命名规范,前后的引号可以省略 value : 可以为任意数据类型
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>数据类型</title> </head> <body> <script> var i = 103; console.log(i); var j = NaN; console.log(j); console.log("a"/103); //NaN var str1 = '101'; var str2 = "abc"; console.log(str1,str2); var b1 = true; var b2 = false; console.log(b1,b2); var u1 = undefined; var u2; console.log(u1,u2); var n1 = null; var n2 = document.getElementById("box"); console.log(n1,n2); function fn(){ console.log("js中的函数"); } //调用函数 fn(); //对象 var obj = { name : "zhangsan", age : 18, car : null }; console.log(obj); console.log(obj.name); </script> </body> </html>
六、类型转换
js数据类型转换: 对象,函数不参与类型转换 显示类型转换: 任意转为一下三种类型: 字符串String(数据) 数值型Number(数据) 布尔型Boolean(数据) 隐式类型转换 : 目的不是为了转换类型,但是在运算的过程中会默认进行类型转换->成为隐式类型转换 + - * / ...
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>类型转换</title> </head> <body> <script> //转字符串类型 console.log(String(123)); console.log(String(0)); console.log(String(-1.23)); console.log(String(NaN)); console.log(String(false)); console.log(String(true)); console.log(String(null)); console.log(String(undefined)); //隐式 console.log(1+false); //1 console.log("abc"-1); //NaN </script> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>类型转换</title> </head> <body> <script> //Number() console.log(Number(false)); //0 console.log(Number(true)); //1 console.log(Number("")); //0 console.log(Number(" ")); //0 console.log(Number("123")); //123 console.log(Number("123abc")); //NaN console.log(Number(null)); //0 console.log(Number(undefined)); //NaN console.log("-------------------------------"); //Boolean console.log(Boolean(0)); //false console.log(Boolean(123)); //true console.log(Boolean(-1.23)); //true console.log(Boolean(NaN)); //false console.log(Boolean("")); //false console.log(Boolean(" ")); //true console.log(Boolean("123abc")); //true console.log(Boolean(null)); //false console.log(Boolean(undefined)); //false </script> </body> </html>
七、数组
数组 [] : 存储多个数据 存储任意类型的数据 长度可以跟随需求动态的增删 定义: 1.new Array() 创建一个空数组 2.new Array(值列表) 创建数组的同时赋值 3.[值列表] 字面量创建数组的方式->推荐使用 长度属性: length 索引: 从0开始,每次+1 操作数组 : 数组名[索引]
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>数组</title> </head> <body> <script> var array1 = new Array(); console.log(array1); var array2 = new Array(1,2,3,4,5); console.log(array2); console.log(array2.length); console.log(array2[0]); var array3 = ["haha",123,false,null,undefined]; console.log(array3); //修改数组中的数据 array2[0] = 100; console.log(array2); array1[0] = false; array1[1] = true; array1[10] = null; console.log(array1); console.log(array1[5]); //自定义属性: 当[]中的索引非0~正整数,会作为自定义属性存在 array1[-5] = -5; array1["key"] = "value"; console.log(array1); console.log(array1["key"]); console.log("----------------------for-------------------"); //数组的遍历 //普通for循环 : 不能遍历自定义属性,但是可以遍历empty位置 for(var i=0;i<=array3.length-1;i++){ console.log(array3[i]); } for(var i=0;i<=array1.length-1;i++){ console.log(array1[i]); } console.log("----------------------for...in-------------------"); //for...in : 可以遍历自定义属性,但是不可以遍历empty位置 for(var index in array3){ console.log(array3[index]); } for(var index in array1){ console.log(array1[index]); } console.log("----------------------foreach-------------------"); //foreach : 不可以遍历自定义属性,但是不可以遍历empty位置 array3.forEach(function(element,index){ console.log(element,index); }); array1.forEach(function(element,index){ console.log(element,index); }); </script> </body> </html>
八、函数
函数 : 方法 封装功能 函数声明 * function 函数名(参数列表){ 函数体; } 调用: 执行函数中的代码 函数名(实参); 函数表达式 var 变量 = function 函数名(参数列表){ }; 函数表达式的函数名没有作用,一般省略,只有在使用递归的使用才有用 调用: 1.变量名(实参); 2.在函数表达式的最后添加()自调用 注意: 函数的参数可以省略var关键字定义 js中形参与实参可以不一一对应 形参默认值为undefined 函数的返回值如果没有定义,默认为undefined 在js中作用域只看函数 函数可以任意嵌套 如果定义相同的函数,后面的会覆盖前面的函数,不会报错
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>函数</title> </head> <body> <scr function fn1(name){ console.log("名字为 : "+name); //return -1; } console.log(fn1("张三","李四")); //函数表达式 var f1 = function(){ console.log("函数表达式1"); }; f1(); var f2 = function(a,b){ console.log("函数表达式2"); console.log(a,b); return a+b; }; f2(11,12); //接收函数的返回值 console.log(f2(3,5)); var result = f2(5,8); console.log(result); //递归 var f3 = function func(i){ if(i==5){ return; } console.log(i); func(++i); }; f3(1); //函数表达式自调用 var f4 = function(a,b){ console.log("函数表达式4"); console.log(a,b); }(1,3); //js中的函数可以任意嵌套 /* function fun1(){ console.log("fun1"); function fun2(){ console.log("fun2"); } fun2(); } */ function fun1(){ console.log("fun1"); return function fun2(){ console.log("fun2"); }; } //调用fun1,调用fun2函数 fun1()(); //1)调用fun1 2)调用fun2 3)打印fun2返回值 console.log(fun1()()); function fn1(){ console.log("第二个fn1"); } fn1(); </script> </body> </html>
九、作用域
作用域提升 var i; function fn1(){ //作用域提升 //var j console.log(j); //局部变量 var j = 10; //全局变量 e = false; 作用域提升: js作用域只看函数 变量的作用域提升 : 通过var关键字声明的变量,把变量的声明提升到当前所在作用域的最上面 如果局部定义的变量没有通过var关键字声明,这个变量作为全局变量使用,要求使用之前所在的函数必须被调用过 函数的作用域提升 必须是通过函数声明的方式定义的函数存在函数的作用域提升问题 会被提升到当前所在作用域的最上方
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>函数</title> </head> <body> <script> console.log(i); //全局变量 var i = 1; console.log("------"); fn1(); console.log("------"); function fn1(){ //作用域提升 //var j console.log(j); //局部变量 var j = 10; //全局变量 e = false; } //fn1(); a = 11; console.log(a); console.log(e); var f1 = function(){ console.log("函数表达式"); } //块 : 不是作用域,只有语义化特点,作为整体看 { var name = "zhangsan"; } console.log(name); //|| && 当左右两变的操作数出现非boolean数据 : //1.先把第一个操作数转为boolean,进行判断 //2.判断规则: //a) || : 左边的操作数转为boolean之后,结果为true么?如果为true,最终的结果为左边的操作数,如果不为true,最终的结果为右边的操作数 //2) && : 左边的操作数转为boolean之后,结果为true么?如果为true,最终的结果为右边的操作数,如果为false,最终的结果为左边的操作数 //console.log(null||"a"); //"a" console.log(null&&"a"); //null console.log(Boolean(null)); // 值传递 var num = 12; function change(n) { n = 30; } change(num); console.log(num); // 引用传递 var obj = {name: "tom"}; function paramter(o) { o.name = 2; } paramter(obj); console.log(obj.name); // 给形参o赋予了新的数组 var obj2 = [1, 2, 3]; function paramter2(o){ o = [2, 3, 4]; o[1] = 3; } paramter2 (obj2); console.log(obj2) </script> </body> </html>