js基础

137 阅读12分钟

1.JavaScrip概述:

什么是:简称js,是一个运行在【js解释器】中的一个【解释型】【弱类型】【面向对象】脚本语言
1.js解释器:
        1.浏览器自带js解释器
        2.以后我们确实也会自己安装一个js解释器-Node.js
2.编译型:在运行程序之前,需要先检查程序是否有报错,如果有报错直接不运行,比如:java、c#、c++... - 严格
  解释型:在运行程序之前,不需要检查程序是否有报错,直接运行,碰到错误了才会停止,比如javascript、php... - 自由
3.弱类型:变量想保存什么数据类型就保存什么数据类型,由数据决定了数据类型是什么,比如JavaScript、php...- 自由
  强类型:变量能保存什么数据类型,需要提前声明出来,由数据类型来决定能保存的数据是什么,比如:java... - 严格
  

2.JavaScript特点:

 1.用任何文本编辑器编写代码:HBuilder、VSCode、记事本开发都可以...
 2.解释型
 3.弱类型
 4.面向对象:以后我们会经常见到带有一种写法:万物皆对象
         对象名.属性名;
         对象名.方法名();
         

3.JavaScript如何使用:

 1.js的引入方式有2种:
         1.在HTML中书写一个script标签: - 仅用于临时测试
             <script>
                     js代码
             </script>
         2.创建一个xx.js文件,再HTML中进行引入 - 正式开发中
             如何引入:<script src="xx.js">//不能在这里书写js代码</script>
             
         建议js放在我们的HTML和CSS的后面,最好是最后
         
 2.打桩输出:疯狂打桩:非常重要的一种找错方式:3种
     *1.在控制台输出日志:console.log(想要输出的内容);
      2.在页面上输出:document.write(想要输出的内容); - 可以识别标签,缺点:如果有点击事件触发document.write会导致页面原来的HTML全被覆盖掉,那你写的网页就白写了
      3.在警告框输出:alert(想要输出的内容); - 缺点:会卡主页面,只能看到白板
      4.用户输入框:prompt(想要用户输入的内容);
      4.用户确认框:var bool=confirm("提示文字");
      
 3.变量和常量
     *变量:简单来说就是一个值可以发生变化的数据/量。
      何时:如果以后某一个数据我们要反复使用,最好都把他先保存成一个变量,以后只需要使用变量名相当于就是在使用变量的值;
      语法:var 变量=值;
      特殊:
              1.面试题:内存和变量有区别吗?
                      硬盘:保存数据/文件,机械硬盘和固态硬盘 - 外存
                      CPU:中央处理器 - 用于计算的
                      内存:是程序在运行过程中【临时】用到的数据
                          内存空间:实际保存数据的地方
                          内存地址:内存空间的一个门牌号:0x000012edae21fsdhgi11,往往会取一个别名(变量名),以后使用这个变量相当于就在拿内存空间里面的数据
               2.变量名其实不是随便的
                   1.不能以数字开头
                   2.建议:尽量的要见名知意
                       以英文为主:比如 var name="xx";
                       
                       var xingming="某某某"; - 逼格(变量名、打字速度)很低,逼格其实很重要
                       最不推荐:var aa; - 没有见名知意的效果
                                var ab;
                                var ac;
                   3.使用驼峰命名法更加推荐
                   4.name是一个关键字,不管你保存的数据类型是什么,都会悄悄的变成一个字符串
                   5.千万不要把关键字当做变量名
                   
               3.如果你想要创建多个变量,没有必要每个都写var,中间的变量都可以省略掉var关键字,中间用,间隔,最后一个还是用;结束
               
      常量:一旦创建后,值不允许被修改来了
      何时:用途和变量几乎一致,几乎不用,现实中用的少的,代码中也用的少
          生活中的常量:
              1.pi=3.14159265352.一年一定是365/3663、一天24个小时
              ...
      语法:const 常量名=值;
      
4.算术运算符:+ - * / %:前四个运算符和小时候学习的一模一样
    %:取余,俗称模,两个数相除,不取商,而取除不尽的余数
        num1%num2;
    作用:
            1.*判断某个数字的奇偶性:num%2   如果结果为0说明是偶数,如果结果为1说明是奇数
            2.取出一个数字想要的后n位
                    1234%10 ->4
                    1234%100 ->34
                    1234%1000 ->234
    特殊:
            1.算术运算符具有隐士转换(悄悄的,我们程序员看不见的),默认:都是转为数字再运算
            特殊在+运算,如果碰到了一个字符串,两边都会悄悄的转为字符串,变成了一个拼接操作
            -*/%:其实字符串也能转为数字,但是前提是一个纯数字组成的字符串,但凡包含一个非数字字符串,则为NaN:纯粹的垃圾:Not a Number:直译,不是一个数字,但是确实是数字类型,但是不在三界之中,全是缺点:
            1.NaN参与任何算术运算结果仍未NaN
            2.NaN参与任何比较运算结果仍未false
            
