1.介绍JavaScript的基本数据类型
- String,Number,Boolean,Null,undefined
- Symbol(es6新增)
2.说说JavaScript的基本规范
3.JavaScript有几种类型的值?(堆:原始数据类型和 栈:引用数据类型),你能画一下他们的内存图吗?
- 声明变量时不同的内存分配:
- 原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。 - 引用值:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
- 原始值:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。
- 不同的内存分配机制也带来了不同的访问机制
- 在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的按引用访问。
- 而原始类型的值则是可以直接访问到的。
- 复制变量时的不同
- 原始值:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
- 引用值:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。(这里要理解的一点就是,复制对象时并不会在堆内存中新生成一个一模一样的对象,只是多了一个保存指向这个对象指针的变量罢了)。多了一个指针
- 参数传递的不同(把实参复制给形参的过程)。首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
- 原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
- 引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。
- 相关知识链接
4.什么是window对象? 什么是document对象
- Window – 代表浏览器中一个打开的窗口
- document对象 – 代表整个HTML 文档,可用来访问页面中的所有元素
- 相关知识点链接
5.null,undefined的区别
- Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。
- Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
- null是javascript的关键字,可以认为是对象类型,它是一个空对象指针,和其他语言一样都代表“空值”,不过undefined却是javascript才有的。undefined是在ECMAScript第三版引入的,为了区分指针对象和未初始化的变量,它是一个预定义的全局变量。没有返回值的函数返回为undefined,没有实参的形参也是undefined。
- javascript权威指南:null 和 undefined 都表示 “值的空缺”,你可以认为 undefined 是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。
- javascript高级程序设计:在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。null值则是表示空对象指针。
-
6.函数声明与函数表达式的区别?
在Javscript中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。
7.作用域什么时候生成的?
页面加载–>创建window全局对象,并生成全局作用域–>然后生成执行上下文,预解析变量(变量提升),生成全局变量对象;
8.什么是作用域和作用域链,请解释一下?
作用域(scope)
通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
作用域链(scope chain)
一般情况下,变量取值到创建这个变量的函数的作用域中取值。但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
9.BOM 和 DOM 的关系
BOM全称Browser Object Model,即浏览器对象模型,主要处理浏览器窗口和框架。
DOM全称Document Object Model,即文档对象模型,是 HTML 和XML 的应用程序接口(API),遵循W3C 的标准,所有浏览器公共遵守的标准。
JS是通过访问BOM(Browser Object Model)对象来访问、控制、修改客户端(浏览器),由于BOM的window包含了document,window对象的属性和方法是直接可以使用而且被感知的,因此可以直接使用window对象的document属性,通过document属性就可以访问、检索、修改XHTML文档内容与结构。因为document对象又是DOM的根节点。
可以说,BOM包含了DOM(对象),浏览器提供出来给予访问的是BOM对象,从BOM对象再访问到DOM对象,从而js可以操作浏览器以及浏览器读取到的文档。
10.call、apply和bind函数存在的区别:
1.都可以改变this指向,其本质是调用一个对象的一个方法,用另一个对象替换当前对象。
2.bind返回对应函数, 便于稍后调用; apply, call则是立即调用。
3.apply:最多只能有两个参数——新this对象和一个数组argArray。call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。
11.什么是内存泄漏?哪些操作会造成内存泄漏
程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。
对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak).
- 意外的全局变量引起的内存泄露
- 闭包引起的内存泄露
- 没有清理的DOM元素引用
- 被遗忘的定时器或者回调
- 子元素存在引起的内存泄露
12.JS的垃圾回收机制是什么?你得理解?
最常使用的方法叫做"引用计数"(reference counting):语言引擎有一张"引用表",保存了内存里面所有的资源(通常是各种值)的引用次数。如果一个值的引用次数是0
,就表示这个值不再用到了,因此可以将这块内存释放。JS的垃圾回收机制是为了以防内存泄漏,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。
13.说几个系统预定义函数(全局方法)?
全局对象描述
全局对象是预定义的对象,作为 JavaScript 的全局函数和全局属性的占位符。通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。全局对象不是任何对象的属性,所以它没有名称。
parseInt() / parseFloat() : 将一个字符串转为数字
isNaN() : 判断是否不是一个数值或者数值类型字符串
encodeURI() / decodeURI(): 对字符串进行编码与解码
eval() : 将JS代码格式的字符串当作js执行
14.讲几个常见的js内置对象,他们有什么好处
Object 是 JavaScript 中所有对象的父对象
数据封装类对象:Object、Array、Boolean、Number 和 String
其他对象:Function、Arguments、Math、Date、RegExp、Error
15. new操作符到底干了什么
- 创建一个新对象
- 将构造函数的作用域赋值给新对象(所以this指向了这个新对象)
- 执行构造函数的代码(为这个新对象添加属性)
- 返会新对象
16.什么是时间戳?如何获取时间戳?
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总 毫秒数.
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf())
console.log(date.getTime())
// 2. 简单写可以这么做
var now = +new Date();
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();