一、数据类型
1. 变量
- 用来存放数据,保存的数据可以修改
var 、 let
声明的就是变量
2. 常量
- 用来存放数据,保存的数据不可修改
const
声明的就是常量- const声明常量的时候必须
赋初始值
- const 声明的值类型是不允许重新赋值的
- const 声明的
引用类型
,在不进行重新赋值的前提下,可以进行修改
3. 变量和常量的本质
- 无论是变量还是常量,其本身都是
数据
,也需要在内存中占用内存空间,保存在内存的栈结构分区中
4. 面试:let、const、var的区别
- let 和 const 不允许
重复声明
,var是可以重复声明的 - let 和 const 没有
变量提升
,必须先声明后使用;var 存在变量提升,可以先使用后声明 - let 和 const 有
块级作用域
,var没有
5. JS数据类型
5.1 基本(值)类型
- Number
- String
- Boolean
- null
- undefinded
- Symbol:唯一的数据
- BigInt:任意精度的整数
undefined 和 null 的区别
- undefined:定义了但没有赋值;或者没有return的函数
- null:定义了且赋值为null
初始值赋值为null,表明现在数据不明,但将来会赋值为对象
结束时赋值为null:让对象成为垃圾对象,被垃圾回收器回收
- 值类型的传递 —— 传递值
- 基本数据类型的值在
栈空间
中存储,如果修改了数据,则是把原来的值直接干掉,重新存放新的值
5.2 引用类型(object)
- Object
- Function
- Array
- Date
- RegExp
当Number、String、Boolean调用方法或属性时,就会变为
基本包装类型
(引用类型)
-
引用类型的传递 —— 传递的是引用(地址)
-
引用数据类型的对象在
堆空间
中存储,该空间的地址在栈空间中存储,如果修改栈空间存储的地址,则指向发生变化,也叫引用发生了变化,此时是在堆空间中重新指向了一个新的内存空间(存储了一个新的对象)
6. typeof 运算符
语法:
typeof 变量名
typeof(变量名)
- 判断变量中存储的
数据类型
- typeof可以判断出的类型:String、Number、Boolean、undefined、Symbol、function
let a = 10
console.log(typeof a) //number
let b = 'hha'
console.log(typeof b) // string
let c = true
console.log(typeof c) // boolean
let d = Symbol(23)
console.log(typeof d) // symbol
let e
console.log(typeof e) // undefined
let fun = function() {
}
console.log(typeof fun) // function
- typeof只能判断出是引用类型(object),但判断不出具体是哪种引用类型
- 即:
typeof不能判断 object和array、object和null
let f = null
console.log(typeof f) // object
let obj = {
name:'dudu'
}
console.log(typeof obj) // object
let arr = [2,3,12]
console.log(typeof arr) // object
let date = new Date()
console.log(typeof date) // object
7. instanceof 运算符
语法
对象 instanceof 类型
- 判断当前实例对象是否属于某种数据类型
- 判断右侧函数的显示原型是否在左侧对象的原型链上
8. === 运算符
- ===:称为
等同符
,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false - == :称为
等值符
:当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较
类型转换规则:
- 如果等号两边是boolean、string、number三者中任意两者进行比较时,优先转换为数字进行比较。
- 如果等号两边出现了null或undefined,null和undefined除了和自己相等,就彼此相等
注意:NaN==NaN //返回false NaN不等于任何值
除了判断是否等于 ==null 外,其他一律用 ===
二、对象
1. 对象是什么
- 生活中的对象:看得到、摸得着的具体的某个事物,如:正在看视频的这个手机
- 对象(object)是键值对(k:v)的集合,表示属性和值得映射关系
2. 对象的创建方式
2.1 字面量的形式
let obj = {
name:'哈哈',
age:10
}
2.2 new Object() 的形式
let obj = new Object()
obj.name = '嘟嘟'
2.3 工厂函数的形式
function createObject(name,age){
var obj = new Object()
obj.name = name
obj.age = age
return obj
}
var obj1 =createObject('小明',10)
var obj2 =createObject('小红',20)
console.log(obj1,obj2)
2.4 构造函数的形式
function Person(name,gender){
this.name = name
this.gender = gender
this.sayHi=function(){
console.log('您好,我是:'+this.name)
}
}
var per = new Person('小明','男')
per.sayHi()
console.log(per)
- new 做的四件事
- 函数体内部自动创建一个空白对象
- 函数的上下文(this)会指向这个对象
- 函数体内的语句会执行
- 函数会自动返回上下文对象,即使函数没有return语句
2.5 通过 class 创建对象
- class 形式中,
构造器内
的属性都是在实例上
的 - class中的方法,如果是通过
赋值符号
定义的,则该方法在实例
上,否则该方法是在原型上
class Student{
// 构造器,构造器中的属性都是在实例上的
constructor(name,age,gender){
this.name = name
this.age =age
this.gender = gender
}
// 在原型上
sayHi(){
console.log(`您好,我是${
this.name},今年${
this.age}岁了,是${
this.gender}生`)
}
// 在实例上
eat=()=>{
console.log('吃东西啊')
}
}
// 实例化
const stu = new Student('dudu',18,'女')
stu.sayHi()
stu.eat()
console.log(stu)