javascript變量是鬆散類型的本質,決定了它只是特定時間用於保存特定值的一個名字而已,javascript
因爲不存在定義變量的必須保存何種數據類型值的規則,變量的值及數據類型能夠在腳本的生命週期內改變java
變量的數據類型可分爲基本數據類型和引用類型;函數
基本數據類型值指的是簡單的數據段,而引用類型是多個值構成的對象;spa
再將一個值賦給變量時,解析器必須肯定這個值是基本類型仍是引用類型,設計
基本類型:(undefined、null、Number、Boolean、String)是按值訪問的,由於能夠操做保存在變量中的實際的值
引用類型:引用類型的值保存在內存中的對象;指針
javascript不容許直接訪問內存中的位置,即不能直接操做對象的內存空間,
在操做對象時,其實是在操做對象的引用而不是實際的對象,故引用類型的值是按引用訪問的!code
一、咱們不能給基本類型的值添加屬性,儘管這樣不會犯錯對象
1 var person= new Object(); 2 person.name='naruto'; 3 alert(person.name); 4 name.age='20'; 5 alert(name.age);
二、複製變量的值
(1)基本類型:若是從一個變量向另外一個變量複製基本類型的值,會在變量對象上建立一個新值,
而後把該值複製到爲新變量分配的位置上blog
var num1=0; var num2=num2;
(2)引用類型:當一個變量向另外一個變量複製引用類型的值,一樣會將存儲在對象中的值複製一份到新變量的空間,
不一樣的是,這個值的副本其實是同一個指針,而這個指針指向存儲在堆中的一個對象!
複製結束後兩個變量實際將引用同一個對象生命週期
1 var obj1=new Object(); 2 var obj2=obj1; 3 obj1.name='naruto'; 4 alert(obj2.name)//naruto
三、值傳遞
ECMAScript中全部函數的參數都是按值傳遞的,也就是說,把函數外部的值複製給函數內部的參數!
基本類型的傳遞如同基本類型的複製,引用類型的傳遞如同引用類型的複製
//基本類型 function addTen(num){ num+=10; return num; } var count=20; var result=addTen(count); alert(count);//20 alert(result);//30 //引用類型 function setName(obj){ obj.name='naruto'; } var person=new Object(); setName(person); alert(person.name);//naruto function setName(obj){ obj.name='naruto'; obj=new Object(); obj.name='narutowlll'; } var person=new Object(); setName(person); alert(person.name);//naruto //在函數內部重寫obj時,這個變量引用就是一個局部對象, //這個局部對象在函數執行完當即被銷燬!
四、類型檢測
(1)typeof操做符肯定一個變量是String、Number、Boolean、undefined
若是一個對象是null或對象,typeof會返回Object
1 var i='naruto'; 2 var j=true; 3 var k=0; 4 var u; 5 var v=null; 6 var o=new Object(); 7 8 alert(typeof i);//string 9 alert(typeof j);//boolean 10 alert(typeof k);//number 11 alert(typeof u);//undefined 12 alert(typeof v);//object 13 alert(typeof o);//object
(2)instanceof:檢測對象的類型;若是使用instanceof檢測基本類型數據時,則始終返回false;
1 var person=new Object() 2 alert(person instance Object);//true 3 var date=new Date(); 4 alert(date istanceof Date)//true 5 var arr=new Array(); 6 alert(arr instance Array);//true
參考:《javascript高級程序設計》第三版