基本變量和引用變量


基本數據類型作比較,值相等則相等,值不相等則不相等(忽略數據類型)

引用類型作比較,引用地址相等則相等,否則都是不等的。

基本數據類型,和引用數據類型作比較,是比較值是否相等(忽略數據類型)

console.log([ []==[] , []===[] , 4==[4] , 4===[4]  ]);  //返回:[false, false, true, false]

1,引用數據類型: [] 數組,只有 a=[] , b=a (引用地址相等) 只有這種情況才相等,否則都是不等的。

      所以 [] == [] 返回 false;    [] === [] 返回:false

2,[4] 經過隱式類型轉換 :console.log(Number([4]));  返回:4 。

      所以,4==[4] 返回:true;   4===[4] 返回:false 。

======================================

<script>

//引用類型只要重新賦值,那么就是重新在堆內存空間中開辟新的內存地址。

var a=[4];

var b=a;//b=[4];

a=[4,44];//重新給變量a開辟新的堆內存空間。

document.write(b);//返回:[4]

a=b;//b=[4],所以a=[4]

a.push(44);// a=[4,44] b=[4,44]

document.write(a);//返回:[4,44];

</script>

======================================

javascript


變量就是保存數據的容器:包含$ ,_  ,字母,數字,數字不能開頭,區分大小寫,不能是保留字和關鍵字:class,function等等。

變量命名:首先按照項目組的規定來命名。駝峰命名btnConfirm  btn_confirm  buttonConfirm  一定要有意義的,千萬別寫btn1  btn2 btn3 等等無意義的命名,盡量使用英文而別用漢語拼音。

數據是最重要的。
變量:
1,基本類型:值不可修改  4  "str"  true/false undefined  null NaN(not a number)
2,引用類型:值可以修改
棧堆內存
棧內存:類似樓梯階梯,空間大小固定,只可以放一個東西,值不可改變,且是有序的。所以是存放基本類型。
堆內存:類似可以放一大堆東西的空間,空間大小可以改變,是無序的,可以放這個也可以放那個。所以是存放引用類型。

================

區別

基本數據類型:值不可修改 Number String Boolean Undefined Null 等 網頁中的最小單位

引用數據類型:值可以修改 Array[] {}對象 都是由基本數據類型組成的

 ---------------------------

//基本數據類型,是網頁中的最小單位,所以不能添加刪除修改屬性。

var person="xiaoming";

person.age=19;

console.log(person.age);//返回:undefined

=======================

var a=4;//4基本數據類型,是不可修改的。

a=3;//這里只是覆蓋了4,4本身並沒有變化。

console.log(a);//返回:3

------------

string 的包裝對象 String,從而調用該包裝對象的方法,基本數據類型本身是沒有方法的

1 的包裝對象是 Number 從而調用該包裝對象的方法,基本數據類型本身是沒有方法的

 

var str="string";//基本數據類型
//把s 替換成 "",創建一個新的字符串,不會在原有的字符串里面修改,因為辦不到。
var anotherStr=str.replace("s","");
console.log(str+"--"+anotherStr);//返回:string--tring

------------

// 引用類型可以添加刪除修改屬性的

//引用類型里面可以是基本數據類型

//引用類型是里面還可以是引用類型
var person={};
console.log(person);//返回:{}
person.name="ZhengLiang";//引用類型里面是基本數據類型
person.sex="Male";//男
person.sex="Female";//女
console.log(person);//返回:{name: "ZhengLiang", sex: "Female"}
delete person.name;
console.log(person);//返回:{sex: "Female"}

person=["fathor","mother"];//引用類型是里面還是引用類型

=================參數傳遞==================

不管是基本數據類型還是引用數據類型進行參數傳遞,傳的都是值本身,而不是引用。

而訪問則不同:

基本數據類型:是直接訪問值。

引用數據類型:通過引用地址指向指定的堆內存空間中的某一個地址訪問值。

------------------基本數據類型傳遞參數-------------------

<script>

//a , b 是形參(形式參數)

function addScore(a,b){

return a+b;

}

//這里的80 , 70 是實參(實際參數)

console.log(addScore(80,70));

</script>

------------------引用數據類型傳遞參數-------------------

<script>

//引用類型傳遞參數 obj是形式參數

function setName(obj){

return obj.name="xm";

}

var person={};//聲明空對象

//調用setName方法,把person這個值直接傳遞給obj(傳遞的不是引用),變成person.name="xm"。

setName(person);

