javascript 基础知识汇总

不问归期 提交于 2020-03-27 09:54:14

1、 在ES5中, 变量声明有两种方式,分别是var和function, var用于声明普通的变量,接收任意类型,function用于声明函数。另外ES6新增了let、const、import和class等声明方式,let用于声明普通变量(与var的区别在于拥有块级作用域,在作用域内不能重复声明),const用于声明静态变量,import用于声明模块,class用于声明类。

2、JS数据类型共有7种,分别是(1)数值Number、(2)字符串String、(3)布尔Boolean、(4)符号Symbol、(5)Null、(6)Undefined、(7)对象Object。其中Object是引用类型,其他都是原始类型,原始类型也成为基本类型或者是简单类型,因为其占用空间固定,是最简单的数据段,为了便于提升变量查询速度,将其存储在栈中(按值访问)。引用类型由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量的查询速度,因此其存储在堆中,存储在变量处的值是一个指针,指向存储对象的内存处(按址访问),对于引用类型的值,可以为其添加属性和方法,也可以改变和删除其属性和方法,但基本类型不可以添加属性和方法

3、javasrcipt可以通过typeof来判断原始数据类型,但不能判断引用类型,要知道引用类型的具体类型,可以通过Object原型上的toString来判断。

4、JS中的函数存在三种角色: 普通函数、构造函数、对象方法。同一个函数,调用方式不同,函数的作用不一样,所扮演的角色不一样,直接调用时就是普通函数,通过new创建对象时就是构造函数,通过对象调用时就是方法。

5、JS常用的内置对象有window、Date、Array、Json、RegExp等,window是浏览器在执行脚本时创建的一个全局对象,主要描述浏览器窗口相关的属性和状态,JSON主要用于对象的序列化,还有一个作用是深拷贝,RegExp即正则表达式,是处理字符串的利器。

6、函数原型链: JS是一种基于对象的语言,但在ES6之前是不支持继承的,为了具备继承的能力,Javasrcipt在函数对象上建立了原型对象prototype,并以函数对象为主线,从上至下,在JS内部构建了一条原型链,原型链把一个独立的对象联系在一起,Object则是所有对象的祖先,任何对象所建立的原型链最终都指向了Object,并以Object终结。简单来说就是建立了变量查找机制,当访问一个对象的属性时,先查找对象本身是否存在,如果不存在就去该对象所在的原型链上去找,直到Object对象为止,如果都没有找到该属性才返回undefined。因此,我们可以通过原型链来实现JS继承。

7、函数作用域: 函数作用域就是变量在声明他们的函数体以及这个函数体嵌套的任意函数体内都有定义的,因此,JS中没有块级作用域,只有函数作用域,这种设计导致JS中出现了变量提升的问题,简单来说就是,将变量声明提升到它所在的作用域的最开始的部分,为了解决变量提升带来的副作用,ES6新增了let命令来声明变量,let所声明的变量只在let命令所在的代码块内有效,所以不存在变量提升问题。

8、this指针: this指针存在于函数中,用以标识函数运行时所处的上下文。函数的类型不同,this指向规则也不同,对于普通函数,this始终指向全局对象,对于构造函数,this则指向新创建的对象,对于方法,this指向调用该方法的对象,另外,Function对象也提供了call、apply和bind等方法来改变函数的this的指向,其中,call和apply主动执行函数,bind一般在事件回调中使用,而call和apply的区别只是参数的传递方式不同。如果往深的地方去理解,无论什么函数,this是否被改变,本质上,this均指向触发函数运行时的那个对象,而在函数运行时,this的值是不能改变的。

9、new 操作符

函数的创建方式有三种,即显示声明,匿名定义和new function().JS中的函数既可以是函数,也可以是方法,还可以是构造函数,当使用new来创建对象时,函数就是构造函数,JS将新对象的原型链指向构造函数的原型对象,于是就在新对象和函数对象之间建立了一条原型链,通过新对象可以访问到函数对象原型prototype中的方法和属性。

10、闭包

通俗来讲,闭包是一个具有独立作用的静态执行环境,和函数作用域不同的是,闭包的作用域是静态的,可以永久保存局部资源,而函数作用域只存在于运行时,函数执行后立即销毁,因此,闭包可以形成一个独立的执行过程

11、单线程和异步队列

Javasrcipt是单线程语言,在浏览器中,当JS代码被加载时,浏览器会为其分配一个主线程来执行任务(函数),主线程会形成一个全局执行环境,执行环境在栈中采用后进先出的顺序来执行代码块,以保证所有的函数能按照正确的顺序执行

