首页 > 技术文章 > WEB前端开发--4(JavaScript基础)

edmakerr 2022-02-27 10:39 原文

JavaScript


 

1.JavaScript概述与基础语法

JavaScript是一种运行于JavaScript解释器/引擎中的解释型脚本语言

运行环境:1.独立安装的JS解释器(Node JS)

解释型:运行之前不需要编译,运行之前不会检查错误,直到碰到错误为止

编译型:对源码进行编译,还能检查语法错误(C/C++)

1.1 JS组成

完整的JS由三部分组成:

  1. 核心(ECMAScript)

  2. 文档对象模型(DOM,Document Object Model)

  3. 浏览器对象模型(BOM,Browser Object Model)

1.2 JS特点

  1.开发工具简单,记事本即可

  2.无需编译,直接由JS引擎负责执行

  3.弱语言由数据来决定数据类型

  4.面向对象

1.3 浏览器内核的作用

负责页面内容的渲染,内核主要由两部分组成:

  1.内容排版引擎解析HTML和CSS

  2.脚本解释引擎解析JavaSript

 

1.4 JS脚本嵌入在HTML页面中执行的步骤

1.4.1 将JS代码嵌入在元素"事件中"

  onclick:当单击元素时所做的操作

  <div id="" onclick="JS代码">xxx</div>

<html>

 <body>

  <button onclick="console.log('Hello World');">

    打印消息

  </button>

 </body>

</html>

注意单引号双引号的使用

1.4.2 将JS代码嵌入在<script>标记中

  <script></script>允许出现在网页的任意位置处

<html>

 <body>

  <script>

    document.write('<b>欢迎<b>')

    console.log("脚本执行结束了...")

  </script>

 </body>

<html>

1.4.3  将JS代码写在外部脚本文件中(**.js)

  1. 创建js文件,并且编写JS代码

  2. 在页面中引入js文件

  <script src="js文件路径"></script>

注意:<script src=""></script>标记中间不允许出现任何内容,出现就是错误的


 

 2. JS语法规范

2.1 语句    允许被JS引擎所解释的代码,使用分号来表示结束

      console.log()      document.write()  

    大小写敏感

      console.log()正确   Console.log()错误

    英文标点符号

      console.log("")正确  console.log(“”)错误

    由表达式、关键字、运算符组成

2.2 注释   

     单行注释://

    多行注释:/**/

    sublime text中为Ctrl+/

 

2.3 变量

  内存:保存程序在运行过程中,所需要用到的数据。8bit(比特是表示信息的最小单位)=1 byte

  变量:就是内存中一段存储空间名:内存空间的别名,可以自定义值:保存在内存空间中的数据

2.3.1变量的声明

声明:var 变量名; var userName;

     赋值:     var userName=25.5;

    变量名=值

一次性声明多个变量:

var 变量名1,变量名2...变量名n

var stuName="PP.XZ",stuAge=25,stuHeight=50;

 

2.3.2 变量名命名规范

1. 不允许使用JS的关键字和保留关键字

 

 

2. 由字母、数字、下划线以及$组成

  var stuName;

  var stuName1;

  var stu_name;

  var stu$name;

3. 不能以数字开头

4. 尽量见名知意

5. 可以采用"驼峰命名法"

  变量名为合成词时,第一个单词全小写,从第二个单词开始,每个单词首字符大写

  var stuName

2.3.3 变量的使用

  var stuName="小猪佩奇"

  console.log(stuName)

2.3.4 变量的存取操作

1.获取变量的值-GET操作

  var userPwd='123456'

  console.log(userPwd)

  document.write(userPwd)

  var newPwd = userPwd;

2. 保存(设置)变量的值-SET操作

  var oldPwd='123'

  oldPwd='456'

  oldPwd=newPwd


3. 数据类型

3.1 原始类型(基本类型)

1)  数字类型——number类型

  可以表示32位的整数以及64位的浮点数

  整数:32位即4字节

  浮点数:即小数,64位,8字节

2)  布尔类型——bool

  作用:表示条件的结果

  取值:true:真,肯定的结果

     false:假,否定的结果

3)  字符串类型——string类型

  由Unicode字符、数字、标点组成

4)  空——null

5)  未定义——undefined

    1.声明变量未赋值

    2.访问对象不存在的属性

 

3.2 数据类型转换

弱类型:由数据来决定变量的数据类型是什么——JS语言数据类型为弱类型

    var stu;  //undefined

    stu=25;  //number

    stu="15"  //string

3.2.1 隐式转换

自动转换,由JS在运算过程中,自己转换的操作,不需要人为参与

函数:typeof()  或   typeof

    var num1 = 15

    var s = typeof(num1);   获取num1的数据类型

    var s1 = typeof num1;   获取num1的数据类型

NaN:

  Not a Number  不是一个数字

  isNaN:判断数据是否为非数字

  结果为boolean类型:true——不是一个数字

             false——是一个数字

注:所有的数据类型与string做加法运算时,最后的 结果都为string

 

3.2.2 强制转换

 1.  toString()

  作用:将任意的数据类型转换为string类型

  用法:变量.toString()

 

