1、函数传参,传递复杂数据类型和简单数据类型有什么区别?
简单数据类型传的是数值,而复杂数据类型传的是地址
基本数据类型之间的赋值
基本数据类型:1、基本数据类型变量存储的是值,
2、基本数据类的变量存储在栈内存中,
3、基本数据类型的变量和变量之间互不影响
var num = 10
var num2 = num
num2 = 200
console.log(num) // 100
console.log(num2) // 200
相当于是把 num 的值复制了一份一摸一样的给了 num2 变量,赋值以后两个在没有关系
复杂数据类型(引用数据类型)之间的赋值
1. 引用数据类型的变量存储的是地址值,
2. 复杂数据类型存储在 堆内存中
3. 引用数据类型的变量如果和另外一个引用数据类型的变量共用一个地址值,其中一个变化,另外一个也会受到影响
var obj = {
name: 'Jack'
}
var obj2 = obj
obj2.name = 'Rose'
console.log(obj.name) // Rose
console.log(obj2.name) // Rose
所以就是赋值的时候相当于把 obj 存储的那个地址复制了一份给到了 obj2 变量;
现在 obj 和 obj2 两个变量存储的地址一样,指向一个内存空间;所以使用 obj2 这个变量修改空间内的内容, obj 指向的空间也会跟着改变了
2、Arguments 是什么?
arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度 在调用函数时,我们所传递的实参都会在arguments中保存 arguments.length可以用来获取实参的长度 我们即使不定义形参,也可以通过arguments来使用实参。
它里面有一个属性叫做callee 这个属性对应一个函数对象,就是当前正在指向的函数的对象。
arguments的东西也是个对象,而且是一个特殊的对象,它的属性名是按照传入参数的序列来的,第1个参数的属性名是’0’,第2个参数的属性名是’1’,以此类推,并且它还有length属性,存储的是当前传入函数参数的个数,很多时候我们把这种对象叫做类数组对象。类数组对象和数组都是对象这个妈生的,但是数组是大哥比类数组对象多了很多其他的玩具(方法),类数组对象只是长得很像数组的弟弟而已。
3、typeof 和 instanceof 区别
typeof 运算符返回一个用来表示表达式的数据类型的字符串(检测数据类型)
instanceof 用来检测某个对象是不是另一个对象的实例。(用于限制参数的数据类型)
4、什么是闭包?
闭包是一个 可以访问其他函数内部变量的 函数(函数 + 上下文引用)
优缺点:
闭包的主要作用: 延伸了变量的作用范围, 因为闭包函数中的局部变量不会等着闭包函数执行完就销毁, 因为还有别的函数要调用它 , 只有等着所有的函数都调用完了他才会销毁 闭包会造成内存泄漏,如何解决:用完之后手动释放。
5、什么是内存泄漏?
内存泄露是指:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
6、说说你对原型(prototype)理解
JavaScript 中所有都是对象,在 JavaScript 中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript 的函数对象中都包含了一个” prototype”内部属性,这个属性所对应的就是该函数对象的原型。
当声明一个函数的时候,编译器会自动帮你创建一个与之对应的对象,称之为原型对象。
7、介绍下原型链(解决的是继承问题吗)
当访问一个对象的成员变量时,会首先访问它自身的成员变量,如果有则访问。没有则在原型中寻找,能找到就访问,不能找到则继续往原型的原型中寻找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
每一个对象都有原型,原型本身又是对象,所以原型又有原型,以此类推形成一个链式结构,称为原型链
原型链的作用: 继承
特点:
JavaScript 对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改。
8、介绍 this 各种情况
-
全局函数: 函数名() this指向window
-
对象方法: 对象名.方法名() this指向对象
-
构造函数:new 函数名() this指向new创建的实例对象
-
使用 call 和 apply 调用 this 是指定的那个对象
-
箭头函数中使用 this ,会访问上级作用域 this ,如果没有就是 window
9、for in 和 for of 的区别
-
推荐在循环对象属性的时候使用 for...in,在遍历数组的时候的时候使用 for...of
-
for...in 循环出的是 key,for...of 循环出的是 value
-
for...of 是 ES6 新引入的特性。修复了 ES5 引入的 for...in 的不足
-
for...of 不能循环普通的对象,需要通过和 Object.keys()搭配使用
10、谈谈你对 Javascript 垃圾回收机制的理解?
1、标记清除(mark and sweep)
这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”
垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了[ ]
2、引用计数(reference counting)
在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减 1,当这个值的引用次数变为 0 的时 候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间
在 IE 中虽然 JavaScript 对象通过标记清除的方式进行垃圾回收,但 BOM 与 DOM 对象却是通过引用计数回收垃圾的,也就是说只要涉及 BOM 及 DOM 就会出现循环引用问题