js基本数据类型
JS数据类型:JS的基本类型和引用类型.
基本类型:String、Number、boolean、null、undefined
引用类型:object.里面包含的 function、Array、Date
用typeof检测基本数据类型返回的分别是什么?
{ } 、[ ] 输出 object
检测String返回string 字符串
检测Number返回Number 数据类型
检测Boolean返回Boolean 布尔值
检测Undefined返回undefined 没有初始化、定义的值
检测Null返回Object 不存在的对象
NaN返回Number Number 中的特殊数值
Object返回function
值类型和引用类型的区别
值类型:占用空间固定,保存在栈中
引用类型:占用空间不固定,保存在堆中
深拷贝
概念:深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而深拷贝是层层拷贝
深拷贝可以用递归来实现
let arr = [100, [12, {
a: 'hello',
b: 'vue'
}], {
c: [11, 12]
}]
function copy(obj) {
// 首先判断obj如果不是对象或者为null让它直接返回
if (typeof obj !== 'object' || obj == null) {
return obj
}
// 判断这个对象是否存在Array的原型链上,如果存在就在newArr添加一个空数组否则添加一个空对象
let newArr = obj instanceof Array ? [] : {}
// 循环它里边的每一项
for (var i in obj) {
// 判断是它自身存在的属性
if (obj.hasOwnProperty(i)) {
// 对它里边的每一项再次进行判断
newArr[i] = copy(obj[i])
}
}
return newArr
}
let arr2 = copy(arr)
console.log(arr) //a = holle
arr[1][1].a = 'happy'
arr[2].c[1] = 89
console.log(arr2) //a = happy
变量计算和类型转换
使用加号运算符实现字符串拼接
var s1 = 123 , s2 = "def";
console.log(s1 + s2); //返回 123def
console.log(10+'10'); // 1010
== 和 === 有什么区别
== 表示相同
比较的是物理地址,相当于比较两个对象的 hashCode ,肯定不相等的类型不同,值也可能相等
=== 表示严格相同
简单理解就是 == 就是先比较数据类型是否一样。=== 类型不同直接就是 false
原型和原型链
原型的概念
我们创建的每一个函数,都有一个prototype属性,这个属性对应着一个对象就是原型对象,如果函数以构造函数
的形式调用时,他所创建的对象中都有一个__proto__属性这个属性就是原型
原型链的概念
当一个对象调用自身不存在的属性和方法,会去自己[proto]关联父级元素中的原型中查找,如果没找到就会去父级的父级原型去查找,直到找到属性或方法或者undifind才停止
class 类
ES5中的类
ES5中如果要生成一个对象实例,需要先定义一个构造函数,然后通过new操作符来完成
实例:
ES6中的类
ES6引入了class(类)这个概念,通过class关键字可以定义类该关键字的出现使得javascript在对象写法上更加清晰,更像是一种面向对象的语言。
实例:
注意项:
1.在类中声明方法的时候,千万不要给该方法加上function关键字
2.方法之间不要用逗号分隔,否则会报错由上面代码可以看出类实质上就是一个函数。类自身指向的就是构造函数 所以可以认为ES6中的类其实就是构造函数的另外一种写法!
constructor方法是类的构造函数的默认方法,通过new命令生成对象实例时,自动调用该方法
constructor中定义的属性可以称为实例属性(即定义在this对象上),constructor外声明的属性都是定义在原型上的,可以称为原型属性(定义在class上)。
hasOwnProperty()函数用于判断属性是否是实例属性。其结果是一个布尔值, true说明是实例属性,false说明不是实例属性。
in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。
class不存在变量提升,所以需要先定义再使用。因为ES6不会把类的声明提升到代码头部,但是ES5就不一样,ES5存在变量提升,可以先使用,然后再定义
class继承
instanceof
instanceof判断一个引用类型变量所指向的对象是否是一个类的实例,即它左边的对象是否是它右边的类的实例,该运算符返回boolean类型的数据