20180605-前端学习日志-JavaScript之函数数组与对象

一、函数

1.函数是一段代码,基本格式为function fun_name(){ }和function fun_name(a,b){ }。

2.var f = new Function("x","y","return x*y");等价于function f(x,y){return x*y;}。

3.函数可以进行嵌套,一个函数可以作为参数传入到另一个函数,如function add(a,b){return a+b;} function cal(f,a,b){return f(a,b);}然后可以使用cal(add,5,6)调用。

4. 关于函数变量空间:定义在任何函数之外的变量属于全局变量,在整个网页中全部有效;而定义在某个函数内部的变量属于局部变量,只在函数内部有效。当局部变量有和全局变量一样的变量时,采用局部变量。

    <script>
        function max(a, b) {
            return a > b ? a : b;
        }
        var u = 42;
        var v = 24;
        function print(s) {
            document.write(s);
        }
        function println(s) {
            print(s + "<br>");
        }
        function gcd(u, v) {
            var a = u;
            var b = v;
            var temp = v;
            while (v != 0) {
                temp = u % v;
                u = v;
                v = temp;
            }
            // alert(a + "和" + b + "的最大公约数是" + u);
            println(a + "和" + b + "的最大公约数是" + u);
        }
        gcd(42, 21);
        gcd(12, 67);
        println(max(42, 21));
    </script>

二、数组

1.数组的几种格式有:

var a = new Array();
var b = new Array(size);
var c = new Array(d1,d2,...,dn);
var d = [d1,d2,...,dn]

其中:[]可以访问一个数组单元、a[0]可读可写,索引从0开始。a[x]=n代表创建数组中一个单元x并赋值为n。

2. a.length代表数组长度,是其中最大的下标加一。

3. .length长度可写。如下

    <script>
        var colors = ["red", "blue", "green"];
        colors.length = 2;
        alert(colors[2]);
    </script>

这里自定义长度为2,第三个元素green被挤掉。于是colors[2]代表的第三个元素由于未定义,运行结果应为undefined。

    <script>
        var colors = ["red", "blue", "green"];
        colors.length = 4;
        alert(colors[3]);
        colors[colors.length] = "black";
        colors[colors.length] = "brown";
    </script>

这里自定义长度是4,但是第四个还是没有赋值,结果仍为undefined。后面两个colors.length分别都在原来数组的基础上添加了一组元素(先加了black,后加了brown。最终数组长度是6),增加了代码的可扩展性。

4. 还有一些对数组的操作,toString和valueOf都是转换数组为字符串输出(产生字符串),join里面添加的是分隔符。

    <script>
        var colors = ["red", "blue", "green"];
        colors.length = 4;
        alert(colors[3]);
        colors[colors.length] = "black";
        colors[colors.length] = "brown";
        alert(colors.toString()); //产生字符串
        alert(colors.valueOf()); //产生字符串
        alert(colors);
        alert(colors.join(",")); //分隔符为,
        alert(colors.join("||"));//分隔符为||
    </script>

5. 数组堆栈操作

堆栈操作即为像往一个只有一个出口的瓶子里面放东西一样,遵循先进后出,后进先出的规则。

    <script>
        var colors = new Array();
        var count = colors.push("red","green"); //push进两个元素
        alert(count);  //2
        count = colors.push("black"); // push进一个black
        alert(count); //3
        var item=colors.pop();  //pop出最后的元素
        alert(item); //black
        alert(colors.length); //恢复为2
    </script>

6. 数组队列操作

此种方式遵循先进先出的原则,和排队一样。

    <script>
        var colors = new Array();
        var count = colors.push("red","green");
        alert(count);
        count = colors.push("black");
        alert(count);
        var item = colors.shift(); //队列操作
        alert(item); //先出red
        alert(colors.length); //长度2
    </script>

7. 排序操作

从小到大排序sort;倒序排序reverse。此处要注意直接使用sort时是按照unicode的顺序来的,想要正常排序要创建排序函数sortNumber。

<script>
        function sortNumber(a, b) {
            return a - b; //
        }
        var values = [0, 1, 15, 5, 10];
        var me = values.slice(0); //相当于克隆了代码
        // function gettime() {
        //     var myDate = new Date();
        //     return myDate.getTime();
        // }
        // var start = gettime();
        values.sort();
        document.write(values + "<br>");//0,1,10,15,5注意Unicode顺序
        values.sort(sortNumber);
        document.write(values + "<br>");//0,1,5,10,15
        me.reverse();
        document.write(me + "<br>");//10,5,15,1,0
        // var end = gettime();
        // var time = end - start;
        // document.write(time+"<br>");
    </script>