5.数据类型:
        原始/基本/值类型:51。String - 字符串,取值有无数个,但是必须写上""''
                2.Number - 数字,取值有无数个,直接书写数字即可
                3.Boolean - 布尔,取值只有2true(真、对)和false(假、错) - 多半用于表示判断的结果
                4.Undefined - 变量如果声明了,但是没有赋值的话,默认值就为undefined,只有这一个取值 - 垃圾:没有任何用处
                5.Null - 空 ,取值也只有一个null,释放内存/变量
                
引用/对象类型:11个对象(属性和方法) - 以后会有很多很多的属性和方法等待我们去学习

数据类型转换:

    隐式转换:
      算术运算符具有隐式转换:
          默认,转为数字,在运算
              true->1
              false->0
              undefined->NaN
              null->0
          特殊:1.+运算碰上了字符串,则变为拼接
          2.-*/%:字符串也能转为数字,纯数字组成的才行,包含非数字字符,则为Nan
                  "1000"->1000
                  "100X0"->NaN
          NaN:不是一个数字,但是确实是数字类型
                  缺点:
                    1.参与任何算术运算结果仍未NaN
                    2.参与任何比较运算结果都为NaN - 无法使用普通的比较运算判断x否为NaN
                        解决:!isNaN(x):此方法不管你放的x是什么都会悄悄的隐式转换为数字
                            true->说明是一个有效数字
                            false->说明是一个NaN
                        目的:防止用户恶意输入,但是目前为止,只能防止用户输入的必须是一个数字(比如验证的话我们做不了:正则学了才能做)
                        
      强制转换:
          转字符串:xx.toString();//页面上一切的数据都是字符串,所以此方法几乎很少使用
                                  //undefined和null不能使用,因为他们不能使用.操作
                                  
          转数字:3个
                  parseInt/Float(str);//从左向右依次读取每个字符,碰到非数字字符就停止,Int不认识小数点,Float认识第一个小数点
                  Number(x);//完全等效于隐式转换,不会手动使用,还不如*1 /1 -0
                  

                  
            

5.Function:需要提前创建好的,以后可以反复使用的代码段 - 时机:要么程序员调用几次就执行几次,要么用户触发几次就执行几次

何时:1、以后任何作业都要封装成一个函数,因为函数的js地位很高,属于第一等公民地位
  2、你不希望打开页面立刻执行
  3、能够反复执行
  4、他是个独立的功能体
  5、你不是自己释放内存,函数调用完毕会自动释放内存/变量
如何:
    1.创建函数
            function 函数名(){
                    函数体;
            }
            
    2、调用函数:
	1、直接在js中程序员写几次调用,就会执行几次操作:
		函数名();

	2、让用户来自己触发:
		<elem onclick="函数名()"></elem>
            
    3、带参数的函数:
	电饭煲 -> 看做是一个函数:功能:把....煮熟
	原材料 -> 参数	
	
	语法:形参:其实就是一个变量名,只不过不需要写var这个关键字,每个形参之间用,间隔,形式参数,简称形参
		function 函数名(形参,...){
			函数体;
		}

	调用:实参:实际参数
		函数名(实参,...);

		function zwjs(name,age,hobby){
			console.log("我的名字叫"+name+",今年"+age+"岁,喜欢"+hobby);
		}
		zwjs("张三丰",128,"打太极");
		zwjs("张无忌",18,"撩妹");
		zwjs("张三",28,"说法");	

	特殊:实参的个数以及顺序 和 形参的个数以及顺序都要一一对应
            4、普通函数:操作永远是固定的
               带参数的函数:根据传入的实参,执行略微不同的操作
        

6.分支结构:

    1、代码流程控制语句:
	1、顺序结构:默认的,代码从上向下

	2、分支结构:根据条件不同,选择部分代码执行

	3、循环结构:根据条件满不满足,考虑要不要再执行一次相同 或 相似代码

