首頁 >web前端 >js教程 >對JavaScript的引用型別講解

對JavaScript的引用型別講解

巴扎黑
巴扎黑原創
2017-07-23 15:50:491507瀏覽

Object類型

 1 //创建方式一 2 var person = new Object(); 3 person.name = "jack"; 4 person.age = 12; 5  6 //创建方式二 7 var person = { 8       name:"jack", 9       age:1210 }11 //创建空对象12 var person = {};//与new Object()相同13 14 //访问方式15 person["name"];  jack16 person.name;  jack17 //以上两种方式区别在于使用中括号方式可以通过变量访问18 var propertyName="name";19 person[propertyName];  jack20 person["first name"] = "jack";//如果属性名有空格

Array類型  

//定义var array = new Array();var array2 = new Array("a","b","c");var array3 = ["a","b","c"];//修改array3[2] = "d";//array3:a,b,d//新增array3[3] = "d";//array3:a,b,c,darray3[length] = "d";//array3:a,b,c,d第二种新增方式//末尾删除元素//数组的length属性不是只读的,所以通过改变length可以从数组末尾移除array3.length=3;//array3:a,b,c

#偵測陣列:確定一個值是哪一種基本型別(Undefined,Null,Boolean,Number,String)使用typeof運算子,決定一個值是哪一種參考型別使用instanceof操作符。

之所以Array中新增了Array.isArray()方法,是因為instanceof運算子是在只有一個全域執行環境的情況下;如果包含多個框架,那就存在兩個以上不同的全域環境,就存在兩個以上的不同版本的Array建構子。 堆疊方法(LIFO):Array透過push(接收任意數量的參數,逐一加入陣列結尾)和pop(從陣列結尾移除最後一項,並減少length值,返回移除的項)兩個方法可以實現類似堆疊的行為。

佇列方法(FIFO):Array透過shift(從陣列前端取得項目)和push或unshift(在陣列前端新增任意個項目並傳回新陣列的長度)和pop兩種都能實現模擬隊列的形式。

重新排序方法:reverse(反轉數組項的順序);sort(實作排序,接收一個自訂函數,透過負數,0,正數)

    操作方法
  1. :concat(基於接收的參數加入副本陣列中,並傳回陣列的副本);slice(傳回起始和結束位置之間的項,但不包含結束位置的項);

  2.      splice()方法:可以刪除任意數量的項splice(0,2)會刪除前兩項(要刪除第一項的位置和要刪除的項目數);可在指定位置插入多個項目;可在指定位置插入任意數量的項                                 
  3. 位置方法
  4. :ECMAScript 5為陣列實例新增了兩個位置方法:indexOf()和lastIndexOf()

  5. #迭代方法

  6. every():接收一個函數,如果對於陣列每一項都傳回true,結果會傳回true。

some():接收一個函數,如果對於陣列中有傳回true的項,結果就回傳true,注意與every區別。

filter():接收一個函數,傳回滿足條件也就是true的項。

forEach():對陣列中每一項執行給定的函數。

map():執行給定的函數,傳回每次函數呼叫的 結果組成的陣列。

歸併方法

:reduce(從陣列第一項開始)和reduceRight(從陣列最後一項開始)。

Function類型

函數其實是對象,每個函數都是Function類型的實例,都與其他參考型別一樣具有屬性和方法。因此函數名其實也是一個指向函數物件的指標。
###
 1 //使用函数声明语法定义 2 function sum(num1,num2) 3 { 4      return num1+num2;          
 5 } 6 //使用函数表达式定义,注意结尾要加分号 7 var sum = function(num1,num2) 8 { 9     return num1+num2;10 };
