1week

120 阅读9分钟

一js代码:

注释:作用:1、提示自己/别人 2、玩 - 养成一个写注释的好习惯
单行注释://
多行注释:/**/
输出方式 - 3种
作用:打桩输出 - 检查错误
       *在F12的控制台输出日志:console.log(数字/"字符串"/变量); - 这才最重要的(都不会影响到用户的体验)
           
	2、在页面上输出,支持标签:document.write(数字/"字符串"/变量); - 缺点:如果绑定了一个按钮的事件,替换掉页面上所有的已有元素
	3、在弹出框输出:alert(数字/"字符串"/变量); - 缺点:卡主页面,必须关闭掉弹出框,用户才能看到页面的东西

*变量:
   硬盘:存储文件、数据 - 外部存储器
   CPU:中央处理器计算
   内存:是【临时存储】程序在运行过程中,所需要用到的数据
	内存空间:保存数据的一个地方
	内存地址:内存空间门牌号,0x0132asd123rtsa325sa,内存地址过长,为他取一个别名,就称之为变量名
   变量就是一个内存
	语法:var 变量名=值;
	作用:1、经常使用的数据,可以先提前保存起来
	      2、数据是可能被修改的

       *特殊:1、变量名不是随意的:1、不能以数字开头  2、不能使用关键字  3、尽量的见名知意
		 千万不要:
			var aa;
			var ab;
			var ac;
		 千万不要:
			var xingming; - 逼格低
		 尽量要:
			var name;
			var age;
			var gender;
		 变量名有一个很特殊name - 不管你保存的数据是什么,最后都会变成一个字符串

	     其实你想要创建一个变量只需要:var 变量名;其实就已经创建好了 - 不赋值也没关系,至少创建了不会报错了
		但是一般来说我们都要立马跟上赋值操作,因为默认值undefined是无用

	     如果创建了多个变量,可以省略掉中间var,分号都要换为逗号简写
		
	    其实var关键都可以不写,但是不推荐 - 导致全局污染

	     =:赋值符号,把=右边的数据保存在=左边的变量名之中,左边就单单纯纯的是一个变量名而已,不会变成变量的值

	    以后不管代老师说创建/声明/定义 - 同一个意思

		没有 = null
	
常量:一旦创建值不可以被修改
   语法:const 常量名=值;

****数据类型:不同的数据类型的,做的操作也是不一样的
	1、原始/基本/值类型:5Number - 数字,取值:无数个
		String - 字符串,取值:无数个
		Boolean - 布尔值,取值:2个,表示一个【判断的结果】,true(真) 、 false(假)
		Undefined - 取值只有一个:undefined - 变量的默认值,undefined没有任何作用
		Null - 空,取值1个:null,作用,你用完了的变量(内存),可以用null释放 - 释放内存节约

	2、引用/对象类型:11个对象(属性和方法)

*算术运算符:+ - * / %
   m%n:取余,俗称模,m/n不取商,而且除不尽的余数
	作用:
		1、*判断奇偶性
			num%2 == 1 奇数
			num%2 == 0 偶数

		2、获取一个数字的后n位
			1234%10   -> 4
			1234%100  -> 34
			1234%1000 -> 234

		3、判断一个数字永远不超过几
			num%5 -> 结果永远不会超过5

	***算术运算其实具有隐式数据类型转换,默认都会转为数字,运算
	特殊:+运算,如果碰到一个字符串,那么两边的数据都会悄悄转换字符串,然后+运算变为拼接操作
	      - * / %其实字符串也可以转为数字,必须是纯数字组成的字符串才行,只要包含一个非数字字符结果则为NaN

*扩展:
  1、用户输入框:var user=prompt("提示文字","默认值");
  2、查看数据类型:typeof(变量/值/表达式);
  3、页面上获取到的数据类型都是字符串,如果你就想转为数字:
	parseInt(str) -> 转为整数
	parseFloat(str) -> 转为浮点数

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

***数据类型转换
javascript是弱类型语言,数据类型都是有数据决定的

对于不同数据类型的运算时,数据类型会进行转换: number + number = number number + string = string

javascript中想要查看自己的数据类型是什么:typeof(你想要查看的)

*1、隐式转换: 自动转换,程序员看不见 *算术运算,默认左右两边都会转成数字,再运算 特殊:1、+运算,只要有一个是字符串那么左右两边都会悄悄转为字符串,在拼接 2、true->1 false->0 undefined->NaN null->0 3、-/%,其实字符串也可以转为数字,只不过必须是纯数字组成的字符串才可以,只要包含了非数字 字符,则转为NaN

