Javascript笔记(下篇)

共计 8613 个字符,预计需要花费 22 分钟才能阅读完成。

概述

介绍 javascript 数组和字符串的操作方法、循环语句、定时器的使用及实例、变量作用域、封闭函数的使用场景。

一、数组&字符串的操作

1. 数组及操作方法

数组就是一组数据的集合,javascript 中,数组里面的数据可以是不同类型的, 这里的数组就相当于我们 python 中的列表

定义数组的方法

数组定义形式: 
第一种: 
var 数组名 = new Array(元素一, 元素二, 元素三...)


第二种: 
var 数组名 = [元素一, 元素二, 元素三...]

例如:

// 对象的实例创建
var aList = new Array(1,2,3);

// 直接量创建
var aList2 = [1,2,3,'asd'];

2. 数组常见的操作方法:

1、获取数组的长度:

一般我们获取数组长度使用: length

var aList = [1,2,3,4];

// 打印输出数组 aList 的长度
console.log(aList.length)

结果:

4

var aList = [‘光头强’, ‘熊大’, ‘熊二’, ‘翠花’, ‘吉吉’, ‘萝卜头]

2、下标索引的使用:

和python一样, 我们也可以利用下标索引的思想来操作数组中某一个元素: aList[0]

var aList = [1,2,3,4];

console.log(aList[0]); 

结果:

1

var aList = [‘美羊羊’, ‘慢羊羊’, ‘红太狼’, ‘喜羊羊’, ‘懒羊羊’]

3、join(分隔符)

将数组成员通过一个分隔符合并成字符串

var aList = [1, 2, 3, 4]

var newList = aList.join('-')

console.log(newList)
console.log(typeof(newList)) 

结果:

1-2-3-4
string

var aList = [‘七龙珠’, ‘史努比’, ‘铁壁阿童木’, ‘忍者神龟’, ‘兔八哥’]

4、push( ) 和 pop( )

从数组最后增加成员或删除成员

var aList = [1,2,3,4];

aList.push(5);
console.log(aList)

aList.pop()
console.log(aList)

结果:

[1, 2, 3, 4, 5]

[1, 2, 3, 4]

var aList = [‘灌篮高手’, ‘邋遢大王奇遇记’, ‘变形金刚’]

5、reverse( )

将数组反转

var aList = [3,2,1,4];

aList.reverse();
console.log(aList)

结果:

[4, 1, 2, 3]

var aList = [‘蜡笔小新’, ‘舒塔和贝塔’, ‘魔神英雄坛’, ‘棒球英豪’]

6、indexOf( )

返回数组中元素第一次出现的索引值:

  • 如果有, 则正常返回索引值
  • 如果检索的内容不存在于数组中, 则返回 -1
var aList = [1,2,3,4,1,3,4];

console.log( aList.indexOf(4) )
console.log( aList.indexOf(5) )

结果:

3
-1

var aList = [‘美少女战士’, ‘犬夜叉’, ‘黄金圣斗士’, ‘猫和老鼠’, ‘美少女战士’, ‘猫和老鼠’]

7、splice( )

在数组中增加或删除成员

使用格式: 

数组名.splice(index,howmany,item1,.....,itemX)

index: 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。

howmany: 必需。要删除的项目数量。如果设置为 0,则不会删除项目。

item1, …, itemX: 可选。向数组添加的新项目。

例如:

var aList = [1,2,3,4];

// 从第2个元素开始,删除1个元素,然后在此位置增加'7,8,9'三个元素
aList.splice(2,1,7,8,9); 
alert(aList); //弹出 1,2,7,8,9,4

8. 多维数组

多维数组指的是数组的成员也是数组的数组。

var aList = [[1,2,3],['a','b','c']];

alert(aList[0][1]); //弹出2;

批量操作数组中的数据,需要用到循环语句

2. 循环

程序中进行有规律的重复性操作,需要用到循环语句。

for循环

使用格式:

for (var i=0;i<5;i++)
{
    console.log(i)
}

打印结果:

20
1
2
3
4

课堂练习

1、数组去重

var aList = [1,2,3,4,4,3,2,1,2,3,4,5,6,5,5,3,3,4,2,1];

var aList = [1,2,3,4,4,3,2,1,2,3,4,5,6,5,5,3,3,4,2,1];

