(以下是从各种网站、同学处整理的前端实习面试题,答案也为自己整理,有错误的话欢迎指正)
1、谈谈Js中基本类型和引用类型。
答:①基本类型:undefined、null、string、number、Boolean、symbol(ES6)
其中分为普通基本类型和特殊基本类型:
普通基本类型:undefined、null、symbol
特殊基本类型:string、number、Boolean
②引用类型:Object、Array、RegExp、Date、Function
③不同:
基本类型
- 基本类型的变量是存放在栈内存(Stack)里的
- 基本数据类型的值是按值访问的
- 基本类型的值是不可变的
- 基本类型的比较是它们的值的比较
引用类型
- 引用类型的值是保存在堆内存(Heap)中的对象(Object)
- 引用类型的值是按引用访问的
- 引用类型的值是可变的
- 引用类型的比较是引用的比较
④堆内存和栈内存
栈:连续存储,大小固定。特殊地,null属于object类型,表示一个空指针对象,但是存在栈内存中。
堆:非连续的树形存储结构。特殊地,new一个实例,生成的是一个对象,即使
var foo = new String("123123") var bar = String("123123") console.log(a==b, a===b)
会输出true false,能够说明new的实例是对象。另外,
var foo = new String("123") var bar = new String("123") console.log(foo==bar, foo===bar)
会输出false false,这是因为两者都是存储在堆内存中,但指针指向不一致。
⑤按值访问和按引用访问&&按引用比较
基本类型的值是不可变的,比如:
var a = 10; var b = a; a ++ ; console.log(a); // 11 console.log(b); // 10
而引用类型的值可变,比如:
var a = [1,2,3]; var b = a; b.push(4); alert(b); //[1,2,3,4] alert(a); //[1,2,3,4] 对象类型 : 赋值不仅是值的复制,而且也是引用的传递 var a = [1,2,3]; var b = a; b = [1,2,3,4]; alert(b); //[1,2,3,4] alert(a); //[1,2,3]
对于按引用访问,参考一下两段代码:
var person1 = '{}'; var person2 = '{}'; console.log(person1 == person2); // true
var person1 = {}; var person2 = {}; console.log(person1 == person2); // false
上面一段是字符串之间的比较,而下面一段是对象之间的比较。至于false,这是因为引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的。