引用类型

    引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。

      对象是某个特定引用类型的实例。新对象是使用new操作符后跟一个构造函数创建的。
一、Object类型
创建Object实例的方式
<script type="text/javascript">
        var obj1 = new Object();
        obj1.name = 'xushuai';
        obj1.age = 23;
        var obj2 = {};
        obj2.name = 'dapang';
        obj2.age = 24;
        var obj3 = {
            name: 'xianggou',
            age: 22
        };
        alert(obj1.name + ' ' + obj3['name']);//xushuai xianggou
    </script>

二、Array类型
     ECMAScript数组的每一项可以保存任何类型的数据,其数组大小也是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。
     数组的大小并不只是只读的,还可以修改,当给数组的长度的赋值小于数组的实际长度,则后几项将被移除;如果大于实际长度,则多出的的初始值为undefined。
创建数组的方式
<script type="text/javascript">
        //第一种:使用Array构造函数
        var colors1 = new Array();
        colors1[0] = 'red';
        alert(colors1.length);//1
        var colors2 = new Array(15);
        colors1[0] = 'blue';
        alert(colors2.length);//15
        var colors3 = new Array('green', 'black');
        alert(colors3.length);//2
        //也可以省略new
        var colors4 = Array(3);
        alert(colors4.length);//3
        //第二种:数组字面量表示法
        var colors5 = ['red', 'blue', 'pink'];
        alert(colors5.length);//3
        var colors6 = [];
        alert(colors6.length);//0
    </script>

数组的length属性
      不仅可以获取,甚至可以设置

检测数组
<script type="text/javascript">
        var friends = ["zhuxiao", "xutao", "wangfeng"];
        alert(friends instanceof Array);//true
        alert(Array.isArray(friends));//true
    </script>

转换方法
<script type="text/javascript">
        var friends = ["zhuxiao", "xutao", "wangfeng"];
        alert(friends);//zhuxiao,xutao,wangfeng
        alert(friends.valueOf());//zhuxiao,xutao,wangfeng
        alert(friends.toLocaleString());//zhuxiao,xutao,wangfeng
        alert(friends.toString());//zhuxiao,xutao,wangfeng
        friends = {
            toLocaleString: function () {
                return 'zhuxiao';
            },
        };
        alert(friends.toLocaleString());//zhuxiao
    </script>

join方法,可以使用不同的分隔符来构建字符串

<script type="text/javascript">
        var friends = ["zhuxiao", "xutao", "wangfeng"];
        alert(friends.join('*'));//zhuxiao*xutao*wangfeng
    </script>

栈方法   

栈是一种后进先出的数据结构。
        push()方法----接收任意数量的参数,返回修改后数组的长度
        pop()方法----从数组末尾移除最后一项,返回移除的项

队列方法
队列是一种先进先出的数据结构。
        shift()方法----移除数组的第一个项,并返回该项
        unshift()方法-----在数组前端添加任意项,并返回新数组的长度
重排序方法
reverse()方法-----将数组反转
sort()方法----按升序排列数组项

sort()方法----还可以接收一个比较函数作为参数,以便指定哪一个值位于前面

<script type="text/javascript">
        function compare(value1, value2) {
            if (value1 < value2) {
                return 1;
            }
            else if (value1 > value2) {
                return -1;
            } else {
                return 0;
            }
        }
        var intArray = new Array(2, 6, 4, 5, 7);
        alert(intArray.sort(compare));//7,6,5,4,2
    </script>

操作方法

concat()方法---基于当前数据的所有项创建一个新数组,这个方法是先创建当前数组的一 个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的 数组
slice()方法----基于当前数组的一个或多个项创建一个新数组。该方法可以接受一个或两个 参数,即要返回项的起始和结束位置,但不包括结束位置的项
splice()方法----向数组的中部插入项,该方法始终都会返回一个数组,该数组包含删除的                                      项,如果没有,则返回空
位置方法-----以下两个方法返回的是查找的所在的位置
indexOf()
lastIndexOf()
迭代方法
every()方法
some()方法
filter()方法
forEach()方法
缩小方法
reduce()方法
reduceRight()方法
map()方法

对于数组的方法,即用即学,不必记住,只需了解它有哪些方法,可以做到什么。

