一、字面量的賦值問題
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...