首頁  >  文章  >  web前端  >  JavaScript型別系統之基本資料型別與包裝型別_javascript技巧

JavaScript型別系統之基本資料型別與包裝型別_javascript技巧

WBOY
WBOY原創
2016-05-16 15:21:421465瀏覽

寫在前面的話

  javascript的資料型別可以分為兩種:原始型別與參考型別

  原始類型也稱為基本類型或簡單類型,因為其佔據空間固定,是簡單的資料段,為了便於提升變數查詢速度,將其儲存在堆疊(stack)中(按值存取)。其中,javascript基本資料型別包括Undefined、Null、Boolean、Number和String五種

  參考類型由於其值的大小會改變,所以不能將其存放在堆疊中,否則會降低變數查詢速度,因此其儲存在堆疊(heap)中,儲存在變數處的值是一個指針,指向儲存物件的記憶體處(按址存取)

  [注意]對於引用類型的值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法;但基本類型不可以添加屬性和方法

Undefined

  Undefined型別只有一個值,就是undefined。當宣告的變數未初始化時,該變數的預設值是undefined

var test;//undefined
console.log(test == undefined);//true
var test = undefined;//undefined 

  對於尚未聲明過的變數只能執行一項操作,使用typeof操作符檢測其資料類型,但嚴格模式下會導致錯誤

typeof(test);//undefined

出現場景

  [1]已宣告未賦值的變數

  [2]取得物件不存在的屬性

  [3]無回傳值的函數的執行結果

  [4]函數的參數沒有傳入

  [5]void(expression)

型別轉換

  Boolean(undefined):  false
  Number(undefined):  NaN
  String(undefined):  'undefined'

Null

  Null型別只有一個值,就是null。邏輯角度看,null值表示一個空對象指針,如果定義的變數將用於保存對象,最好將該變數初始化為null。實際上undefined值是衍生自null值的,所以undefined == null

  [注意]null是空對象指針,而[]是空數組,{}是空對象,三者不相同

console.log(null == undefined);//true 

出現場景

  物件不存在時

型別轉換

  Boolean(null):   false
  Number(null):   0
  String(null):    'null'

  [注意]因為undefined和null不是構造器類型,所以不能加入自訂屬性

包裝類型

  包裝類型是特殊的引用型。每當讀取一個基本類型值的時候,後台就會建立一個對應的基本包裝類型的對象,這可能會呼叫一些方法來操作這些資料。包裝種類共包含Boolean、Number和String三種

var s1 = 'some text';
var s2 = s1.substring(2);
//在上述过程中,实际上发生了三个步骤
var s1 = new String('some text'); //(1)创建String类型的一个实例 
var s2 = s1.substring(2); //(2)在实例上调用指定的方法
s1 = null; //(3)销毁这个实例 

  [注意]引用類型和基本包裝類型的主要區別是物件的生存期。使用new運算元建立的參考類型的實例,在執行流離開目前作用域之前都一直保存在記憶體中。而自動建立的基本包裝類型的對象,則只存在於一行程式碼的執行瞬間,然後立即被銷毀。這意味著不能在運行時為基本類型值添加屬性和方法

var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined 

建立方式

明確建立包裝類型共兩種方式:

  [1]Object方式[不建議使用]

var s = new Object('abc');
var b = new Object(true);
var n = new Object(123); 

  [2]建構函式方式[不建議使用]

var s = new String('abc');
var b = new Boolean(true);
var n = new Number(123); 

  [注意]使用new呼叫基本包裝類型的建構子與直接呼叫同名的轉型函數是不一樣的

var value = '25';
var number = Number(value);
console.log(typeof number);//number
var obj = new Number(value);
console.log(typeof obj);//object 

Boolean

  Boolean类型只有两个值:true 和 false。Boolean包装类型是与布尔值对应的引用类型,在布尔表达式中使用Boolean对象容易造成误解

出现场景

  [1]条件语句导致系统执行的隐士类型转换

  [2]字面量或变量定义

类型转换

  Number(true): 1     ||   Number(false) : 0
  String(true):'true'     ||   String(false):'false'

Boolean()

  Boolean(undefined):false
    Boolean(null):false

  Boolean(非空对象包括空数组[]和空对象{}):true

  Boolean(非0): true || Boolean(0和NaN):false

  Boolean(非空包括空格字符串):true || Boolean(''):false

  [注意]true不一定等于1,false也不一定等于0

包装类型继承的方法

  valueOf():返回基本类型值true 或 false

  toString()和toLocaleString():返回字符串'true' 或'false'

console.log(typeof true.valueOf(),true.valueOf());//boolean true
console.log(typeof false.valueOf(),false.valueOf());//boolean false
console.log(typeof true.toString(),true.toString());//String 'true'
console.log(typeof false.toString(),false.toString());//String 'false'
console.log(typeof true.toLocaleString(),true.toLocaleString());//String 'true'
console.log(typeof false.toLocaleString(),false.toLocaleString());//String 'false' 

Number

  javascript只有一种数字类型,既可以表示32位的整数,还可以表示64位的浮点数

  关于Number类型的详细信息移步到此

String

  String类型是javascript中唯一没有固定大小的原始类型

下面接着来理解下JavaScript基本数据类型的包装对象

现象:为什么可以对字符串的操作采用对象的表示法?

例如:          

var s    = "this is a String";
      var len   = s.length; 

解析:

JavaScript三个基本数据类型都有相应的对象类;分别为Sring,Number,Boolean类;
JavaScript可以灵活的将一种类型的值转换为另一种类型;
当我们在对象环境中使用字符串时,即当我们试图访问这个字符串的属性或方法时;
JavaScript会为这个字符串值内部地创建一个String包装对象;
String对象会暂时代替原始的字符串值,完成我们的访问;
这个被内部创建的String对象是瞬间存在的,它的作用是使我们可以正常访问属性和方法;
String对象在使用过后会被系统丢弃掉;
而原始值并不会被改变;

    以上同样适用于数字和布尔值类型;

    使用Object()函数,任何数字、字符串、布尔值都可以转换为它对应的包装对象;

    例如:

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