2、关系/比较运算符:> < >= <= == !=
	结果:一定都是一个布尔值

	注意:==才叫比较		=叫赋值:右边的东西放到了左边保存起来
    比较运算符: > < >= <= == !=
    逻辑运算符:
            &&:全部满足,才满足
               一个不满足,则不满足
               
            ||:全部不满足,才不满足
               一个满足,则满足
               
             !:颠倒布尔值
             
     以上的所有运算结果都是布尔值
     3、分支的语法:
	1、一个条件一件事,满足就做,不满足就不做
		if(条件){
			操作
		}

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

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

	else可以省略,但是不推荐
     

7、循环:反复执行 相同 或 相似的代码 - 时机:程序员写好的,而且几乎就一瞬间做完了,其实一次一次执行的,只不过速度很快

问题:在控制台打印输出10000句hello world
console.log("1hello world");
...
console.log("1000hello world");

   解决:循环结构:反复执行相同 或 相似的代码
 生活中的循环:
	吃饭
	睡觉
	做作业
	上课
	上班
	活着

 循环三要素:
	1、循环条件:从哪里开始,到哪里结束
	2、循环体:操作-要做什么事
	3、循环变量、变量还要变化

   1while循环:其实循环从宏观上看是一起执行的,但是微观上看是一次一次执行的,只不过这个执行速度很快
语法:
var 循环变量=几;
while(循环条件){
	循环体;
	循环变量变化;
}

执行原理:先判断循环条件满足吗,如果为true,则执行循环体一次,再一次判断循环条件满足吗,如果为true,则再执行循环体一次
	  .......直到循环条件不满足,才会退出循环

特殊:
  死循环:永远不会结束的循环,但是还真用:往往不确定循环次数的时候就要使用
	while(true){
		循环体;
	}

  往往死循环还要搭配上,退出循环语句:break; - 只能写在循环里面

2、***for循环:执行原理跟while一模一样,只是语法更加的简洁
for(循环变量的创建;循环条件;变量的变化){
	循环体;
}

特殊:1、循环变量的创建和循环变量的变化,其实可以写多个

      2、死循环:for(;;){操作}


总结:1while:语法更加繁琐,建议只用于不确定循环次数的时候 - 死循环
      2for:语法更加简洁,建议只用于确定循环次数的时候 - 大部分情况
	 
问题:函数 和 循环 都是可以反复执行的,区别在哪里?
	函数 - 要么程序员调用几次,执行几次,或者,用户来触发几次,执行几次
	循环 - 程序员写好的,而且几乎是一瞬间就执行完毕了的

8.数组

问题:保存1000个同学的姓名:
var name1="周洁";
var name2="周杰";
var name3="周杰伦";
...
   以上写不合理:变量就是一个内存,我们开辟的内存空间太多的话,会影响网页效率
   希望,一个变量名,就可以保存住所有的数据 - 数组:

   数组里面的元素,是按照线性顺序排列的,除了第一个元素,每个元素都有一个唯一的前驱元素
				除了最后一个元素,每个元素都有一个唯一的后继元素
*每个元素都有一个唯一的位置序号,称之为【下标】:从0开始,到最大长度-1

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

2、构造函数方式:var arr=new Array();//空数组 - 个人不推荐,更麻烦,其实直接量方式是ES2过后才添加上的,原来只有构造函数方式
		var arr=new Array(元素,...);

   2、访问/获取:获取出数组中的某个元素
数组名[下标]

   3、添加/覆盖:
数组名[下标]=新元素;
特殊:
  1、下标处没有元素,则为添加
  2、下标处有元素,则为覆盖/替换

   4、数组的三大不限制:
1、不限制元素的类型
2、不限制元素的个数
3、不限制下标越界 - 算是一个缺点:
	获取时 - 下标越界,返回undefined
	添加时 - 下标越界,会变成稀疏数组,导致下标不连续,不好

   5、数组有一个唯一的属性:数组名.length; - 获取到数组的长度
***三个固定套路:
	1、向末尾添加元素:arr[arr.length]=新元素;
	2、获取倒数第n个元素:arr[arr.length-n];
	3、缩容:删除末尾n个元素:arr.length-=n;

   6、其实经常我们不会去拿出数组中的某一个来做操作,往往是拿出所有的东西来做操作
遍历数组:将数组中的每一个元素取出来执行 相同 或 相似的操作;
    公式:
	for(var i=0;i<arr.length;i++){
		arr[i];//当前此元素
	}

ECMAscript - 核心语法1 - 掘金 (juejin.cn)