-
变量在程序中就是一块内存空间,至于内存空间存的是什么取决于变量的类型:
-
对于所有原始类型(Number、String、Null、undefined、Boolean、Symbol)赋值给变量的是什么内存空间中存的就是什么,所以原始类型也称为值类型。
var a = 1; // 定义一个变量 a,a 就是一块内存,内存里存的就是1 -
除了原始类型之外还有一种类型叫做引用类型,也叫对象类型(Object、 Array、Function等),引用类型对应的内存空间中存的是地址。
// 定义一个变量 b,首先对于右侧的大括号先开辟一块内存,内存中存的是两个原始类型,然后将这块内存的地址赋值给 b var b = { n1: 1, n2: 2 }
-
【练习题】
-
下面代码输出的是什么?
var a = 1; var b = a; b++; console.log(a, b);答案: 1 2
b = a 是将 a 的值复制给 b,所以 b++ 对 a 没影响。
-
下面代码输出的是什么?
var a = { n: 1 }; var b = a; b.n++; console.log(a.n, b.n);答案: 2 2
a 存的是地址,b = a 是将 a 中的地址复制给 b,然后 a、b 就指向了同一块内存,所以 b.n++ 就是 a.n++。
-
为什么使用下面的 swap 函数无法将 n1,n2 变量的值交换?
function swap(a, b) { var temp = a; a = b; b = temp; }; var n1 = 1, n2 = 2; swap(n1, n2); console.log(n1, n2); // 输出1 2答案: 形参的值交换和实参没关系,也就是说实参和形参分别对应的是两套不同的内存,形参内存中的值变化对实参内存中的值不产生影响。
-
实现函数 pick(),修改对象,仅保留需要的属性。
答案:
/** * @param {Object} obj 需要修改的对象 * @param {Array<string>} keys 需要保留的属性名数组 */ function pick(obj, keys) { for (var key in obj) { if (!keys.includes(key)) { delete obj[key]; } } }; var obj = { a: 1, b: 2, c: 3, d: 4 }; pick(obj, ['a', 'c']); console.log(obj); // {a:1, c:3} -
下面代码输出的是什么?
var foo = { n: 0, k: { n: 0 }, }; var bar = foo.k; bar.n++; bar = { n: 10 }; bar = foo; bar.n++; bar = foo.n; bar++; console.log(foo.n, foo.k.n);答案: 1 1
-
下面代码输出的是什么?(京东)
var foo = { n: 1 }; var arr = [foo]; function method1(arr) { var bar = arr[0]; arr.push(bar); bar.n++; arr = [bar]; arr.push(bar); arr[1].n++; }; function method2(foo) { foo.n++; }; function method3(n) { n++; }; method1(arr); method2(foo); method3(foo.n); console.log(foo.n, arr.length);答案: 4 2
-
下面代码输出的是什么?(字节)
var foo = { bar: 1 }; var arr1 = [1, 2, foo]; var arr2 = arr1.slice(1); arr2[0]++; arr2[1].bar++; foo.bar++; arr1[2].bar++; console.log(arr1[1] === arr2[0]); console.log(arr1[2] === arr2[1]); console.log(foo.bar);答案: false true 4
-
下面代码输出的是什么?
const data = { user: [ { name: '张三', age: 18 }, { name: '李四', age: 20 } ] }; const user = data.user[0]; data.user[0] = null; console.log(user); const data2 = { user: [ { name: '张三', age: 18 }, { name: '李四', age: 20 } ] }; const user2 = data2.user[0]; user2.name = '王五'; console.log(user2);答案:
{ name: '张三', age: 18 }
{ name: '王五', age: 18 }