######函數聲明與函數表達式是有區別的,解析器在向執行環境加載資料時,會率先讀取函數聲明,並使其在執行任何程式碼之前可以存取;而函數表達式則需要等到解析器執行到它所在的程式碼行才會真正被解釋執行,也就是說函數表達式要寫在呼叫函數程式碼的前面。 ######函數可以當作值來使用,既可作為參數也可作為傳回值,如下例:######
//根据属性名来创建一个比较函数,来指明按照哪个属性来排序function createComparisonFunction(propertyName)
{return function(object1,object2)
     {         var value1 = object1[propertyName];         var value2 = object2[propertyName];         
         if(value1<value2){             return -1;
         }else if(value1<value2){             return 1;
         }else{ 
             return 0;
         }
     }
}    
//利用数组data调用sort()方法data.sort(createComparisonFunction("name"));
######函數內部屬性:######在函數內部,有兩個特殊物件:arguments和this。 arguments的主要用途是保存函數參數,其中有個callee的屬性,該屬性是一個指針,指向擁有這個arguments物件的函數。 ######
//简单的递归算法,但是函数内部的执行和函数名factorial耦合在一起function factorial(num)
{if(num<=1)
    {return 1;
    }else{return num*factorial(num-1);
    }
}//利用arguments.callee解决function factorial(num)
{if(num<-1){return 1;
    }else{return num*arguments.callee(num-1);
    }
}
######另外一個函數物件的屬性是:caller。其保存著調用當前函數的函數的引用。也就是誰呼叫的函數,caller就把它的引用保存下來。 ######
function outer()
{
   inner();
}function inner()
{
   alert(inner.caller);//弹出outer()函数的源代码
   alert(arguments.callee.caller);//和上一句一样}
###

函数属性和方法:

每个函数都包含两个属性:length(函数接收的命名参数的个数)和prototype。

每个函数都包含两个非继承而来的方法:apply()和call(),在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。apply()接收两个参数,一个在其中运行函数的作用域,拎一个是参数数组(可以是array或arguments对象)。call()第一个参数和apply一样,后面必须明确传入每个参数。除了用法不同其他的没什么不同。另外他们真正强大的地方是能够扩充函数赖以运行的作用域。

function sum(num1,num2)
{     return num1+num2;  
}
sum.apply(this, [num1,num2] );
sum.call(this,num1, num2);//扩充函数作用域window.color = "red";var o = {color:"blue"};function showColor(){
    alert(this.color);
}

showColor();//redshowColor.call(this);//redshowColor.call(window);//redshowColor.call(o);//blue

也可以使用bind()方法。

 

基本包装类型


为了便于操作基本类型值,ECMAScript引入3个特殊的引用类型:Boolean,Number,String。所谓包装类型,就是将基本类型包装起来,放一些操作方法和属性等。

每当读取一个基本类型值的时候,后台就会创建与一个对应的基本包装类型的对象,从而能让我们可以调用某些方法操作这些数据。

var s1 = "some text";var s2 = s1.substring(2);//后台内部相当于如下代码var s1 = new String("some text");var s2 = s1.substring(2);
s1 = null;

当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值,读取模式访问字符串时,后台都会自动完成下列处理:

  1. 创建String类型的一个实例。

  2. 在实例上调用指定的方法。

  3. 销毁这个实例。

引用类型与基本包装类型的主要区别就是对象的生存期。使用new 操作符在执行流离开当前作用域之前一直保存在内存中。而自动创建的基本包装类型的对象,则只存在一行代码的执行瞬间,然后立即销毁。

单体内置对象

内置对象:

由ECMAScript实现提供的,不依赖于宿主环境的对象,程序执行之前就已经存在,比如:Object,Array和String。另外还有Global和Math。

Global对象:

  • URI编码方法:通过encodeURI()和encodeURICOMponent()方法对URI进行编码,以便发送给浏览器。区别在于第一个不会对本身属于URI的特殊字符进行编码,例如冒号,正斜杠,问号和井号。而另一个则会对它发现的任何非标准字符进行编码。与这两个方法对应的是:decodeURI(只能对使用encodeURI()替换的字符进行解码)和decodeURIComponent(针对encodeURIComponent()编码的字符)。

  • eval()方法像是一个解析器。比如eval("function say(){  alert(' Hi '); }");但是创建的任何变量或者函数都不会被提升,只有在eval执行时候才创建。

  • window对象,全局作用域中声明的所有变量和函数,都成为了window对象的属性。

 

以上是對JavaScript的引用型別講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn