原文連接javascript
一個變量能夠存放兩種類型的值,基本類型的值(primitive values)和引用類型的值(reference values)。html
ES6 引入了一種新的原始數據類型 Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是:Undefined、Null、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。java
JavaScript 中共有 6 種基本數據類型:Undefined
、Null
、Boolean
、Number
、String
、Symbol (new in ES 6)
!git
約定:基本數據類型
與原始數據類型
等意。github
基本數據類型的值是按值訪問的。編程
基本類型的值是不可變的segmentfault
var str = "123hello321"; str.toUpperCase(); // 123HELLO321 console.log(str); // 123hello321
基本類型的比較是它們的值的比較編程語言
var a = 1; var b = true; console.log(a == b); // true console.log(a === b); // false
上面 a 和 b 的數據類型不一樣,可是也能夠進行值的比較,這是由於在比較以前,自動進行了數據類型的 隱式轉換
。函數
==
: 只進行值的比較this
===
: 不只進行值得比較,還要進行數據類型的比較
基本類型的變量是存放在棧內存(Stack)裏的
var a,b; a = "zyj"; b = a; console.log(a); // zyj console.log(b); // zyj a = "呵呵"; // 改變 a 的值,並不影響 b 的值 console.log(a); // 呵呵 console.log(b); // zyj
圖解以下:棧內存中包括了變量的標識符和變量的值
除過上面的 6 種基本數據類型外,剩下的就是引用類型了,統稱爲 Object 類型
。細分的話,有:Object 類型
、Array 類型
、Date 類型
、RegExp 類型
、Function 類型
等。
引用類型的值是按引用訪問的。
引用類型的值是可變的
var obj = {name:"zyj"}; // 建立一個對象 obj.name = "percy"; // 改變 name 屬性的值 obj.age = 21; // 添加 age 屬性 obj.giveMeAll = function(){ return this.name + " : " + this.age; }; // 添加 giveMeAll 方法 obj.giveMeAll();
引用類型的比較是引用的比較
var obj1 = {}; // 新建一個空對象 obj1 var obj2 = {}; // 新建一個空對象 obj2 console.log(obj1 == obj2); // false console.log(obj1 === obj2); // false
由於 obj1 和 obj2 分別引用的是存放在堆內存中的2個不一樣的對象,故變量 obj1 和 obj2 的值(引用地址)也是不同的!
引用類型的值是保存在堆內存(Heap)中的對象(Object)
與其餘編程語言不一樣,JavaScript 不能直接操做對象的內存空間(堆內存)。
var a = {name:"percy"}; var b; b = a; a.name = "zyj"; console.log(b.name); // zyj b.age = 22; console.log(a.age); // 22 var c = { name: "zyj", age: 22 };
圖解以下:
棧內存中保存了變量標識符和指向堆內存中該對象的指針
堆內存中保存了對象的內容
typeof:常常用來檢測一個變量是否是最基本的數據類型
var a; typeof a; // undefined a = null; typeof a; // object a = true; typeof a; // boolean a = 666; typeof a; // number a = "hello"; typeof a; // string a = Symbol(); typeof a; // symbol a = function(){} typeof a; // function a = []; typeof a; // object a = {}; typeof a; // object a = /aaa/g; typeof a; // object
instanceof:用來判斷某個構造函數的 prototype 屬性所指向的對象是否存在於另一個要檢測對象的原型鏈上
簡單說就是判斷一個引用類型的變量具體是否是某種類型的對象
({}) instanceof Object // true ([]) instanceof Array // true (/aa/g) instanceof RegExp // true (function(){}) instanceof Function // true
更詳細的類型檢測請看參考資料!
有錯誤的地方,歡迎你們指出來!
【文章】[ JS 進階 ] 基本類型 引用類型 簡單賦值 對象引用(推薦)
【Stack Overflow】Javascript by reference vs. by value
【文章】[[JS] 讓人犯暈的JavaScript變量賦值](http://hellobug.github.io/blo...
【文章】如何檢查JavaScript變量類型?(推薦)
【文章】Stack的三種含義