-
引用類型有哪些球切?非引用類型有哪些谷誓?
JS中的數(shù)據(jù)類型分為基本類型和引用類型。
基本類型:數(shù)值(number)吨凑、字符串(string)捍歪、布爾值(Boolean)、null鸵钝、undefined糙臼。
基本類型的訪問(wèn)是按值訪問(wèn)的,就是說(shuō)你可以操作保存在變量中的實(shí)際的值蒋伦。
引用類型:除去上面的基本類型,其余的都是引用類型或稱為是對(duì)象焚鹊。對(duì)象是屬性和方法的集合痕届。也就是說(shuō)引用類型可以擁有屬性和方法,屬性又可以包含基本類型和引用類型末患。
-
如下代碼輸出什么研叫?為什么?
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false
console.log(obj1 = obj2); // Object {a:1,b:2}
console.log(obj1 == obj2); //true
//obj1和obj2是兩個(gè)對(duì)象璧针,對(duì)象的比較是棧區(qū)中對(duì)象地址的比較嚷炉,obj1和obj2是兩個(gè)獨(dú)立的對(duì)象,棧區(qū)對(duì)象地址不一樣探橱,因此輸出false申屹;
//對(duì)象之間的賦值是棧區(qū)地址的賦值绘证,把obj2棧區(qū)地址賦給obj1,obj1和obj2就擁有了相同的對(duì)象地址哗讥,指向同一個(gè)對(duì)象嚷那,故輸出Object {a:1,b:2};
//由于經(jīng)過(guò)obj1=obj2杆煞,obj1和obj2擁有了相同的對(duì)象地址魏宽,故輸出true;
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;
console.log(bb) //2;
console.log(cc) //Object { name: 'hello', age: 2 }
console.log(dd) //[1,2,Object {name: 'hello', age: 3 }]
/*基本類型之間的賦值决乎,在從一個(gè)變量向另一個(gè)變量賦值基本類型時(shí)
會(huì)在該變量上創(chuàng)建一個(gè)新值队询,然后再把該值復(fù)制到為新變量分配的位置上,
此后兩個(gè)變量之間相互獨(dú)立构诚,互不影響蚌斩,因此aa=1,bb=2唤反,此后a=11凳寺,b=22,并不影響
aa彤侍、bb的值*/
/*c是一個(gè)對(duì)象肠缨,c向cc賦值時(shí),賦的是對(duì)象的地址盏阶,因此cc和c有相同的對(duì)象地址晒奕,指向同一個(gè)對(duì)象c*/
/*d是一個(gè)數(shù)組,a名斟、b的賦值原理同上脑慧,c是一個(gè)對(duì)象
c.name='hello' 和 d[2]['age']=3改變了c中的對(duì)象,但是地址沒(méi)變砰盐,依然指向這個(gè)對(duì)象
因此有這一個(gè)輸出*/
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a) //隱式var n=a闷袒;
f2(c) //隱式var obj=c,把c的地址賦給obj岩梳;
f1(c.age) //隱式 var n=c.age囊骤;
console.log(a) //1;
console.log(c) //Object {name: 'jirengu', age: 2}
//函數(shù)操作后都沒(méi)有return,運(yùn)行完成后函數(shù)銷(xiāo)毀冀值,并未改變a與c的值
-
過(guò)濾如下數(shù)組也物,只保留正數(shù),直接在原數(shù)組上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
filter(arr)
console.log(arr) // [3,1,2]
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
for (i=0; i<arr.length;i++) {
if (arr[i]<=0) {
arr.splice (i,1); //從數(shù)組第i個(gè)開(kāi)始刪除列疗,刪除個(gè)數(shù)1個(gè)(arr[i]被刪掉)
filter(arr); //刪除后滑蚯,數(shù)組序號(hào)發(fā)生變化,重新執(zhí)行一次函數(shù)
}
}
return arr;
}
filter(arr)
console.log(arr)
-
過(guò)濾如下數(shù)組,只保留正數(shù)告材,原數(shù)組不變坤次,生成新數(shù)組
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var newArr = [];
var k = 0;
for (i=0; i<arr.length;i++) {
if (arr[i]>0) {
newArr[k] = arr[i];
k++;
}
}
return newArr;
}
var arr2 = filter(arr)
console.log(arr2)
console.log(arr)
-
寫(xiě)一個(gè)深拷貝函數(shù),用兩種方式實(shí)現(xiàn)
//方法1
var obj = {};
function deepCopy (obj) {
var newObj = {};
for (i=0; i<obj.length; i++) {
if (typeof obj[i] === "number" || typeof obj[i] === "string" || typeof obj[i] === "boolean" || obj[i] === null || typeof obj[i] === "undefined") {
newObj[i] = obj[i];
}else {
newObj[i] = deepCopy(obj[i]);
}
}
return newObj;
}
//方法2
var obj = {};
var newObj = JSON.parse(JSON.stringify(obj));
//JSON.stringify(): 將對(duì)象解析為字符串创葡;
//JSON.parse(): 將字符串解析為對(duì)象浙踢;