JavaScript
變量鬆散類型的本質,決定了它只是在特定時間用於保存特定值的一個名字而已。因爲不存在定義某個變量必需要保存何種數據類型值的規則,變量的值及其數據類型能夠在腳本的生命週期內改變。javascript
JavaScript
變量分爲基本數據類型和引用類型。java
基本數據類型包括:Undefined
、Null
、Boolean
、Number
和String
函數
引用數據類型的值是保存在內存中的對象ui
定義一個基本數據類型與引用類型的值是相似的:建立一個變量併爲該變量賦值。對於引用類型的值,咱們能夠動態爲其添加屬性和方法,也能夠改變和刪除其屬性和方法。spa
var person = new Object();
person.name = "Nicholas";
alert(person.name); //"Nicholas"
複製代碼
對於基本數據類型,不可添加或刪除屬性、方法,儘管這不會致使任何錯誤。指針
var name = "Nicholas";
name.age = 27;
alert(name.age); //undefined
複製代碼
除了保存方式不一樣外,在從一個變量向另外一個變量複製基本數據類型和引用類型值時,也存在不一樣。code
若是從一個變量向另外一個變量複製基本數據類型的值,會在變量對象上建立一個新值,而後把該值複製到新變量分配的位置上。對象
當從一個變量向另外一個變量複製引用類型的值時,一樣也會將存儲在變量對象中的值複製一份放到爲新變量分配的空間中。不一樣的是,這個值的副本其實是一個指針,而這個指針指向存儲在堆中的一個對象。複製操做結束後,兩個變量實際上將引用同一個對象。所以,改變其中一個變量,就會影響另外一個變量。生命週期
ECMAScript
中全部函數的參數都是按值傳遞的。也就是說,把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另外一個變量同樣。而引用類型值的傳遞,則如同引用類型變量的複製同樣。ip
總之,訪問變量有按值訪問與按引用訪問兩種方式,而參數只能按值傳遞。
在向參數傳遞基本類型的值時,被傳遞的值會被複制給一個局部變量(即命名參數,就是arguments
對象中的一個元素)。在向參數傳遞引用類型的值時,會把這個值在內存中的地址複製給一個局部變量,所以這個局部變量的變化會反映在函數的外部。
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20,沒有變化
alert(result); //30
複製代碼
對於基本數據類型的檢測,可用typeof
操做符,可肯定一個變量是字符串、數值、布爾值,仍是undefined
。
var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();
alert(typeof s); //string
alert(typeof i); //number
alert(typeof b); //boolean
alert(typeof u); //undefined
alert(typeof n); //object
alert(typeof o); //object
複製代碼
對於引用類型的檢測,可用instanceof
操做符。若是變量是給定引用類型(根據它的原型鏈來識別鏈)的實例,那麼instanceof
操做符就會返回true
。
alert(person instanceof Object); // 變量 person 是 Object 嗎?
alert(colors instanceof Array); // 變量 colors 是 Array 嗎?
alert(pattern instanceof RegExp); // 變量 pattern 是 RegExp 嗎?
複製代碼
根據規定,全部引用類型的值都是 Object 的實例。所以,在檢測一個引用類型值和 Object 構造函數時,instanceof 操做符始終會返回 true。固然,若是使用 instanceof 操做符檢測基本類型的值,則該操做符始終會返回false,由於基本類型不是對象。