NaN:Not a Number:不是一个数字,但他确实是number类型,简单理解:无效的数字
           特点:1、NaN参与任何算术运算结果都为NaN
                 2、NaN参与任何比较运算结果都为false,甚至自己都不认识自己
                 问题:正是因为自己都不认识自己,所以我们没有办法使用普通的比较运算来判断一个x是不是NaN
                       有可能用户恶意输入,结果隐式转为NaN,我们如何放置恶意输入
                 解决:判断x是不是NaN
                        var bool=isNaN(x); x是NaN结果为true x是数字结果false
                 也可以返用!isNaN(x):x是数字结果为true,x是NaN结果就为false 
                 !isNaN(x)专用防止用户恶意输入,目前我们仅仅只能控制用户输入数字 - 更深入的控制我      们需要以后学习了正则表达式才可以

 显式转换
  强制转换:隐式转换的结果可能不是我们想要的,我们程序员可以手动调用某些方法,进行数据转换,再运算
  1、转字符串:
	语法:var str=xx.toString();//xx不能是undefined和null,因为undefined和null不能使用.
	此方法不重要:页面上获取来的所有的数据默认都是字符串类型

  *转数字:
	*1parseInt(str/num);
	原理:从左向右依次读取每个字符,进行转换,碰到非数字字符,就停止,而且不认识小数点
	      如果一开始就碰到了不认识的字符,则转为NaN
	比如:
		parseInt(35.5) -> 35
		parseInt("35.5") -> 35
		parseInt("35hello5") -> 35
		parseInt("hello35") -> NaN
		parseInt("35px") -> 35  
		parseInt(bool/un/nu) -> NaN

	*2parseFloat(str);
	原理:几乎和上者一致,但是它认识第一个小数点
	比如:
		parseFloat(35.5) -> 35.5
		parseFloat("35.5") -> 35.5
		parseFloat("35.5px") -> 35.5
		parseFloat("35.5.5") -> 35.5
		parseFloat(".555") -> 0.555
		parseFloat("px35.5px") -> NaN
		parseFloat(true) -> NaN

	强调:以上两个方法,只支持str和num使用,其余的使用则为NaN	,可以去掉单位变成一个数字		


	3Number(x);//万能的,任何数据都可以转为数字
		     //完全等效于隐式转换,还不如 x*1 x/1 x-0

` js里面的函数:完成了一个...........的功能

使用函数:2步:关键字 function 1、创建函数 function 函数名(){ 若干函数体;很多很多的代码 } 2、调用函数 1、直接在js里面写上: 函数名();//写几次就调用了几次`

	2、绑定在某个页面元素上: - 让用户进行交互
		<elem onclick="函数名()"></elem>

定义带参数的函数:21、创建带形参的函数
	   function 函数名(形参,形参,...){
		 若干函数体;很多很多的代码
	   }
	   在定义函数功能时在小括号中放入的参数,称之为叫做形式参数,简称形参,其实就是一个变量名,只不过不用var

	2、调用的过程中,传递参数,称之为实际参数	,简称为实参,其实就是变量的值
	   函数名(实参,实参,...)

	注意:传入实参的顺序和个数一定要和形参一一对应上!

比如:
		function zzj(fruit){
		console.log("正在榨"+fruit+"汁")
		}
		zzj("苹果");
		zzj("香蕉");

总结1、如果你的函数体是固定的不变的,则不需要使用带参数的函数
                   2、如果你的函数希望根据传入的实参做的事儿略微不同,则需要带参数的函数来完成
***分支结构:
1、流程控制语句:3种
1、顺序结构:
默认的,代码从上向下一步一步的执行
2、分支/选择 结构
根据条件,选择一部分代码去执行
3、循环 结构
根据条件,判断你是否需要重复的执行某一部分代码

比较运算符:> < >= <= == != 作用:判断/条件 结果:一定是一个bool,只有可能会是true 或 false 也有默认的隐式转换,悄悄的转为数字再比较

if结构:当条件满足时,执行某些语句,条件不满足时,则不会执行这些语句

1、一个条件,一件事,满足就做不满足就不做
	if(条件){
		操作
	}

2、一个条件,两件事,满足就做第一件,不满足就做第二件
	if(条件){
		操作
	}else{
		默认操作
	}

3、多个条件多件事,满足谁就做谁,
	if(条件1){
		操作1
	}else if(条件2){
		操作2
	}else if(条件3){
		操作3
	}else{
		默认操作;
	}

注意:1、else if写几个全看你自己
      2、最后的else可以省略,但是省略后,如果条件都不满足则什么都不做

扩展:逻辑运算符:&&(与、而且) ||(或者) !(非、不)

&&:只有全部条件都满足,最后结果才为true
    只要有一个条件不满足,结果则为false

||:只要有一个条件满足,结果就为true
    只有全部条件都不满足,最后结果才为false

 !:颠倒布尔值:!true->false
		!false->true
		!!true->true

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