另一个从大到小的排序:

    <script>
        function compare(value1, value2) {
            if (value1 < value2) {
                return 1;
            } else if (value1 > value2) {
                return -1;
            } else {
                return 0;
            }
        }
        var values = [0, 5, 1, 10, 15];
        values.sort(compare);
        alert(values);//15,10,5,1,0
    </script>

8. 数组操作

  • 连接:concat 
  • 截取:slice
        colors2 = colors.concat("yellow", ["black", "brown"]); //连接
        colors3 = colors.slice(1, 4); //截取1-4
  • splice(开始位置,删除个数,插入元素)
        splice(0, 2); //删除
        splice(2, 0, "red", "green");//插入两个数组元素
        splice(2, 1, "red", "green");//替换

三、对象

对象是JavaScript中的一种复合数据类型,可以把多个数据集中到一个变量中,并且给其中的每个数据起名字。换言之,对象是一个属性集合,每个属性都有自己的名字和值。

格式如下:var o = new Object(); //空的对象

var ciclr = { x : 0, y:0, radius :2};

1. 访问对象属性(通过运算符)

如:

    var book = new Object(); 
    book.title = "HTML5学习"
    book.translator = "楚留香";
    book.chapter1 = new Object();
    book.chapter1.title = "HTML5简介"

即使构造的时候不存在的属性也可以在之后随时增加。

2. 删除对象属性

delete book.chaspter1;或者book.chapter1 = null;

3. 遍历所有属性

for (var x in o)

    <script>
        var o = new Object();
        o.name = "Jack Chu";
        o.age = 20;
        o.salary = 300;
        for (var x in o) {
            // alert(x); 错误,会显示元素名
            // alert(o[x]);
            alert(x + "=" + o[x]);
        }
    </script>

4. 构造方法

  • 构造函数

        1. 不能直接制造对象;

        2. 通过this来定义成员;

        3. 没有return;

    <script>
        function Rect(w, h) {
            this.width = w; this.height = h;
            this.area = function () {
                return this.width * this.height;
            };
        }
        var r = new Rect(5, 10); alert("长方形的面积是" + r.area());
        r.width = 10; alert("长方形的面积变成了" + r.area());
    </script>

只定义了构造函数就可以构造任意数量的对象。

  • 原型对象

        1. prototype属性制定了他的原型对象,可以用 “ . ”运算符直接读它的的原型对象的属性。

        2. 档写这个属性时才在它自己内部产生实际的属性。

<script>
    function Person() {
    }
    Person.prototype.name = "Jack";
    Person.prototype.age = 20;
    Person.prototype.job = "Software Engineer";
    Person.prototype.sayName = function () {
        alert(this.name);
    };
    var person1 = new Person();
    // person1.sayName(); //Jack
    var person2 = new Person();
    // person2.sayName(); //Jack
    // alert(person1.sayName == person2.sayName); //true
    person1.name="Chu";
    alert(person1.name);//Chu  from instance
    alert(person2.name);//Jack  from prototype
</script>

关于prototype的更多解释如下:

JS中的protype和Java的继承不是一个概念的。Java中的继承是类继承,而JS中是没有类的,只有对象(哪怕ES6中有class语法也是一种语法糖,不是真正的‘类’)。

JavaScript 中的对象有一个特殊的 [[Prototype]] 内置属性,表示对其他对象的引用。几乎所有的对象在创建时 [[Prototype]] 属性都会被赋予一个非空的值。 

比如一个对象
var a = {
 b:1
}
当进行a.b操作的时候会触发对象的[[GET]]操作,这个操作会检查对象是否有这个属性,有就使用没有就到 [[Prototype]] 属性上去查找,一层层查找上去直到[[Prototype]] 为空,这就是原型链的概念。
prototype只保留了对原型链上属性和方法的引用,你可以理解成通过它可以访问自身和原型链上属性或方法,但其实本身对象上的只是一个指针,并不拥有这些属性
在Java中类被实例化,会把把类的行为复制到对象中,但是原型继承并不会复制对象属性,而是相当于在两个对象中创建一个关联,这样一个对象可以顺着原型链查找到另一个对象的属性或方法
    <script>
        function Person(name, age, job) {
            this.name = name;  //代表不共享,是自己的
            this.age = age;
            this.job = job;
            this.friends = ["Jack", "Martin"];
        }
        Person.prototype = {
            constructor: Person,
            sayName: function () {
                alert(this.name);
            }
        };
        var person1 = new Person("Nics", 29, "Software Engineer");
        var person2 = new Person("Ian", 32, "Doctor");
        person1.friends.push("Marry");
        alert(person1.friends);
        alert(person2.friends);
        alert(person1.friends == person2.friends);//false
        alert(person1.sayName == person2.sayName);//true
    </script>




猜你喜欢

转载自blog.csdn.net/weixin_40582630/article/details/80584309