基本类型 引用类型
基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段
引用类型值(对象 数组 函数 正则) 指的是保存在堆内存中的对象 变量中保存的
实际上只是一个指针,指针执行内存中的另一个位置,由该位置保存对象
可以理解为存的是地址
<script>
var a
var b
var c
var a = 1
var b = 2
var c = {name: 'ruoyu'} //0x0033
var aa = a
var bb = b
var cc = c
a = 100
b = 200
c.name = 'jirengu'
console.log(aa) //1
console.log(bb) //2
console.log(cc) //Object {name: "jirengu"}
//c = {name: 'fem'} //0x0044
</script>
//函数的参数传递
function inc(n){
//var n = a
n++;
}
var a = 10;
inc(a);
console.log(a); //10
function incObj(obj){
//var obj = o
obj.n++;
}
var o = {n: 10};
incObj(o);
console.log(o); //11
var arr = [3, 4, 5] //0x0088
function squireArr(arr){
//相当于 var arr = 0x0088
for(var i = 0; i < arr.length; i++){
arr[i] = arr[i] * arr[i]
}
}
squireArr(arr)
console.log(arr)
function squireArr2(arr){
var newArr = []
for(var i = 0; i < arr.length; i++){
newArr[i] = arr[i] * arr[i];
}
return newArr;
}
var arr2 = squireArr2(arr)
console.log(arr2);
浅拷贝
var obj = {
age: 100,
friend: {
name: 'ruoyu',
sex: 'male'
}
}
function shadowCopy(obj){
var newObj = {}
for(var key in obj){
newObj[key] = obj[key]
}
return newObj
}
var obj3 = shadowCopy(obj)
obj.age = 400
console.log(obj3)
//深拷贝
function copy(obj){
var newObj = {};
for(var key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === 'number' || typeof obj[key] === 'boolean' || typeof obj[key] === 'string' || obj[key] === undefined || obj[key] === null){
newObj[key] === obj[key]
}else{
newObj[key] = copy(obj[key])
}
}
}
return newObj
}
var obj3 = copy(obj)
题目1:引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么
1.png基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段
引用类型值(对象 数组 函数 正则) 指的是那些保存在堆内存中的对象,变量中
保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象 可以理解为存的是地址
console.log(obj1 == obj2)
//false 由于obj1与obj2所存储的位置不同,所以false
console.log(obj1=obj2)
//{a:1, b:2} 把obj2赋值给obj1 输出Object {a:1, b:2}
console.log(obj1 == obj2)
//把obj2赋值给obj1 所以obj2与obj1存储的位置是一样的 所以为true
题目2:如下代码输出什么? 为什么
2.pngconsole.log(aa)
//1 值传递 a aa b bb都会开辟一个属于自己的栈空间
console.log(bb)
//2 值传递
console.log(cc)
//{name: 'hello', age: 3} 对象的赋值是引用传递 cc和c都是指向同一块堆内存
console.log(dd)
//[1, 2, [name: 'hello', age: 3] 数组的赋值也是引用传递
题目3:如下代码输出什么? 为什么
3.pngf1(a)
//a = 1 有赋值动作 var n = a, ++n, a依然不变
f2(c)
//c = {name: 'jirengu', age: 3}
f1(c.age)
//取出c.age = 3 默认执行 var n = 3 不影响c.age
console.log(a)
//1
console.log(c)
//{name: 'jirengu',age:3}
题目4:过滤如下数组,只保留正数,直接在原数组上操作
4.png
题目5:过滤如下数组,只保留正数,原数组不变,生成新数组
5.png
题目6:写一个深拷贝函数,用两种方式实现
网友评论