2.  parsesInt()

  作用:获取指定数据的整数部分

  用法:var result=parseInt(数据)

  注意:parseInt从左到右依次转化,碰到第一个非整数类型,则停止

     若第一个字符就是非整数字符,则结果为NaN

 

3.  parseFloat()

  作用:将指定数据转换成小数

  用法:var result=parseFloat(数据)

  同样,一旦碰到非数字则停止转换,第一个为非数字会输出NaN

 

4.  Number()

  作用:将一个字符串解析为NaN

  语法:var result=Nmuber(数据)

  注意:数据中一旦包含非数字字符,则一律输出NaN

 


 

4. 运算符与表达式          略,只谈重点,类似python

==    判断等于——不比较类型,只比较数值

!=    不等于——数值不等于

===    全等于——除了数值之外,连同类型也会一起比较

!==    不全等——类型也不同

 

5. 函数:

function 函数名(参数列表声明){

  //代码块(函数体,功能体,方法体)

  return 值;

}

6. 循环    与c语言相同

while(boolean表达式){循环体语句}

for(表达式1;表达式2;表达式3){}


 

7. 数组

  创建:var arr=[]      var arr=new Array()

  添加:arr[1]=值   arr[5]=值

 

7.1 数组转字符串

  String(arr):将arr中每个元素转为字符串,用逗号分隔

  arr.join(连接符):将arr中的每个元素转为字符串,用自定义字符串连接

固定套路:1.chars.join("")  ->无缝连接

     2.判断数组是空数组  chars.join("")==""

     3.将数组转化为也没面元素的内容

       "<开始标签>"+

      arr.join("</结束标签><开始标签>")

       +"</结束标签>"

7.2 拼接和选取

不直接修改原数组,而返回新数组!

 

1. concat() 拼接两个或更多的数组,并返回结果

  var newArr=arr1.contact(值1,值2,值3)

  arr1不变    newArr为拼接后

 

2.slice() 返回现有数组的一个子数组

  var subArr=arr.slice(starti,endi+!)

  选取arr中starti位置开始,到endi结束的所有元素组成新数组返回——原数组保持不变

  复制数组:arr.slice(0,arr.length+1)

 

3.splice  直接修改原数组

  删除:

    arr.splice(starti,n);

    删除arr中starti位置开始的n个元素不考虑含头不含尾

    var deletes=arr.splice(starti,n;)

    返回值deletes保存了删除的元素组成的临时数组

  插入:

    arr.splice(starti,0,值1,值2,...)

    在arr中starti位置,插入新值1、值2...原starti位置的值以及在其之后的值向后顺移

  替换:

    其实就是删除旧的,插入新的

    arr.splice(starti,n,值1,值2,...)

    先删除arr中starti位置的n个值,再再starti位置插入新值

    强调:删除的元素个数和插入的新元素数不必一致

 


 

8. DOM——document object model

DOM是W3C(万维网联盟)的标准,是中立于平台的和语言的接口,它允许程序

和脚本动态地访问和更新文档的内容、结构和样式。

对网页进行增删改查的操作。 

 

8.1.DOM查找

8.1.1 按id属性,精确查找一个元素对象(效率非常高)

   var elem=document.getElementById("id")

 强调:getElementById只能用在document上

 问题:不是所有元素都有id

  <ul id="myList">

    <li id="m1">首页</li>

    <li id="m2">企业介绍</li>

    <li id="m3">联系我们</li>

  </ul>

  var ul = document.getElementById('myList');

  console.log(ul);

8.1.2 按标签名查找

  var elems=parent.getElemengtsByTagName("tag");

  查找指定parent节点下的所有标签为tag的子代节点

  强调:1.可用再任意父元素上

     2.不仅查直接子节点,而且查所有子代节点

     3.返回一个动态集合,即使只找到一个元素,也返回集合必须用[0],取出唯一元  素

  问题:不但找直接,而且找所有子代

  <ul id="myList">

    <li id="m1">首页</li>

    <li id="m2">企业介绍</li>

    <li id="m3">联系我们</li>

  </ul>

  var ul = document.getElementById('menuList');

  var list=ul.getElementsByTagName('li');

  console.log(list);

8.1.3 通过name属性查找

  document.getElementByName('name属性值')

  可以返回DOM树种具有指定name属性值的所有子元素集合

  <form id="registerForm">

    <input type="checkbox" name="boy"/>

    <input type="checkbox" name="boy"/>

    <input type="checkbox" name="boy"/>

  </form>

  var list = document.getElementsByName('boy');

  console.log(typeof list);

8.1.4 通过class查找

  查找父元素下指定class属性的元素

  var elems=parent.getElementsByClassName('class属性值')

  有兼容性问题:IE9+

  <div id="news">

    <p class="mainTitle">新闻标题1</p>

    <p class="subaTitle">新闻标题2</p>

    <p class="mainTitle">新闻标题3</p>

  </div>

  var div=document.getElementById('news');

  var list = div.getElementsByClassName('mainTitle');

  console.log(list);

8.1.5 通过CSS选择器查找

元素选择器  类选择器      ID选择器

后代选择器  子代选择器  群组选择器