三、Date类型
<script type="text/javascript">
        //要创建一个日期对象,使用new和Date构造函数
        var now1 = new Date();
        alert(now1);//Thu Mar 22 2018 13:36:01 GMT+0800 (中国标准时间)
        //要学会使用日期格式化方法以及日期/时间组件方法
        alert(now1.toDateString());//Thu Mar 22 2018
    </script>

四、Function类型

      函数实际上是对象,每个函数都是Function类型的一个实例,与其他引用类型一样具有属性和方法,因此函数名是指向函数对象的指针,不会与某个函数绑定。因此,使用不带括号的函数名是使用函数指针而非调用函数。由于函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没什么不同,一言蔽之,一个函数可能有多个名字。
<script type="text/javascript">
        //函数声明
        function sum() {
            var sum = 0;
            for (var i = 0; i < arguments.length; i++) {
                sum += arguments[i];
            }
            return sum;
        }
        alert(sum(2, 3, 4));//9
        alert(sum(6, 9));//15
        //函数表达式
        var total = function () {
            return arguments[0] + arguments[1];
        }
        alert(total(3, 4));//7
        var copy = total;
        alert(copy(4, 6));//10
    </script>

函数声明与函数表达式

       在加载数据时,解析器会先读取函数声明,使其在执行任何代码之前可用;对于函数表达式,则必须先等到解析器执行函数表达式,才能调用它。
     由于函数名本身就是变量,所以函数也可以作为值来使用,即可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。当然,我们也可以从一个函数中返回另一个函数,即在函数中嵌套另一个函数。


函数内部属性

在函数内部,有两个特殊对象:arguments,this(引用的是函数据以执行的环境)
   
arguments
       类数组,包含所有参数,它有一个重要属性callee:该属性是一个指针,指向拥有这个arguments对象的函数。
caller属性:保存调用当前函数的函数的引用,例如:如果A函数调用了B函数,则B.caller就指向A()

【示例】
<script type="text/javascript">
        function f() {
            if (arguments[0] <= 1) {
                return 1;
            } else {
                return arguments[0] * f(arguments[0] - 1);
            }
        }
        var f1 = f;
        f = function () {
            return 0;
        };
        alert(f(5));//0
        alert(f1(5))//0
    </script>
上述方式,函数与函数名紧密耦合,为了改变这种情况,我们需要做出改变:
<script type="text/javascript">
        function f() {
            if (arguments[0] <= 1) {
                return 1;
            } else {
                return arguments[0] * arguments.callee(arguments[0] - 1);
            }
        }
        var f1 = f;
        f = function () {
            return 0;
        };
        alert(f(5));//0
        alert(f1(5))//120

函数属性和方法

 length:获取函数参数的个数
 prototype:保存函数实例的方法,即诸如toString()等方法实际上是保存在prototype名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype的属性极其重要。

每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
apply()方法
      该方法接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array的实例,也可以是arguments对象
【示例】
<script type="text/javascript">
        function sum(n1, n2) {
            return n1 + n2;
        }
        function sum1(n1, n2) {
            return sum.apply(this, arguments);
        }
        function sum2(n1, n2) {
            return sum.apply(this, [n1, n2]);
        }
        alert(sum1(2, 4));//6
        alert(sum2(2, 4));//6
    </script>
call()方法
        在使用该方法时,第一个参数没有变化,第二个必须将参数逐个列举出来。
【示例】
<script type="text/javascript">
        function sum(n1, n2) {
            return n1 + n2;
        }
        function sum1(n1, n2) {
            return sum.call(this, n1,n2);
        }
        alert(sum1(2, 4));//6
    </script>

事实上,传递参数并非apply()和call()真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。
【示例】
<script type="text/javascript">
        window.color = 'red';
        var o = { color: 'blue' };
        function showColor() {
            alert(this.color);//由于处在全局作用域中,所以this指window
        }
        showColor();//red
        showColor.call(this);//red,this指的全局作用域
        showColor.call(window);//red,this指的是全局作用域,window属于全局变量
        showColor.call(o);//blue,此时函数的执行环境不是全局作用域了,函数体内的this此时指向o
    </script>

bind()方法,该方法会创建一个函数的实例,其this值会被绑定到传给bind()函数的值
【示例】
<script type="text/javascript">
        window.color = 'red';
        var o = { color: 'blue' };
        function showColor() {
            alert(this.color);//由于处在全局作用域中,所以this指window
        }
        var sayColor = showColor.bind(o);//此时this指向o
        sayColor();//blue
    </script>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值