引用類型和非引用類型
- 基本類型值(number、boolean、string、null、undefined):指的是保存在棧內存的簡單數據段。
- 引用類型值(對象、數組、函數、正則):指的那些保存在堆內存中的對象,變量中保存的實際上只是一個指針,這個指針執行內存中的另一個位置,由該位置保存對象。
如下代碼輸出什么?為什么
1.png
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false;兩個變量的值保存在堆內存中不同的地址里。
console.log(obj1 = obj2); //{a:1,b:2};將obj2的指針地址賦值給obj1.并輸出obj1。
console.log(obj1 == obj2); //true;由于上一步操作,obj1與obj2指向同一個地址,故相等。
如下代碼輸出什么?為什么
2.png
var a = 1
var b = 2
var c = { name: '饑人谷', age: 2 }
var d = [a, b, c]
var aa = a
var bb = b
var cc = c
var dd = d
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3
console.log(aa) //1;數字是基本類型值,直接賦值,a的后續變化對aa沒有影響
console.log(bb) //2;數字是基本類型值,直接賦值,b的后續變化對bb沒有影響
console.log(cc) //{ name: 'hello', age: 3 };對象為引用類型值,因為c的指針地址與cc的相同,故對一方賦值操作,另一方也隨之改變
console.log(dd) // [1,2,{ name: 'hello', age: 3 }];基本類型值不變,引用類型值會因為賦值隨之改變
如下代碼輸出什么? 為什么
3.png
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a) //執行f1時,會先把a=1賦值給n,++n后,n為2,a為1
f2(c)
/*執行f2時,會先把c = { name: 'jirengu', age: 2 }賦值給obj,然
后obj中的age進行自增運算,因為指針地址相同,故age值由2變為3
*/
f1(c.age) //執行f1時,會先把age=3(由上一步變為3)賦值給n,由于是基本類型值,++n后,n為4,a為3
console.log(a) //1
console.log(c) //3
過濾如下數組,只保留正數,直接在原數組上操作
4.png
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for(var i=0;i<arr.length;i++){
if(arr[i]<=0){
arr.splice(i,1);
i--;//因為刪除了一個元素,索引值也要刪除1
}
}
return;
}
filter(arr)
console.log(arr) // [3,1,2]
過濾如下數組,只保留正數,原數組不變,生成新數組
5.png
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newArr=[]
for(var i=0;i<arr.length;i++){
if(arr[i]>0){
newArr.push(arr[i])
}
}
return newArr
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
用兩種方式寫一個深拷貝函數
var obj={
name:joey;
age:1;
hobby:{
swimming,
basketball,
reading
}
}
//方法1:遞歸
function copy(obj){
var newObj={};
for(var key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key]==='number'||typeof obj[key]==='string'||typeof obj[key]==='boolean'||obj[key]===null||obj[key]===undefined){
newObj[key]=obj[key]
}else{
newObj[key]=copy(obj[key])
}
}
}
return newObj
}
var obj2=copy(obj);
console.log(obj2)
function copy2(obj){
var newobj=JSON.parse(JSON.stringify(obj))
return newobj
}
var obj3=copy2(obj);
console.log(obj3);
補充:js刪除數組中某一項或幾項的方法
splice法
- splice(index,len,[item]) 注釋:該方法會改變原始數組。
- splice有3個參數,它也可以用來替換/刪除/添加數組內某一個或者幾個值
- index:數組開始下標
- len: 替換/刪除的長度
- item:替換的值,刪除操作的話 item為空
如:arr = ['a','b','c','d']
刪除 ---- item不設置
arr.splice(1,1) //['a','c','d']
刪除起始下標為1,長度為1的一個值,len設置的1,如果為0,則數組不變
arr.splice(1,2) //['a','d']
刪除起始下標為1,長度為2的一個值(len設置的2)替換 ---- item為替換的值
arr.splice(1,1,'ttt') //['a','ttt','c','d']
替換起始下標為1,長度為1的一個值為‘ttt’(len設置的1)
arr.splice(1,2,'ttt') //['a','ttt','d']
替換起始下標為1,長度為2的兩個值為‘ttt’(len設置的1)添加 ---- len設置為0,item為添加的值
arr.splice(1,0,'ttt') //['a','ttt','b','c','d']
表示在下標為1處添加一項‘ttt’