js的基本資料型別和引用資料型別的相關問題

2021-10-04 10:07:04 字數 3653 閱讀 6930

一、字面量的賦值問題

var a = 1;

var b = a;

console.log(a); // 1

b = 2;

console.log(a); // 1

console.log(b); // 2

var b=a 時,建立了乙個新的記憶體位址儲存變數b和值,所以修改b的值不會影響a的值。

二、引用資料型別

var obj = 

console.log(obj.age); // 18

var obj2 = obj;

obj2.age = 20;

console.log(obj.age); // 20

console.log(obj2.age); // 20

在引用資料型別中,物件是存在於記憶體位址的堆中,變數是在棧中,變數所存的值是物件的記憶體位址,也就是說變數指向物件,所以var obj2=obj 是將物件的記憶體位址給了obj2,obj2和obj指向同乙個物件,所以通過修改obj2修改age,obj.age也會被修改.

三、檢測資料型別的方式

1.typeof

function fun() 

console.log(typeof 10); // number

console.log(typeof 'abc'); // string

console.log(typeof true); // boolean

console.log(typeof undefined); // undefined

console.log(typeof null); // object

console.log(typeof [1, 2, 3]); // object

console.log(typeof ); // object

console.log(typeof /^abc$/gim); // object

console.log(typeof fun) // function

注意:console.log(typeof null);              // object

typeof 比較適合檢測基本資料型別,不能列印出具體的引用資料型別。

2.instanceof

// object

var obj1 = ;

// array

var arr1 = [1, 2, 3, 4, 5];

// date

var date = new date()

// regexp

var reg1 = /hello/gim;

// function

function foo(x, y) 

// error

var err = new error('引數必須是數字型別');

// null

var n = null;

// 使用 instanceof 操作符檢測

console.log(obj1 instanceof object)   // true

console.log(arr1 instanceof array)   // true

console.log(date instanceof date)   // true

console.log(reg1 instanceof regexp)   // true

console.log(foo instanceof function)  // true

console.log(err instanceof error)   // true

console.log(n instanceof object) // false

instanceof的返回值是布林值,能夠判斷出物件的具體資料型別,除了null,也能判斷出自定義物件型別

null使用typeof檢測為object,但是使用instanceof判斷卻為false,它就是js在設計之初遺留的錯誤,因為js已經使用比較廣泛,就沒有再改正。

3.object.prototype.tostring().call()

// object

var obj1 = ;

// array

var arr1 = [1, 2, 3, 4, 5];

// date

var date = new date()

// regexp

var reg1 = /hello/gim;

// function

function foo(x, y) 

// error

var err = new error('引數必須是數字型別');

// null

var n = null;

// 使用 instanceof 操作符檢測

console.log(object.prototype.tostring.call(obj1)); // '[object object]'

console.log(object.prototype.tostring.call(arr1)); // '[object array]'

console.log(object.prototype.tostring.call(date)); // '[object date]'

console.log(object.prototype.tostring.call(reg1)); // '[object regexp]'

console.log(object.prototype.tostring.call(foo)); // '[object function]'

console.log(object.prototype.tostring.call(n)); // '[object null]'

4.constructor,返回自定義物件的原型函式

function fun()

var obj1 = new fun();

console.log(obj1.constructor == fun); // true

四、原型包裝器的使用

為什麼基本資料型別能有方法,如:string.length、string.substring、number.tofixed(),還有boolean的一些。

因為js引擎為基本資料型別進行了複雜資料型別的包裝,操作的大概過程如下(偽**,便於理解):

var str = 'abc';

var temp = new string(str); // 建立臨時變數

str = temp;

temp = null; // 銷毀

number和boolean也是如此。

js 基本資料型別和引用資料型別

1 資料型別 js分兩種資料型別 基本資料型別 number string boolean null undefined symbol es6 這些型別可以直接操作儲存在變數中的實際值。引用資料型別 object 在js中除了基本資料型別以外的都是物件,資料是物件,函式是物件,正規表示式是物件 2 ...

JS 基本資料型別 和 引用資料型別

變數都是儲存在棧記憶體中,基本資料型別的值直接在棧記憶體中儲存。相互不影響。var a 123 var b a a b的值不變棧記憶體中 變數值 b123 a123 物件儲存在堆記憶體中 var obj new object obj.name 墨祈 var obj2 obj obj.name moq...

js基礎 基本資料型別和引用資料型別

number string null boolean undefined object 變數都是儲存在棧記憶體中的 js中的變數都是儲存在棧記憶體中的,基本資料型別的值直接在棧記憶體中儲存,值與值之間是獨立存在的,修改乙個變數的值不會影響到其它變數的值。比如 var a 10 var b a a c...