1.引用類型有哪些?非引用類型有哪些?
JS為了便于操作基本類型,提供了3個特殊的引用類型:Boolean/Number和String(基本類型轉引用類型): javascript基本包裝類型介紹
- 引用類型值:(對象、數組、函數、正則)
- 指的是那些保存在堆內存中的對象,變量中保存的實際上只是一個指針,這個指針執行內存中的另一個位置,由該位置保存對象
- 非引用類型:(字符串、數值、布爾值、null和undefined)
- 指的是保存在棧內存中的簡單數據段
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
- 第一個為false,因為obj1和obj2的值雖然相同,但是這兩個對象分別保存在堆內存的不同位置,指針各自指向不同的位置
- 第二個為true,因為obj2將值賦予obj1實際是將存儲在變量中的指針賦予obj1,而這個指針指向同一個堆內存位置
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,因為非引用類型會拷貝并重新創建了一個棧內存空間在原來的a之上
console.log(bb) // 輸出為2,因為非引用類型會拷貝并重新創建了一個棧內存空間在原來的b之上
console.log(cc) // 輸出為{ name: 'hello', age: 3 },因為引用類型是通過指針指向對象所存放的位置,直接進行拷貝,則將該指針賦值給cc,所以cc的值和c一樣
console.log(dd) // 輸出為{1,2,{ name: 'hello', age: 3 }},因為引用類型是通過指針指向對象所存放的位置,直接進行拷貝,則將該指針賦值給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,函數內的局部變量不影響全局變量的值
console.log(c) //輸出為{ name: 'jirengu', age: 3 },f2進行函數運算后age為3,因為引用類型的特點,所以值改變,而進行f1的函數運算時,由于是單獨提取出age的值進行運算,相當于轉變為非引用類型,所以值不受影響
5.過濾如下數組,只保留正數,直接在原數組上操作
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.過濾如下數組,只保留正數,原數組不變,生成新數組
JavaScript中數組slice和splice的對比小結
方法一:
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.寫一個深拷貝函數,用兩種方式實現
JS中的hasOwnProperty()和isPrototypeOf()屬性實例詳解
方法一:
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 是檢測對象在排除原型鏈的情況下是否具有某個屬性。
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)