1. let,const和var
var,存在变量提升,作用域是函数作用域,没有块的概念,可以跨块访问,不可以跨函数访问。
let,用于创建变量,不存在变量提升,只能在块级作用域(即最近的两个{})中访问,不可以跨块访问,不可以跨函数访问。
const,用于创建常量,只能在块级作用域中访问,使用时必须赋值且只能赋值一次,赋值后不可更改。
2. 基本类型和引用类型
基本类型:Number、String、Boolean、Null、Undefined
引用类型:Object(包括函数、数组、对象)
存储方式:
基本类型存放在栈中,直接存放变量的值。
引用类型存放在堆中,存放的的是变量的引用(也就是指针,指向存储对象的位置)。
原因:基本类型所占存储空间较小,可以直接存放在栈中。引用类型存放多个值,所占空间大,且直接存放在栈中易造成混乱。
3. 类型转换
JavaScript是一种弱类型的语言,即不必声明变量的类型,一个变量可以拥有多个类型。变量的类型随着它的使用场景不同发生变化。
这里就涉及到等于和严格等于的问题。等于(==),当等式两边的变量值相等时(变量类型会自动转换)即为true。严格等于,需要等式两边的变量的值和类型都相同,才为true。
4. null和undefined
null 对象不存在
undefined 变量已创建,但未赋值
console.log(null == undefined) //true
console.log(null === undefined) //false
5.变量的作用域
分为全局作用域和函数作用域。
(1)每调用一次函数,就会创建一个新的作用域,函数执行完毕,作用域销毁。
(2)函数作用域可以访问到全局作用域的变量,全局作用域不可以访问到函数作用域的变量。
(3)在函数作用域中访问某变量时,会先在本作用域寻找,如果找不到,再向外面一层的作用域寻找…直到在全局作用域中寻找。
【es6中引入了块级作用域,以{}为标志,之后会针对这一块再专门写一篇文章】