JavaScript基础——变量、循环、对象

JS基础

JS与DOM的关系

浏览器拿到DOM这棵树,将其渲染成html,加上各种漂亮的css,呈现给我们。

浏览器内部有一个js的解释器执行,我们在html里写一个js代码,js代码被引擎所执行,执行的结果,就是对DOM的操作,而对DOM的操作结果,就是我们常看到的特效,比如漂浮,变色。

javascript是操作dom,处理完dom,浏览器接着渲染,这样有了页面的变化。

DOM对对象——把body,div,p等节点树看成一个对象。

JS如何引入

1.页面内script代码

<script>
code......
</script>

2.引入外部js文件

<script src="./in.js"></script>

script标签在页面内的任意处都可以写,多段script代码的执行顺序是按引入顺序,逐段执行。

变量声明

JS的变量名由_,数字,字母,$组成,但是数字不能开头。用var 变量名来声明变量。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var A=3;
        var a=4;
        console.log(A,a);
        var $="hello world";
        console.log($);
    </script>
</head>
<body>
</body>
</html>

变量名区分大小写,A和a不是一个变量。不用var声明变量会污染全局变量。

变量类型

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //数值类型
        var a=3;
        var b=1.3;

        //字符串类型
        var c="hello";
        var d='world';

        //布尔型
        var e=true;

        //对象类型未定义为null
        var f=null;

        //原生类型未定义为undefined
        var g=undefined;

        //对象类型
        var h={name:"mike",'age':23};

        //数组,也是对象类型
        var arr=[2,'hello',true,h];

        //undefined
        var m;

        console.log(typeof b+":"+b)//number:1.3
        console.log(typeof e+":"+e);//boolean:true
        console.log(typeof f+":"+f);//object:null
        console.log(typeof g+":"+g);//undefined:undefined
        console.log(typeof h+":"+h);//object:[object Object]
        console.log(typeof arr+":"+arr);//object:2,hello,true,[object Object]
        console.log(typeof m+":"+m);//undefined:undefined
        console.log(h)//{name: "mike", age: 23}
        console.log(h.name);//mike
        console.log(h['name']);//mike
        console.log(arr[3]);//{name: "mike", age: 23}
    </script>
</head>
<body>
</body>
</html>

运行结果:

var的作用

var的本质:

var a=3:声明一个变量a并给它赋值3;

a=3:并没有声明一个新的变量,只是往它的外层寻找变量名为a的变量,并给它赋值3。(假设外层都没有声明a,那么会找到window上的变量a)

接下来我们看几个例子:

1.t2()中的str没有用var声明,找到了它的外层t1()中的str

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var str="ufo";
    function t1() {
        var str="china";
        function t2() {
            //此处没有用var声明一个新的str变量,而是往它的外层寻找是否有变量名为str的变量,给它赋值。
            // 这里找到了t1()中的str,所以这两个str引用的是同一个变量
            str="japan";
            console.log("t2():"+str)

        }
        console.log("t1():"+str)//执行到这里的时候,t2()还没有被执行到
        t2()
        console.log("t1():"+str);//执行到这里的时候,t2()已经执行过

    }
t1();
console.log("全局变量:"+str);//由于t2()修改的str是t1()中的str,所以全局中的str没有受到影响


    </script>
</head>
<body>
</body>
</html>

运行结果:

 

2.将t1()中的 var str="china"注释掉,那么t2()就找到了最外层的全局变量str

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var str="ufo";
    function t1() {
        //var str="china";
        function t2() {
            //此处没有用var声明一个新的str变量,而是往它的外层寻找是否有变量名为str的变量,给它赋值。
            // 这里找到了全局变量中的str,所以这两个str引用的是同一个变量
            str="japan";
            console.log("t2():"+str)

        }
        console.log("全局变量:"+str)//f2()还没有执行到
        t2()

    }
t1();
console.log("全局变量:"+str);//t2()修改了全局变量中的str
    </script>
</head>
<body>
</body>
</html>

运行结果:

3.把第一个例子t2()中的str="japan"用var来声明,那么它就不会去找外层的str,而是声明了一个新的变量,所以t1()中的str和全局变量str都不会受到影响。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var str="ufo";
        function t1() {
            var str="china";
            function t2() {
                //此处用var声明一个新的str变量,并给它赋值。
                // 所以这3个str都是不同的
                var str="japan";
                console.log("t2():"+str)

            }
            console.log("t1():"+str)//执行到这里的时候,t2()还没有被执行到
            t2()
            console.log("t1():"+str);//执行到这里的时候,t2()已经执行过

        }
        t1();
        console.log("全局变量:"+str);//t2()并没有修改任何其他地方的str


    </script>