但在浏览器中,有一些任务是非常耗时的,比如ajax请求,定时器,事件等,为了保证非耗时任务不受影响,Javasrcipt在执行环境中维护了一个异性队列,并将这些耗时任务放入队列中进行等待,这些任务的执行时机并不确定,只有当主线程的执行任务执行完成后,主线程才会去检查异步队列中的任务是否需要开始执行,JS中的setTimeout和setInterval就是典型的异步操作,他们会被放入异步队列中等待,即使setTimeout(0)也不会被立即执行,需要等到当前同步任务结束后才会被执行。

12、异步通信ajax技术

Ajax是浏览器专门用来和服务器进行交互的异步通讯技术,其核心是XMLHttpRequest,通过该对象可以创建一个Ajax请求,Ajax请求是一个非常耗时的异步操作,当请求发出后,Ajax提供了两个状态位来描述请求在不同阶段的状态,这两个状态分别是readyState和status,readState通过5个状态码来描述一个请求的5个阶段:

0---请求未发送,初始化阶段

1---请求发送中,服务器还未收到一个请求

2---请求发送成功,服务器已接收到请求

3---服务器处理完成,开始响应请求,传输数据

4---客户端接收到请求,并完成了数据下载,生成了响应对象

status用于描述服务端对请求处理的情况,200表示正确响应了请求,404表示服务器找不到资源,500代表服务器内部异常

Ajax对象还可以设置一个timeout值,代表超时时间,切记,timeout只会影响readState,而不会影响status,因为超时只会中断数据传输,但不会影响服务器的处理结果,如果timeout设置的不合理,就会导致影响吗status是200,但response里却没有数据,这种情况就是服务器正确响应了请求,但数据的下载被超时中断了

为了防止XSS攻击,浏览器对Ajax请求做了限制,不允许Ajax跨域请求服务器,只允许请求和当前地址同域的服务器资源,但不限制脚本和标签发送跨域请求,比如script和img标签,因此可以利用脚本和标签发送跨域请求,即JSONP的原理

JSONP虽然可以解决跨域问题,但是只能是get请求,并且没有有效的错误捕获机制,为了解决这个问题,XMLHttpRequest Level2提出了CORS模型,即跨域资源共享,他不是一个新的API,而是一个标准规范,当浏览器发现该请求需要跨域时,就会自动在头信息中添加一个Origin字段,用以说明本次请求来自哪个源,服务器根据这个值,决定是否同意这次请求,随着移动终端的快速发展,Web技术的应用场景正变得越来越复杂,关注点分离原则在系统设计层面就显得越来越重要,而XMLHttpRequest是Ajax最古老的一个接口,因而不太符合现代化的系统设计理念,因此,浏览器提供了一个新的Ajax接口,即Fetch API,Fetch 是基于Promise思想设计的,而更符合关注点分离原则

13、模块化

历史上,javasrcipt规范一直没有模块化体系,即无法将一个大工程拆分成互相依赖的小文件,再用简单的方法拼接起来,在ES6之前,为了实现JS模块化编程,其设计思想,尽量静态化,使得编译时就能确定模块的依赖关系,即编译时加载,而CMD和AMD是在运行时确定依赖关系,即运行时加载

14、node.js

Node.js是一个基于Chrome V8引擎的javasrcipt运行环境,它的运行不依赖于浏览器作为宿主环境,而是和服务端程序一样可以独立运行,这使得JS编程第一次从客户端被带到服务器端,Node.js在服务器端的优势是,它采用单线程和异步I/O模型,实现了一个高并发、高性能的运行时环境。相比传统的多线程模型,Node.js实现简单,并且可以减少资源开销。

15、ES6

ES6是ECMAScript6.0的简写,是javasrcipt语言的下一代标准,已经在2015年6月正式发布了,它的目标是让JS能够方便的开发企业级大型应用程序,因此,ES6的一些规范正逐渐向JAVA,C#等后端语言标准靠近,ES6规范中,比较重大的变化:
1)新增let、const命令来声明变量,和var相比,let声明不存在变量提升问题,但没有改变JS弱类型的特点,依然可以接受任意类型变量的声明,const声明的变量不允许在后续逻辑中改变,提高了JS语法的严谨性

2)新增解构赋值,rest语法,箭头函数,这些都是为了让代码看起来更简洁而包装的语法糖

3)新增模块化,这是JS走向规范的重要一步,让前端更方便的实现工程化

4)新增类和继承的概念,配合模块化,JS也可以实现高复用,高扩展的系统结构

5)新增模板字符串功能,高效简洁,结束拼接字符串的时代

6)新增Promise对象,解决异步回调多层嵌套的问题

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!