基本數據類型作比較,值相等則相等,值不相等則不相等(忽略數據類型)
引用類型作比較,引用地址相等則相等,否則都是不等的。
基本數據類型,和引用數據類型作比較,是比較值是否相等(忽略數據類型)
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] 返回:true 。
======================================
<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(fn.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/