</head>
<body>
</body>
</html>

运行结果:

 

window上定义的变量和全局变量的区别:

所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法,如:

var str="china" 可以用 window.str来访问结果也是"china"。那么两者定义的方式有什么区别呢?

window上的变量都是存在的,可以理解为都声明过,只是没有定义,如果访问它是undefined;但假如去访问一个没有声明过的变量,会报错。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var str="china";
        console.log(window.str)//打印出china
        function t1() {
            var str1="hello";
            console.log(window.str1)//由于这里的str1不是全局变量,所以不会成为window的属性
        }
        t1()

        console.log(window.str2);//undefined
        console.log(str2);//会报错
    </script>
</head>
<body>
</body>
</html>

运行结果:

 

运算符

1."+"

一旦碰到非法数字,后面的一律理解为字符串的拼接。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        console.log(2+3);
        console.log("hello"+" "+"world");
        console.log(2+3+4+"hello "+"world"+5+6);
    </script>
</head>
<body>
</body>
</html>

运行结果:

2."&&"

返回最早代表的false的那个值,如果全是true,那么返回最后一个值。

true:数值(除了0),字符串(包括"  ",不包括""),true

false:0,"",null

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var a=true;
        var b="hello";
        var c=6;
        var d=false;
        var e=null;

        console.log(a && e && d && c);
        console.log(a && b && c);
    </script>
</head>
<body>
</body>
</html>

运行结果:

3."||"

返回最早代表true的那个值,如果全都是false,则返回最后一个值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var a=true;
        var b="hello";
        var c=6;
        var d=false;
        var e=null;
        var f=0;
        var g="";

        console.log(d || f||a||b);
        console.log(d || f ||g|| e);

    </script>
</head>
<body>
</body>
</html>

运行结果:

循环结构

字符串,数组有length属性,可以用for循环遍历。

对象类型用for(k in person)的结构遍历,k遍历person的属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //字符串
        var string="hello world";
        for(var i=0;i<string.length;i++){
            console.log(string[i]);
        }

        //数组
        var arr=["hello",4,"world"];
        for(var i=0;i<arr.length;i++){
            console.log(arr[i])
        }

        //对象
        var person={name:"mike",age:10}
        for(var i in person){
            console.log(i+":"+person[i])
        }
    </script>
</head>
<body>
</body>
</html>

运行结果:

注意:对象中的属性可以用引号也可以不用引号,但是属性值如果是字符串的话一定要用引号。想要输出对象的属性值有“.”和"[]"两种方法,例如上面的代码"person.name","person['name']"都可以打印出"mike"。中括号里面的name加了引号,表示要打印的是属性名为"name"的属性值;如果不加引号,表示要打印的是属性名为变量name代表的字符串的属性值。所以上面循环遍历只能使用person[k],而不能使用person.k或者person["k"]。

JS对象

内置对象

所有事物都是对象。JavaScript提供多个内置对象,拥有属性和方法。如布尔型、数字型、字符串、日期、数组、正则表达式、甚至函数都可以看成是对象。对象的属性和方法可参考JavaScript 对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        var string="hello world";
        console.log(string.length);
        console.log(string.substr(2,3));
        console.log(string.substring(2,3));
        console.log(string.indexOf("llo"));//返回下标,没找到返回-1

        var arr=["春","夏","秋","冬"];
        console.log(arr.join("_"));
        console.log(string.split(" "))

        var date=new Date();
        console.log(date.getFullYear());

        console.log(Math.floor(3.7));//返回不大于3.7的最大整数
        console.log(Math.random());//返回[0,-1)
        console.log(5+Math.random()*10);//返回[5,15)
    </script>
</head>
<body>
</body>
</html>

运行结果:

window对象

window对象是浏览器宿主对象,和js语言无关。window对象的方法可参考JavaScript Window - 浏览器对象模型

1.window.alert("hello world");

 

2.window.confirm("你确定要删除文件么?")

3.window.prompt("请输入你的用户名","hello world")

4.window.close()//直接关闭该标签页
5.window.open("http://www.baidu.com")//新开一个百度的标签页
6.window.print();

window的子对象

1.navigator——浏览器信息对象

console.log(window.navigator)

2.location——地址栏对象

console.log(window.location)

window.location.href="http:/www.baidu.com";//改变href属性可以让网页跳转到百度的页面

3.history——历史对象 

console.log(window.history)

其中,有forward(),back(),go()等方法。

4.screen——屏幕对象

console.log(window.screen)

5.document——HTML文档对象

是html代码形成的对象,操作此对象,可动态的改变页面的内容。

猜你喜欢

转载自blog.csdn.net/linghuainian/article/details/81557889
今日推荐