console.log(person.name);//返回:xm。

</script>

------------------引用數據類型傳遞參數-------------------

<script>

//引用類型傳遞參數 obj是形式參數

function setName(obj){

obj.name="xm";//這里的obj=person

obj={};//給obj重新開辟了一個堆內存空間,是一個新的對象,跟person本身沒有關系了。所以下面輸出xm。

obj.name="xh";

}

var person={};//聲明空對象

//調用setName方法,把person這個值直接傳遞給obj(傳遞的不是引用),變成person.name="xm"。

setName(person);//obj=person 

console.log(person.name);//返回:xm。

</script>

如下圖:請注意obj={}; 是引用地址指向了另外一個堆內存空間。即重新開辟對象了。

-------------------------------------

數據類型:Number String Boolean Undefined Null  []數組  {}對象  function函數  RegExp正則表達式

<script>

//-------引用數據類型具體是什么類型數據-------

//基本數據類型,使用 indanceof 該方法,全部返回 false

console.log([] instanceof Array);//返回 true

// console.log(Array);//返回:Array() { [native code] }

// console.log([] instanceof array);直接報錯 array 是構造函數,應該是大寫:Array

console.log([] instanceof Object);//返回 true

// console.log([] instanceof object);直接報錯 boject 是構造函數,應該是大寫:Object

// console.log(Object) ;//返回:Object() { [native code] } 

console.log({} instanceof Object);//返回 true {}空對象是 Object 的實例

console.log({} instanceof Array);//返回 false {}空對象不是 Array 的實例

 

//------基本數據類型使用indstanceof,全部返回 fasle-------

console.log(1 instanceof Number);//返回 false

console.log("string" instanceof Number);//返回 false

console.log(false instanceof Number);//返回 false

</script>

以下是基本數據類型使用 typeof 返回的數據類型 : number string boolean undefined null

Number()  toString()  String()  Boolean()  isNaN() 這些都是類型轉換的方法

<script>

//typeof 或者 typeof() 返回的一定是字符串

console.log(typeof null);//返回:Object null是Null數據類型,因為typeof 返回的是字符串,所以是Object

console.log(typeof false);//返回:boolean

console.log(typeof 1);//返回:number

console.log(typeof "a");//返回:string

console.log(typeof a);//返回:undefined  a是一個未定義的變量:a="";

</script>

-------------------------------------

<script>

function add(a,b){

return a+b;

}

function fn(fn){

fn.person="xm";

fn=function(){};

fn.person="xh";

}

fn(add);//只要涉及參數傳遞,直接把參數值帶入函數中,再一步一步執行即可。

/*參數傳遞都是值的傳遞。解析該函數:

function(add){//直接把add這個值帶入fn(fn)函數執行即可

add.person="xm";

add=function(){};//這里的add是引用類型,重新在系統堆內存中開辟一個新的空間。和先前的add沒有關系

add.person="xh";

}*/

console.log(add.person);//返回 xm

</script>

------------------------------------------

 

javascript數據類型:數據類型:
1,基本數據類型:Numer String Null Undefined Boolean 五種。
2,復雜數據類型:Object
null 表示一個空對象指針,如果變量用於保存對象,那么最好將變量初始化為null,而不是其他值。
對象里面是有多個屬性,函數等等。一般都是空對象的變量才設置為null。而不是一個單純的變量。
var person=null;
typeof的使用方法有兩種:(1)typeof 變量(2) typeof(變量)typeof的返回值有Undefined、Null、Boolean、Number、String、Object,但是返回值的類型是String類型。上面的返回值Null,Boolen...都是String類型。var name="zheng";console.log( typeof( name ) );console.log(typeof name);



棧內存:類似樓梯的階梯,有序的,一個階梯只能放一個值,這個值是固定不可修改,這個值可以是基本類型,也可以是一個引用地址。
堆內存:類似一個巨大空間,無序的,可以放很多東西,值多大就開辟多大的空間進行存儲,值可以改變的。

引用類型的值可以修改,凡是可以修改的都可以看作引用類型

函數是引用類型,可以為其添加屬性和方法。只要是引用類型都可以添加屬性和方法。

一個變量----進來如果是基本類型(值不可以改變),那就可以直接使用。

一個變量進來如果是引用地址(不是一個值,而是一個指路標),那么需要去堆內存空間去取該值。

一個變量取值順序是-------》棧內存------》堆內存。

-------------------------------------------------

變量比較是否相等