8.1.5.1 只找一个元素:(selector为选择器)

  var elem = parent.querySelector("selector")

  强调:1.selector支持一切css中的选择器

    2.如果选择器匹配的有多个,只返回第一个

8.1.5.2 找多个

  var elems=parent.querySelectorAll("selector")

  强调:selector API 返回的是非动态集合


 

9.DOM标准

核心DOM:可操作一切结构化文档的API,包括HTML和XML,万能繁琐

HTML DOM:专门操作HTML文档的简化版DOM API,仅对常用的复杂的API进行了简化,不是万能简单

开发:先用简单的,再用复杂的补充——以实现效果为目标

9.1 核心DOM——4个操作

读取属性值:

  1.先获得属性节点对象,再获得节点对象的值:

    var attrNode = elem.attributes[下标/属性名];

    var attrNode = elem.getAttributeNode(属性名)

    attrNode.value——属性值

  

  2.直接获得属性值

    var value = elem.getAttribute("属性名")

修改属性值:

  elem.setAttribute("属性名",value)

  var h1=document.getElementById("a1");

  h1.setAttribute("name",zhangji);

判断是否包含指定属性:

  var bool=elem.hasAttribute("属性名")     //true或者false

  element,getElementById("bt1").hasAttribute("onclick")    //组合用法

移除属性:

  elem.removeAttribute("属性名")    移除属性

  <a id="alink" class="slink" href="javascript:void(o)" onclick="jump()">百度搜索</a>

  var a = document.getElementById('alink')

  a.removeAttribute('class')

 

9.2 修改样式

内联样式:elem.style.属性名="值"

强调:属性名为去横线变驼峰表示

例如:css:background-color——backgroundColor

     list-style-type——listStyleType

 


 

10. DOM添加

10.1.添加元素的步骤

10.1.1创建空元素

  var elem=document.createElement("元素名")

  var table = document.createElement('table')

  console.log(table)

10.1.2.1设置关键属性

  元素.属性名=值

  a.innerHTML="go to mooc"

  a.href="http://tmooc.cn"

  <a href="http://tmooc.cn"> go to tmooc</a>

10.1.2.2设置关键样式

  a.style.opacity="1"

  a.style.cssText="width:100px;height:100px;"

10.1.3将元素添加到DOM树

  parentNode.appendChild(childNode)

  可用于将一个父元素追加最后一个子节点

  var div=document.creatElement('div')

  var txt=document.creatTextNode('版权声明')   // 声明一段文本

  div.appendChild(txt)      // 将txt的内容放入div

  document.body.appendChild(div)

  

  parentNode.insertBefore(newChild,existingChild)

  用于在父元素中的指定子节点之前添加一个新的子节点

  <ul id="menu">

    <li> 首页 </li>

    <li> 联系我们 </li>

  </ul>

  var ul=document.getElementById('menu')

  var newLi=document.createElement('li')

  ul.InsertBefore(newLi,ul.lastChild)

10.2 添加元素优化:

  尽量少的操作DOM树——每次修改DOM树都会导致重新layout

  解决:

    1.如果同时创建父元素和子元素时,建议在内存中先将子元素添加到父元素,再将父元素一次性挂到页面上

    2.如果只添加多个平级子元素时,就要将所有子元素,临时添加到文档片段中。再将文档片段整体添加到页面

  文档片段:内存中,临时保存多个平级子元素的虚拟父元素。用法和普通父元素完全一致

  1.创建片段

    var frag=document.createDocumentFragment();  

  2.将子元素临时追加到frag中

    frag.appendChild(child);

  3.将frag追加到页面

    parent.appendChild(frag);

    强调:append之后,frag自动释放,不会占用元素

 


 

11.BOM

Browser Object Model:专门操作浏览器窗口的API——没有标准、兼容性问题

11.1 对象

  windows:代表整个窗口

  hstory:封装当前窗口打开后,成功访问过的历史url记录

  navigator:封装浏览器配置信息

  document:封装当前正在加载的网页内容

  location:封装了当前窗口正在打开的url地址

  screen:封装了屏幕的信息

  event:定义了网页中的事件机制

 

11.2 获取当前窗口大小

  完整当前窗口大小:

    window.outerWidth/outerHeight

  文档显示区大小:

    window.innerWidth/innerHeight

 

11.3定时器——让程序按指定时间间隔自动执行任务,实现网页动态效果、计时功能

  11.3.1 周期性定时器

    让程序按指定时间间隔反复自动执行一项任务

    setInterval(exp,time):周期性触发代码exp

      exp:执行语句

      time:时间周期,单位为毫秒

    setInterval(function(){console.log("Hellow World");},1000}

     停止定时器

      1.给定时器取名

        var timer=setInterval(function(){console.log("Hello World");},1000)

      2. 停止定时器

        clearInterval(timer)

  11.3.2  一次性定时器——让程序延迟一段时间执行

    setTimeout(exp,time):一次性触发代码exp

      exp:代码语句

      time:间隔时间,单位为毫秒

    setTimeout(function(){alert("恭喜过关");},3000);

选择:只要反复执行,就选周期性定时器

   只要只执行一次,就用一次性定时器

推荐阅读