var aList2 = [];
// 第一种方法: 
for (var i=0;i< aList.length;i++){
    var value = aList[i]
    if (aList2.indexOf(value) + 1){
        console.log('重复了',value)
    } else {
        aList2.push(value)
    }
}
console.log(aList2)

// 第二种方法:
for(var i=0;i<aList.length;i++)
{
    if(aList.indexOf(aList[i])==i)
    {
        aList2.push(aList[i]);
    }
}

// 第三种方法
for (var i = 0; i < arr.length; i++) {
            if (arr.indexOf(arr[i]) != i) {
                arr.splice(i, 1);
                i--;
            }
        }
        alert(arr);

alert(aList2);

2、将数组数据放入页面

var list = [‘弱点’, ‘看不见的客人’, ‘摔跤吧, 爸爸’, ‘龙猫’, ‘全民目击’, ‘触不可及’, ‘萨利机长’,’消失的爱人]

JS部分: 
<script>
    window.onload = function () {
        var ul = document.getElementById('ulbox')
        var  list = ['弱点','看不见的客人','摔跤吧, 爸爸','龙猫','全民目击','触不可及','萨利机长']
        var str = ''
        for (var i=0;i<list.length;i++){
            value = list[i]
            str += '<li>' + value + '</li>'
        }
        console.log(str)
        ul.innerHTML = str
    }
</script>


HTML部分: 
<ul id="ulbox">

</ul>

3. 字符串处理方法

1、+ 运算符

如果是两个数字进行相加运算, 得到的是 两个数的和

如果是两个字符串进行相加运算, 得到的是 两个字符串的拼接

如果是一个字符串, 一个数字的相加运算, 得到的是 拼接的结果

var iNum01 = 12;
var iNum02 = 24;
var sNum03 = '12';
var sTr = 'abc';

alert( iNum01 + iNum02 );  // 弹出36
alert( iNum01 + sNum03 );  // 弹出1212 数字和字符串相加等同于字符串相加
alert( sNum03 + sTr );     // 弹出12abc

2、parseInt( )

将 数字字符串 转化为 整数

var sNum01 = '12';
var sNum02 = '24';
var sNum03 = '12.32';


alert( sNum01+sNum02 );                          // 弹出1224
alert( parseInt(sNum01) + parseInt(sNum02) )  // 弹出36
alert( parseInt(sNum03) )                     // 弹出数字12 将字符串小数转化为数字整数

3、parseFloat()

将数字字符串转化为小数

var sNum03 = '12.32'
alert( parseFloat(sNum03) );  // 弹出 12.32 将字符串小数转化为数字小数

4、split( )

把 一个字符串 分隔成 字符 组成的 数组

var sTr = '2017-4-22';
var aStr1 = sTr.split("-");
var aStr2 = sTr.split("");
var aStr3 = sTr.split();

console.log(aStr1);   
console.log(aStr2);   
console.log(aStr3)    

结果:

['2017','4','22']
['2','0','1','7','-','4','-','2','2']
['2017-4-22']

练习: var str=”How are you doing today?”

如果把空字符串 (“”) 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

注意: split() 方法不改变原始字符串。

<p id="demo">单击按钮显示分割后的数组.</p>
<button onclick="myFunction()">点我</button>
<script>
function myFunction(){
    var str="How are you doing today?";
    var n=str.split(" ");
    document.getElementById("demo").innerHTML=n;
}
</script>

5、indexOf()

方法可返回某个指定的字符串值在字符串中首次出现的位置。

如果要检索的字符串值没有出现,则该方法返回 -1。

var sTr = "abcdefgh";

var iNum = sTr.indexOf("c");
alert(iNum); // 弹出2

6、substring( )

截取字符串

左闭右开 [start, stop) start <= x < stop

使用方法: 

字符串.substring(start,stop)

start: 必需。一个非负的整数,规定要提取的子串的第一个字符在 字符串 中的位置。

stop: 可选。一个非负的整数,比要提取的子串的最后一个字符在 字符串 中的位置多 1。如果省略该参数,那么返回的子串会一直到字符串的结尾。

例如:

var sTr = "abcdefghijkl";
var sTr2 = sTr.substring(3,5);
var sTr3 = sTr.substring(1);

alert(sTr2); // 弹出 de
alert(sTr3); // 弹出 bcdefghijkl