基本類型和基本類型比較:只要是值相等,那么兩個就一定相等。(注意數據類型也要完全相等。)

引用類型和引用類型比較:只有兩個引用地址指向的是堆內存里面開辟的同一個存儲空間時,

兩個變量才會相等,否則都是不相等的。如下面:

-----------------------------------------

<script type="text/javascript">
        var xm={
            age:18,
            score:4
        };
        var xh={
            age:18,
            score:4
        };
        console.log(xm===xh);//xm,xh在堆內存中各自開辟了一個空間,兩個引用地址不同,所以兩個是不同對象,不相等。
    </script>

控制台輸出:false,即不相等

變量xm和xh是兩個變量,先在棧內存中各自開辟一個內存位置。

然后xm在堆內存中自己開辟一個空間存放age和score。

xh也在堆內存中自己開辟一個空間存放age和score。

雖然兩個屬性和值都是一模一樣的,但是開辟了兩個不同的內存空間,兩個完全不同的引用,

是兩個完全不同的對象,所以,兩者並不相等。

=================================================

-----------------------------------------

<script type="text/javascript">
        var xm={
            age:18,
            score:4
        };
       var xh=xm;//把xm的引用地址賦值給xh,他們的引用地址相等,指向同一個值,所以相等
        console.log(xm===xh);
    </script>

控制台輸出:true,即相等。

==========================

undefined==null    返回 true

undefined===null    返回false

==比較的是值,===比較的是值和類型;undefined和null的值相等; undefined是Undefined類型,null是Null類型,它們的數據類型不相等。

--------------------------------

<script type="text/javascript">
        document.write([  [ ]==[ ] , [ ] === [ ], 4==[4],4===[4] ]);
</script>

輸出結果:false,false,true,false

-------------------------------

var xm={

            age:18,

            score:4

        };

        var xh=xm;

        xh.score++;

        //引用類型是可以修改的。引用地址相同,那么值也就一定相等。因為指向同一個對象的值。

        console.log(xm.score);//返回:5

        console.log(xh.score);//返回:5

----------------------------

對應淺層拷貝 ,還有另外一個深層拷貝。

以下是淺層拷貝:

var xm={

            age:18,

            score:4

        };

        function copyObj(obj){

        var newObj={};

        for(var a in obj){

        newObj[a]=obj[a];

        }

        return newObj;

        }

        var xh=copyObj(xm);

        console.log(xh);

--------------------------------

如果拷貝對象里面還有對象,那么使用上述淺層拷貝的方法就會報錯,如下:

var xm={

            age:18,

            score:4

            family:{"father","mother"}  //這里報錯

        };

        function copyObj(obj){

        var newObj={};

        for(var a in obj){

        newObj[a]=obj[a];

        }

        return newObj;

        }

        var xh=copyObj(xm);

        console.log(xh);

---------------------------------

如果是兩個引用類型的數據進行比較,那么比較的是它們的引用:即使兩個數組各個索引元素完全相等,它們也是不相等的。

上文的數組 [ ] 和 [ ] 是值相等,但是引用數據類型是比較引用地址,如果地址相同,那就相等,否則都是不相等。

如果是基本數據類型和引用數據類型進行比較,那么會把引用類型數據轉換成基本數據類型進行比較,如果值相等,那就相等,否則不等。

基本數據類型和基本數據類型相比較,值相等,那么結果就相等。

舉個例子:

var a = [];  // 定義一個引用空數組的變量a

var b = a;   // 變量b引用同一個數組

b[0] = 1;    // 通過變量b來修改引用的數組

a[0]         // => 1: 變量a也會修改

a === b      // => true:a和b引用同一個數組,因此它們相等

 

如果兩個不同類型的數據進行==比較,會把左右轉換成同一類型再比較,

如果一個運算數是對象,另一個是數字,會把對象轉換成數字。

 -----------------------------------

<script type="text/javascript">
        var a=[4];
        var b=a; //把a的引用賦值給b,如果這里添加 b=[4,44],那就改變了引用指向的堆內存的值,所以a=b=[4,44]
        a=[4,44];  //重新賦值,開辟新空間,沒有改變b的引用,所以b的值為4不變。
        document.write(b+",");  ?、
        b.push(44);   //在b后面追加44。所以b=[4,44].
        document.write(b);
    </script>

-----------------------------------

LOGO png圖片制作https://www.logoko.com.cn/pngimg.com快速摳圖:https://www.gaoding.com/
各種轉換轉義:https://www.sojson.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM