1.引用类型有哪些?非引用类型有哪些
- 引用类型:
对象、数组、函数、正则表达式
- 非引用类型:
数值、字符串、布尔值、null、undefined
2.如下代码输出什么?为什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
// obj1和obj2指向的是不同的对象
console.log(obj1 == obj2); // false
// 将obj2引用对象的指针赋值给obj1
console.log(obj1 = obj2); // Object {a:1, b:2}
// 现在obj1和obj2指向同一个对象
console.log(obj1 == obj2); // true
3.如下代码输出什么? 为什么
// aa和bb都是数值,非引用类型,a和b数值的变化对aa和bb无影响
console.log(aa) // 1
console.log(bb) // 2
// 将c指向对象的指针赋给cc,c和cc指向的其实是同一个对象,对c的修改就是对其指向的对象的修改,因此cc会保持一致的变化
console.log(cc) // {name:'hello',age:3}
// d[0]和d[1]只是将a和b的数值拷贝过来,而d[2]和c指向的也是同一个对象,d[2]中存储的只是指向对象的指针
console.log(dd) // [1, 2, {name: 'hello', age: 3} ]
4.如下代码输出什么? 为什么
// f1(a)将a的值赋给f1的参数,参数的变化不会影响a
f1(a)
// f2(c)将c指向对象的指针赋给参数obj,因此obj和c指向同一个对象
f2(c)
// c.age是一个数值,和f1(a)类似
f1(c.age)
console.log(a) // 1
console.log(c) // { name: 'jirengu', age: 3 }
5.过滤如下数组,只保留正数,直接在原数组上操作
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var len = 0;
for (var i=0, n=arr.length; i<n; i++) {
if (arr[i] > 0) {
arr[len] = arr[i];
len++;
}
}
arr.length = len;
}
filter(arr)
console.log(arr)
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
var temp = [];
var index = 0;
for (var i=0;i<arr.length;++i) {
if (arr[i] > 0) {
temp[index] = arr[i];
++index;
}
}
return temp;
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)
7.写一个深拷贝函数,用两种方式实现
var stu1 = {
name: 'nicole',
score: {
math: 90,
english: 85
}
}
function deepCopy(obj) {
var newObj = {};
for( var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'number' || typeof obj[key] === 'string' || typeof obj[key] === 'boolean'
|| obj[key] === undefined || obj[key] === null) {
newObj[key] = obj[key];
}else {
newObj[key] = deepCopy(obj[key]);
}
}
}
return newObj;
}
var stu2 = deepCopy(stu1);
stu2.name = 'Jack';
stu2.score.math = 80;
console.log(stu1);
console.log(stu2);
- Jason解析
Note:它能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构,并且兼容性是IE8+
var obj = {
name: 'nicole',
score: {
math: 90,
english: 85
}
}
var obj2 = JSON.parse(JSON.stringify(obj));
obj2.name = 'Jack';
obj2.score.math = 80;
console.log(obj);
console.log(obj2);