7. 字符串反转:

将字符串的内容颠倒过来, 不是排序

var str = 'asdfj12jlsdkf098';
var str2 = str.split('').reverse().join('');

console.log(str2);

结果:

890fkdslj21jfdsa

思考:

如果我们把上面的式子写成下面的样子, 能否达到同样的效果:

var str = 'asdfj12jlsdkf098';
var str2 = str.split().reverse().join('');

console.log(str2);

结果:

asdfj12jlsdkf098

二. 调试程序的方法

  • alert
  使用方式: 
  alert(要展示的内容)

  alert展示内容的形式是弹出一个对话框, 然后把内容添加上去. 
  通常用于程序需要暂时停止的情况
  • console.log
  使用方式: 
  console.log(要展示的内容)

  console.log()方法能够帮助我们将调试的代码展示在浏览器的控制台
  一般我们使用这样的调试方式较多, 而且浏览器控制台能够直接修改代码, 方便我们多次调试
  • document.title
  使用方法: 
  document.title = 要显示的内容

  这样的方式可以把要调试的内容,展示在网页的标题区域
  这样的方式适合于偶尔展示
  • document.write( )
  使用方法: 
  document.write(exp1,exp2,exp3,....)

  write() 方法可向文档写入 HTML 表达式或 JavaScript 代码
  可列出多个参数(exp1,exp2,exp3,...) ,它们将按顺序被追加到文档中。
  一般不怎么使用, 偶尔可用

三 . 定时器

定时器在 javascript 中的作用

  • 定时调用函数
  • 制作动画
  • 模拟网络延时的情况

1. 定时器的种类:

  • 执行一次的定时器: setTimeout
  • 执行多次的定时器: setInterval
  • 关闭只执行一次的定时器: clearTimeout
  • 关闭反复执行的定时器: clearInterval
定时器的使用方式: 

setInterval(code,millisec)

code 必需。要调用的函数或要执行的代码串。

millisec 必须。周期性执行或调用 code 之间的时间间隔,以毫秒计。

例如:

// 设置定时器
var time1 = setTimeout(myalert,2000);
var time2 = setInterval(myalert,2000);

// 去除定时器
clearTimeout(time1);
clearInterval(time2);

// 定时器调用的方法
function myalert(){
    alert('ok!');
}

1. 使用定时器 —– 使方框移动

CSS部分: 
<style>
    .box{
        width:300px;
        height:300px;
        background:gold;
        position:fixed;
        left:0px;
        top:100px;
    }
</style>

JS部分: 
<script>
    window.onload = function(){
        var oBox = document.getElementById('box');
        var iLeft = 0;

        var oTimer = setInterval(fnMove,30);
        function fnMove(){
            iLeft += 3;                
            if(iLeft>600)
            {
                clearInterval(oTimer);
            }
            oBox.style.left = iLeft + 'px';
         }        
    }    
</script>

HTML部分: 
 <div class="box" id="box"></div>

2. 使方框左右移动:

CSS部分: 
<style>
    .box{
        width:300px;
        height:300px;
        background:gold;
        position:fixed;
        left:0px;
        top:100px;
    }
</style>

JS部分: 
<script>
    window.onload = function(){
        var oBox = document.getElementById('box');
        var iLeft = 0;
        var iSpeed = 3;

        var oTimer = setInterval(fnMove,30);
        function fnMove(){
            iLeft += iSpeed;                
            if(iLeft>600)
            {
                iSpeed = -3;
            }

            if(iLeft<0)
            {
                iSpeed = 3;
            }

            oBox.style.left = iLeft + 'px';
        }        
    }    
</script>


HTML部分:
<div class="box" id="box"></div>

3. 无限轮播动画

CSS部分: 
<style type="text/css">
    body,ul{
        margin:0;
        padding:0;
    }

    .list_con{

        width:1000px;
        height:200px;
        border:1px solid #000;
        margin:10px auto 0;
        background-color:#f0f0f0;
        position:relative;
        overflow:hidden;
    }

    .list_con ul{
        list-style:none;
        width:2000px;
        height:200px;
        position:absolute;
        left:0;
        top:0;
    }


    .list_con li{
        width:180px;
        height:180px;
        float:left;
        margin:10px;
    }

    .btns_con{
        width:1000px;
        height:30px;
        margin:50px auto 0;
        position:relative;
    }

    .left,.right{
        width:30px;
        height:30px;
        background-color:gold;
        position:absolute;
        left:-40px;
        top:124px;
        font-size:30px;
        line-height:30px;
        color:#000;
        font-family: 'Arial';
        text-align:center;
        cursor:pointer;
        border-radius:15px;
        opacity:0.5;
    }
    .right{
        left:1010px;            
        top:124px;          
    }
