引用类型有哪些?非引用类型有哪些
引用类型:对象、数组、函数、正则
非引用类型:string
、number
、boolean
、null
、nudefined
如下代码输出什么?为什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
解答:
console.log(obj1 == obj2); // 输出fase,因为obj1和obj2分别存储的地址不同
console.log(obj1 = obj2); // 输出{a:1, b:2} ,等号是赋值的意思,所以返回 obj2 的引用地址赋给了obj1
console.log(obj1 == obj2); // 输出 true, 因为上一操作把 obj2的值赋给了obj1,它们的引用地址现在是一样的,所以返回 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)
console.log(bb)
console.log(cc)
console.log(dd)
解答:
console.log(aa) // 输出 1 ,a 初始是1,赋值给了aa,后面再给 a 进行赋值,前面所存在的 aa 值不会被覆盖
console.log(bb) // 输出 2 ,b 初始是2,赋值给了bb,后面再给 b 进行赋值,前面所存在的 bb 值不会被覆盖
console.log(cc) // 输出 { name: 'hello', age: 3 },c 初始是一个对象,存储在堆区返回的是一个引用地址,赋值给了cc = c的引用地址,后面修改了c 的属性内容,c的引用地址没有改变,后面打印出的就是 c 的引用地址(内容改变过)
console.log(dd) // [1,2,{name:'hello', age: 3}],综合了前面三个输出规则,规律同上
如下代码输出什么? 为什么
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)
console.log(c)
解答:
console.log(a) // 输出1 ,a 是一个非引用类型,调用f1(a) 做为参数传给了函数, 函数没有返回值 ,所以又回到上级找到 a
console.log(c) // 输出 {name: "jirengu", age: 3},调用f2(c) 在函数体改变了引入地址的属性值,结果{name: "jirengu", age: 3},f1(c.age) 在函数体没有做任务操作,所以又回到上级
过滤如下数组,只保留正数,直接在原数组上操作
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(var i = 0; i< arr.length; i++){
if(arr[i] < 0){
arr.splice(i--,1); // 当前索引值截取出来
}
}
}
filter(arr)
console.log(arr)
过滤如下数组,只保留正数,原数组不变,生成新数组
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 = [];
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:'柏龙',
age: 30,
sex: '男',
hobby: ['writeCode','playGame','readBook'],
friend: {
name: 'fangfang',
age: 20
}
}
function copy(oldObj){
var newObj = {};
for(var key in oldObj){
if(typeof oldObj[key] === 'string' || typeof oldObj[key] === 'number' || typeof oldObj[key] === 'boolean' || typeof oldObj[key] === 'undefined' || oldObj[key] === null ){
newObj[key] = oldObj[key];
}else{
newObj[key] = copy(oldObj[key]);
}
}
return newObj;
}
var copy1 = copy(obj);
第二种:
var obj = {
name:'柏龙',
age: 30,
sex: '男',
hobby: ['writeCode','playGame','readBook'],
friend: {
name: 'fangfang',
age: 20
}
}
function setCopy(oldObj){
var newObj = JSON.parse(JSON.stringify(oldObj));
return newObj;
}
var obj2 = setCopy(obj);
obj2.name = 'xiaogu';
obj2.age = 20;
obj2.friend.name = 'ruoyu';
obj.name = '饥人谷';
console.log(obj);
console.log(obj2);