***循环结构
1、问题:在程序中打印输出1000句hello world
console.log("1hello world");
...
console.log("1000hello world");
什么事循环,做着重复的事。
***循环:反复执行【相同 或 相似】的操作,几乎是一瞬间就执行完很多次了
循环三要素:
1、循环条件:开始、结束,重复执行的次数
2、循环操作:循环体,要执行的操作是什么
3、循环变量、变量要改变(自增/自减)
while循环
语法:
  var 循环变量=几;
  while(循环条件){
	循环体;
	循环变量改变;
  }

举例:
		var i=1;
		while(i<=10000){//1001
			console.log(i+"hello world");
			i++;//i+=1 i=i+1
		}

原理:
  先判断循环条件,如果条件为真,则执行一次循环体中的语句,然后再一次判断条件,如果为真,则再一次执行一次循环体中语句...
  直到循环条件为假,才会退出循环

重点:循环是一次一次执行的,只不过速度很快,而且循环没结束之前,会卡主后续代码



循环中的流程控制语句:允许条件结束之前提前退出循环
	语法:break
	位置:任何一个循环中都可以使用,只能放在循环中
	场合:1、某种条件达成时,提前退出循环
	      2、搭配死循环使用:在 不确定循环次数的时候,只能使用break来退出循环

	死循环:while(true){
			循环体;
		}
*for循环
     语法:for(循环变量(表达式1);循环条件(表达式2);变量的改变(表达式3)){
 循环体;
     }
 
 执行流程:先计算表达式1的值,计算表达式2的值,如果为true,执行一次循环体,在计算表达式3的值...
	   直到表达式2的值,结果为false,循环才会退出

 特殊:1、死循环:for(;;){循环体}

       2、表达式1和表达式3可以同时写多个


for vs while
1、while循环 一般比较适用于 不太确定循环次的时候使用 - 死循环
2、for循环 一般适合用于 已经确定了循环次数 - 个人更推荐

总结一句话:何时使用循环?
	只要反复执行 【相同 或 相似】 的操作

函数可以反复执行(多半都是用户可以反复触发的),循环也可以反复执行(一瞬间几乎就执行完毕了)

*****数组

问题:保存1000个同学的姓名?
 var name1="王家凯1";
 ...
 var name1000="王家凯1000";

   如何将多个数据 同一个保存和管理?? -- 数组

   多个元素/数据组成的一个集合 - 在一个变量名中保存着多个数据
   数组中的元素,都是按照线性顺序排列的:
   特点:除了第一个元素外,每个元素都有一个唯一的前驱元素
         除了最后一个元素外,每个元素都有一个唯一的后继元素

   *数组中每个元素都有一个唯一的位置序号,称之为【下标】,用来表示数组中的每一个元素
    注意:下标从0 开始到 元素的最大个数-1

   创建数组:2种方式
       *1、直接量方式:var arr=[];//空数组
                       var arr=[元素,元素,...]

2、构造函数方式:var arr=new Array();//空数组
		 var arr=new Array(元素,元素,...);

   2、访问数组中的元素:通过 下标
        语法:数组名[i]
        注意:获取数组下标越界,得到的是undefined! -- 数组是无限长度的,但是如果没有数据的地方,默认值为undefined

   3、追加元素:
        语法:数组名[i]=新内容
        注意:1、如果当前下标没有内容,则为追加
              2、如果当前下标已经有内容了,则为替换
              3、如果你的下标越界了/下标不连续,会导致数组变成一个稀疏数组,并不是什么好事情 - 尽量不要下标越界

   4、数组中的三大不限制:
        1、不限制元素的类型
        2、不限制元素的个数
        3、不限制元素的下标越界 - 并不是好事情

   5、数组中有一个唯一的属性
      属性语法:数组名.length:获取当前数组的长度(长度等于最大下标+1)
      三个固定套路:
        1、始终向末尾追加元素:arr[arr.length]=元素;
        2、获取倒数第n个元素:arr[arr.length-n];
        3、缩容:删除末尾的n个元素:arr.length-=n;

   6、循环遍历数组:把数组中的每个元素取出来执行 【相同或相似】 的操作
        公式:
                for(var i=0;i<数组名.length;i++){
                        数组名[i];//当前次元素
                }

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DHTML:Dynamic:动态的HTML,并不是新的语言也不是新的技术,只是将现有技术整合的一个统称, 让网页在离线状态也能保存动态效果 DHTML = HTML + CSS + JS(dom)

DOM:Document Object Model 文档 对象 模型,专门用于操作文档(HTML和CSS)