</style>

JS部分:
<script type="text/javascript">
    window.onload = function(){
        // 获取图片的容器
        var oUl = document.getElementById('list');

        // 获取左右两个按钮
        var oLeft = document.getElementById('btn01');
        var oRight = document.getElementById('btn02');

        // ul的容器
        var oSlide = document.getElementById('slide');

        // 将ul中的5个li复制一份
        oUl.innerHTML = oUl.innerHTML + oUl.innerHTML;

        var iLeft = 0;
        var iSpeed = -3;

        // 定义变量存储iSpeed的值
        var iLastSpeed = 0;

        var oTimer = setInterval(fnMove,30);

        function fnMove(){
            iLeft += iSpeed;

            // 当移动到最左边的时候
            if(iLeft<-1000)
            {
                iLeft = 0;
            }

            // 当移动到最右边的时候
            if(iLeft>0){
                iLeft = -1000;
            }

            oUl.style.left = iLeft + 'px';
        }

        oLeft.onclick = function(){
            iSpeed = -3;
        }

        oRight.onclick = function(){
            iSpeed = 3;
        }

        // 定义鼠标移入事件
        oSlide.onmouseover = function(){
            iLastSpeed = iSpeed;
            iSpeed = 0;
            //clearInterval(oTimer);
        }

        // 定义鼠标移出事件
        oSlide.onmouseout = function(){
            iSpeed = iLastSpeed;
            //oTimer = setInterval(fnMove,30);
        }
    }       
</script>

HTML部分: 
<body>
    <div class="btns_con">
        <div class="left" id="btn01"><</div>
        <div class="right" id="btn02">></div>
    </div>
    <div class="list_con" id="slide">
        <ul id="list">
            <li><a href=""><img src="images/goods001.jpg" alt="商品图片"></a></li>
            <li><a href=""><img src="images/goods002.jpg" alt="商品图片"></a></li>
            <li><a href=""><img src="images/goods003.jpg" alt="商品图片"></a></li>
            <li><a href=""><img src="images/goods004.jpg" alt="商品图片"></a></li>
            <li><a href=""><img src="images/goods005.jpg" alt="商品图片"></a></li>
        </ul>
    </div>
</body>

四 . 变量作用域

变量作用域指的是变量的作用范围,javascript 中的变量分为全局变量和局部变量。

全局变量:在函数之外定义的变量,为整个页面公用,函数内部外部都可以访问。

局部变量:在函数内部定义的变量,只能在定义该变量的函数内部访问,外部无法访问。

<script type="text/javascript">
    // 定义全局变量
    var a = 12;
    function myalert()
    {
        // 定义局部变量
       // a = 12
        var b = 23;
        alert(a);
        // 修改全局变量
        a++;
        alert(b);
    }
    myalert(); // 弹出12和23
    alert(a);  // 弹出13    
    alert(b);  // 出错
</script>

五. 封闭函数

封闭函数是 javascript 中匿名函数的另外一种写法,创建一个一开始就执行而不用命名的函数。

一般定义的函数和执行函数:

function myalert(){
    alert('hello!');
};

myalert();

封闭函数:

(function(){
    alert('hello!');
})();

还可以在函数定义前加上“~”和“!”等符号来定义匿名函数

!function(){
    alert('hello!');
}()

封闭函数的作用

封闭函数可以创造一个独立的空间

在封闭函数内定义的变量和函数不会影响外部同名的函数和变量,可以避免命名冲突

在页面上引入多个 js 文件时,用这种方式添加 js 文件比较安全,比如:

var iNum01 = 12;
function myalert(){
    alert('hello!');
}

(function(){
    var iNum01 = 24;
    function myalert(){
        alert('hello!world');
    }
    alert(iNum01);
    myalert()
})()

alert(iNum01);
myalert();
正文完
 
Dustin
版权声明:本站原创文章,由 Dustin 2019-08-31发表,共计8613字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。