1.引用類型有哪些缠黍?非引用類型有哪些?
JS為了便于操作基本類型,提供了3個(gè)特殊的引用類型:Boolean/Number和String(基本類型轉(zhuǎn)引用類型): javascript基本包裝類型介紹
- 引用類型值:(對象妻味、數(shù)組正压、函數(shù)、正則)
- 指的是那些保存在堆內(nèi)存中的對象责球,變量中保存的實(shí)際上只是一個(gè)指針焦履,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對象
- 非引用類型:(字符串雏逾、數(shù)值嘉裤、布爾值、null和undefined)
- 指的是保存在棧內(nèi)存中的簡單數(shù)據(jù)段
2.如下代碼輸出什么栖博?為什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //1
console.log(obj1 = obj2);
console.log(obj1 == obj2); //2
- 第一個(gè)為false屑宠,因?yàn)閛bj1和obj2的值雖然相同,但是這兩個(gè)對象分別保存在堆內(nèi)存的不同位置仇让,指針各自指向不同的位置
- 第二個(gè)為true典奉,因?yàn)閛bj2將值賦予obj1實(shí)際是將存儲在變量中的指針賦予obj1,而這個(gè)指針指向同一個(gè)堆內(nèi)存位置
3.如下代碼輸出什么? 為什么
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丧叽,因?yàn)榉且妙愋蜁截惒⒅匦聞?chuàng)建了一個(gè)棧內(nèi)存空間在原來的a之上
console.log(bb) // 輸出為2卫玖,因?yàn)榉且妙愋蜁截惒⒅匦聞?chuàng)建了一個(gè)棧內(nèi)存空間在原來的b之上
console.log(cc) // 輸出為{ name: 'hello', age: 3 },因?yàn)橐妙愋褪峭ㄟ^指針指向?qū)ο笏娣诺奈恢糜淮荆苯舆M(jìn)行拷貝假瞬,則將該指針賦值給cc,所以cc的值和c一樣
console.log(dd) // 輸出為{1,2,{ name: 'hello', age: 3 }},因?yàn)橐妙愋褪峭ㄟ^指針指向?qū)ο笏娣诺奈恢猛衍裕苯舆M(jìn)行拷貝剪芥,則將該指針賦值給dd,所以dd的值和d一樣
4.如下代碼輸出什么? 為什么
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
f2(c)
f1(c.age)
console.log(a) //輸出為1芦劣,函數(shù)內(nèi)的局部變量不影響全局變量的值
console.log(c) //輸出為{ name: 'jirengu', age: 3 }粗俱,f2進(jìn)行函數(shù)運(yùn)算后age為3说榆,因?yàn)橐妙愋偷奶攸c(diǎn)虚吟,所以值改變,而進(jìn)行f1的函數(shù)運(yùn)算時(shí)签财,由于是單獨(dú)提取出age的值進(jìn)行運(yùn)算串慰,相當(dāng)于轉(zhuǎn)變?yōu)榉且妙愋停灾挡皇苡绊?
5.過濾如下數(shù)組唱蒸,只保留正數(shù)邦鲫,直接在原數(shù)組上操作
js中splice()的強(qiáng)大(插入、刪除或替換數(shù)組的元素)
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--;
}
}
}
filter(arr)
console.log(arr) // [3,1,2]
6.過濾如下數(shù)組神汹,只保留正數(shù)庆捺,原數(shù)組不變,生成新數(shù)組
JavaScript中數(shù)組slice和splice的對比小結(jié)
方法一:
var arr = [3,1,0,-1,-3,2,-5]
var j = 0;
function filter(arr){
var newArr = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] >= 0) {
newArr[j] = arr[i];
j++;
}
}
return newArr;
}
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]
var arr2 = arr.slice();
function filter(arr2) {
for(var i=0;i<arr2.length;i++) {
if(arr2[i]<=0) {
arr2.splice(i,1);
filter(arr2);
}
}
}
filter(arr2);
console.log(arr);
console.log(arr2);
7.寫一個(gè)深拷貝函數(shù)屁魏,用兩種方式實(shí)現(xiàn)
JS中的hasOwnProperty()和isPrototypeOf()屬性實(shí)例詳解
方法一:
obj = {
age:100,
one: null,
finder: {
name: 'jirengu',
sex: 'nv'
}
}
function copy(obj) {
var newObj = {};
for(var key in obj) {
if(obj.hasOwnProperty(key)) { // hasOwnProperty 是檢測對象在排除原型鏈的情況下是否具有某個(gè)屬性滔以。
if(typeof obj[key] === 'number'
|| typeof obj[key] === 'boolean'
|| typeof obj[key] === 'string'
|| typeof obj[key] === 'undefined'
|| obj[key] === null) {
newObj[key] = obj[key];
}else{
newObj[key] = copy(obj[key]);
}
}
}
return newObj;
}
var obj3 = copy(obj);
obj.finder.name = '饑人谷'
console.log(obj3);
方法二:
function copy(obj){
var newobj = JSON.parse(JSON.stringify(obj));
return newobj;
}
var obj2 = copy(obj1)
console.log(obj2)