Js基礎知識之----數據類型概述


1、js數據類型: 

js數據類型分爲六大類,原始數據類型(基本數據類型)和引用數據類型es6

⑴ js基本數據類型 (五種):
①number ②string ③null ④undefined ⑤boolean
⑵js引用數據類型:
對象Object: function, Array Date等等

解釋:

1. 原始數據類型是按照值進行訪問的, 存儲在棧區裏, 賦值是以拷貝賦值
2. 引用數據的值是保存在堆區裏,其實操做的是引用數據的地址,地址是保存在棧空間裏,賦值其實拷貝賦值其地址


舉例:

//1, 基本數據類型:
var a = 10;
b = a;
a = 20;
console.log(b);
//輸出結果爲10, 由於基本數據類型進行賦值是拷貝賦值,a的值賦給b,是將a的值拷貝一份給b

//2, 引用數據類型:
var a = {
    name: "張三"
}
var b = a;
a.name = "李四";
console.log(b.name);
//輸出結果爲 李四 ,由於引用數據類型賦值是進行地址拷貝賦值, a的地址賦給b, b也指向a的地址,二者如今指向的是同一個地址, a的屬性name值改變後,b也會隨之而改變

var a = [1,2,3];
var b = a;
a = [4,5,6];
console.log(b);  // [1,2,3]
console.log(a); // [4,5,6]
//分析: a是一個數組,因此是引用數據類型,棧區存儲的是其地址,堆區裏存儲的是值,當b=a的時候,是將a的地址複製給了b,因此此時b與a指向同一地址,當a從新賦值爲[4,5,6]時,
a此時在堆空間裏指向發生改變了,指向的是[4,5,6]了,而b依然是[1,2,3]複製代碼

2、數據類型的判斷:

判斷一個變量的數據類型,主要有三大方法:typeof, instanceof, Object.prototype.toString()
⑴typeof方法通常是用來判斷一個值是數據哪一種基本數據類型

typeof "你好";  // string
typeof true; // boolean
typeof 10; // number
typeof undefined; // undefined

// 如下三種其實都屬於引用數據類型,對象的子類,可是typeof不能準確的判斷其具體的類型
typeof null // object 是對象,可是不能具體是哪個
typeof Function //function 函數,此時typeof能夠判斷其具體類型
typeof [] // object,數組判斷的是對象
typeof {} // object, 對象判斷的是對象複製代碼

由上可見, typeof並不能準確的判斷數據類型
⑵instanceof方法能夠對對象類型進行判斷

[] instanceof Array; //true
{} instanceof Object //true
console.log((()=>{}) instanceof Function); //true 注: ()=>{} 是es6中的語法,至關於function(){}函數複製代碼

因而可知, instanceof返回值是boolean值, 能夠判斷其具體類型是否屬於後者,可是也不是萬能的
好比:

let arr = [];
let obj = {};
arr instanceof Array; // true
arr instanceof Object // true
obj instanceof Object // true複製代碼

 由上可見, instanceof也不能準確的判斷對象類型, arr數組由於也是對象的子類型,其原型也是指向對象的,因此判斷其數組爲true 對象也爲true數組

在這個例子中,arr 數組至關於 new Array() 出的一個實例,因此 arr.__proto__ === Array.prototype,又由於 Array 屬於 Object 子類型,即 Array.prototype.__proto__ === Object.prototype,因此 Object 構造函數在 arr 的原型鏈上。因此 instanceof 仍然沒法判斷優雅的判斷一個值到底屬於數組仍是普通對象。
⑶Object.prototype.toString() 方法能判斷數據的具體類型

console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(()=>{})); // [object Function]
console.log(Object.prototype.toString.call("")); // [object String]
console.log(Object.prototype.toString.call(123)); // [object Number]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]複製代碼

咱們能夠發現該方法在傳入任何類型的值都能返回對應準確的對象類型。用法雖簡單明瞭,但其中有幾個點須要理解清楚:
  • 該方法本質就是依託Object.prototype.toString() 方法獲得對象內部屬性 [[Class]]
  • 傳入原始類型卻可以斷定出結果是由於對值進行了包裝
  • null 和 undefined 可以輸出結果是內部實現有作處理.
相關文章
相關標籤/搜索