javascript一共有八种数据类型:
7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(es6新增)、Biglnt(es10新增)。
1种引用数据类型:Object(由一组无序的名值对组成),里面包含function、Array、Date等。
javascript不自持任何创建自定义类型的机制,而所有值最终都是上述的八种数据类型之一。
1.基本数据类型:直接存储在栈(stack)中,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
2.引用数据类型:同时存储在栈(stack)和堆(heap)中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当世界其寻找引用值时,会首先检索在栈中的地址,取得地址后从堆中获得实体。
四种方法:
1. type of 2. instance of 3. constructor 4. Object.prototype.toString.call()
1.type of 基本数据类型中:Number、String、Boolean、undefined以及引用数据类型中Function,可以使用typeof检测数据类型,分别返回对应的数据类型小写字符。 (用typeof检测构造函数创建的Number、String、Boolean都返回Object,基本数据类型中:null。引用数据类型:Array、Object、Date、RegExp。不可以使用typeof检测。都会返回小写的object。)
2.instance of 除了使用type of来判断,还可以使用instance of。instance of运算符需要指定一个特定的类型,它用来判断这个构造函数的原型是否在给定对象的原型链上。 (基本数据类型中:Number、String、Boolean。字面量值不可以用instance of检测,但是构造函数可以。还需要注意null和undefined都返回了false,这是因为他们本身的类型就是他们本身,并不是object创建出来了他们,所以返回了false。)
3.constructor (1)constructor使prototype对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此实例对象也能使用constructor属性的。
(2)如果输出一个类型的实例的constructor,它会指向Number的构造函数,因此,可以使用num.constructor==Number来判断一个变量是不是Number类型的。
(3)除了undefined和null之外,其他类型都可以通过constructor属性来判断类型。
4.使用Object.prototype.tostring.call()检测对象类型 可以通过toString()来获取每个对象的类型。为了每个对象都能通过是Object.prototype.tostring.call()来检测,需要以Function.prototype.call()或者Function.prototype.apply()的形式来调用,传递要检查的对象作为第一个参数,称为thisArg
5.万能的方法:jquery.type() 如果对象是undefined或者null,则返回相应的”undefined或null“
6.自己也可以封装一个获取变量的准确类型的函数
1.单例模式 保证一个类仅有一个实例,并提供一个访问它全局的访问点。
2.核心 确保只有一个实例,并提供全局访问
3.实现 在VUE脚手架项目开发中,我们需要对axios进行请求拦截,响应拦截。多次调用封装好的axios实例也仅设置一次,封装后的axios就是要一个单例。
4.环境切换 我们的项目环境可能有开发环境、测试环境和生产环境。我们通过node的环境变量来匹配我们的默认的接口的url前缀。axios.defaults.baseURL可以设置axios的默认请求地址就不多说了。
5.设置请求超时 通过axios.defaults.timeout设置默认的请求超时时间。例如超过了十秒,就会告知用户当前请求超时,请刷新。
6.post请求头的设置 post请求的时候,我们需要加上一个请求头,所以可以在这里进行一个默认的设置,即设置post的请求头为application/x-www-form-urlencoded;charse=UTF-8
7.请求拦截 我们在发送请求前可以进行一个请求的拦截,因为有些请求是需要用户登陆之后才能访问的,或者post请求的时候,我们需要序列化我们提交的数据。这时候,我们可以在请求被发送之前进行一个拦截,从而进行我们想要的操作。
8.应用场景 封装vue和axios,任何vue项目可以直接复用,实现axios同意调用,单通道修改vuex。
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
因为工厂模式就相当于创建实例化对象的new,我们经常要根据类class生成实例化对象,如A a= new A()工厂模式也是用来创建实例化对象的,所以以后new时就要多个心眼,是否可以考虑工厂模式,虽然这样做可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
vue.js则是采用数据劫持结合发布订阅的者模式的方式,通过Object.definePropety()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
在ES5中,声明变量只有var和function两种形式。但是因为var声明变量会有一定的缺点(内层变量可能覆盖外层变量的问题以及用来计数的循环变量泄露为全局变量),ES6题出了使用let和const声明变量。
1.是否存在变量提升
var声明的变量存在变量提示(将变量提示到当前作用域的顶部)。即变量可以在声明前调用,值为undefined。let和const不存在变量提升。即他们所声明的变量一定要在声明后使用,否则报ReferenceError错。2.是否存在暂时性死区 在代码块内,使用let命令声明变量之前,该变量都是不可用的。在语法上成为"暂时性死区"。
let和const存在暂时性死区,只要块级作用域内存在let命令,它声明的变量就”绑定“(binding)这个区域,不再受外部影响。
3.是否允许重复变量声明
var允许重复变量声明let和const在同一作用域下不允许重复变量声明。4.是否存在块级作用域
var不存在块级作用域let和const存在块级作用域5.什么是块级作用域 ES5中作用域有:全局作用域、函数作用域。没有块作用域的概念。
6.是否能修改声明的变量
var和let可以const声明一个只读的变量。一旦声明,常量的值就不能改变。const声明的变量不得不改变值,也就是说,const一旦声明变量,就必须立即初始化,不能留到以后赋值。