DOM树:DOM将HTML文档看做了是一个倒挂的树状结构 在HTML文档中,所有的元素、属性、文本、注释等等都会被视为一个DOM节点/DOM对象/DOM元素

*重要概念:其实树根是document对象, 在JS中,不需要我们去创建的,由浏览器的js解释器自动创建,且一个页面只有一个document 作用:通过树根可以找到下面的任何一个DOM元素,还可以操作他

获取元素:类似css的选择器 - 必须先找到元素才能操作元素 1、通过 HTML的特性 获取元素: 1、ID获取: 语法:var elem=document.getElementById("id值"); -- id是唯一 在当前 DOM树中,根据元素的id,获取具体的dom节点 返回:找到了,保存的就是对应的元素 没找到,返回的是一个null

重点:!!!!输出出来长得像一个标签的样子,才叫做DOM节点/DOM对象/DOM元素,才能去执行后续操作
2、*标签名获取:
   语法:var elems=document/parent.getElementsByTagName("标签名");
   在当前 DOM树中,根据元素的标签名,获取了具体的dom集合(类数组集合)
   返回:找到了,返回的是一个类数组集合
	 没找到,返回的是一个空集合[];
   强调:1、***dom集合不允许直接做后续操作,会报错:解决:1、要么加下标拿到某一个 2、要么循环遍历拿所有
	 2、parent代表的是你已经找到的某个父元素

3、*class名获取
   语法:var elems=document/parent.getElementsByClassName("标签名");
   在当前 DOM树中,根据元素的标签名,获取了具体的dom集合(类数组集合)
   返回:找到了,返回的是一个类数组集合
	 没找到,返回的是一个空集合[];
   强调:1、***dom集合不允许直接做后续操作,会报错:解决:1、要么加下标拿到某一个 2、要么循环遍历拿所有
	 2、parent代表的是你已经找到的某个父元素

*2、通过 元素之间的关系 获取元素: 想要使用之前前提条件:至少要找到一个人才能动用关系

父元素:xx.parentNode; //单个元素
子元素:xx.children; //集合
第一个儿子:xx.firstElementChild; //单个元素
最后一个儿子:xx.lastElementChild; //单个元素
前一个兄弟:xx.previousElementSibling; //单个元素
后一个兄弟:xx.nextElementSibling; //单个元素


重点:集合不能做操作,只有单个元素可以


*操作元素:前提:1、至少要找到元素
                   2、页面上所有的东西数据类型都是一个字符串
   1、元素的内容:标签之中的东西
       *1、innerHTML属性:
                语法:获取:elem.innerHTML; - 往往都是用来做判断的
                      设置:elem.innerHTML="内容"; - 修改

2、innerText属性:
	语法:获取:elem.innerText;
	      设置:elem.innerText="文本";

小总结:以上两个操作几乎相似,但是innerHTML才可以识别标签,innerText只能操作纯文本 - 只有双标签可用

   *3、value属性:专为单标签input准备的获取和设置内容
	语法:获取:input.value;
	      设置:input.value="值";

  元素的属性:什么叫属性:<elem id class title href alt style src></elem>
        1、获取元素的属性值 - 往往都是用来做判断的
                elem.getAttribute("属性名");

2、设置元素的属性值 - 修改
	elem.setAttribute("属性名","属性值");

属性的简化版操作:
	1、获取元素的属性值:elem.属性名; - 往往都是用来做判断的
	2、设置元素的属性值:elem.属性名="属性值"; - 修改

	简化版小缺陷:1、class必须写为className
		      2、自定义属性不能操作,只能操作标准属性

 元素的样式:
        1、CSS定义的方式:
                1、内联样式 - JS要操作最好就要操作内联样式
                2、内部样式表
                3、外部样式表 - 一阶段最适合开发时使用

2、为什么JS要尽量的操作内联样式:
	1、优先级最高 - 写的JS的样式不至于别人给覆盖了
	2、牵一发而动全身 - 内联样式只会修改到当前元素

3、语法:
	获取:elem.style.css属性名; - 往往都是用来做判断的
	设置:elem.style.css属性名="css属性值"; - 修改
	特殊:1、css属性名写法不一样,把横线删掉换成驼峰命名法
		CSS			JS:
		width			width
		background-color	backgroundColor
		border-top		borderTop
		
	      2、获取:因为代老湿现在教你们是一个内联样式的操作,获取也只能获取内联样式 - 唯一的小缺点

*新的绑定事件的操作: HTML与JS分离

   elem.onclick=function(){
        自己写操作
                *****特殊:事件中可以使用一个关键字 this
                        1、单个元素绑定了事件 this->这个单个元素
                        2、多个元素循环同时绑定了事件 this->当前触发事件的元素

        建议:如果你在事件中想要使用到绑定事件的元素,推荐使用this
   }