js的数据类型以及堆栈
(1)基本类型:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配。
6种基本数据类型有Undefined、Null、Boolean、Number 、 String和Symbol,它们是直接按值存放的,所以可以直接访问。
(2)引用类型:存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另一个位置。每个空间大小不一样,要根据情况开进行特定的分配。
当我们需要访问引用类型(如对象,数组,函数等)的值时,首先从栈中获得该对象的地址指针,然后再从堆内存中取得所需的数据。
JS的预处理机制
- 变量先声明再定义
- 声明式函数进行预处理,既声明又定义( 声明式函数:function fn(){} )
- 变量和声明式函数同名时,函数先声明和定义,因此变量总会覆盖函数
例子:
var fn = 3
var fn = function () {
console.log('aaa')
}
function fn() {
console.log('bbb')
}
fn(); // aaa
解释:1变量和声明式函数同名时,函数先声明和定义 var fn = function(){console.log('bbb')}
2.声明变量 var fn;var fn;
3.定义变量 fn = 3; fn = function () { console.log('aaa') };
4.后面的覆盖前面的 最终fn = function () { console.log('aaa') }
5.执行fn()函数,打印出‘aaa’
例子变形:
fn(); // bbb
var fn = 3
var fn = function () {
console.log('aaa')
}
function fn() {
console.log('bbb')
}
1.声明式函数声明和定义 var fn = function(){console.log('bbb')}
2.变量声明 var fn; var fn;
3.执行fn(); 打印‘bbb’
例子再变形
var fn = 3
fn();
var fn = function () {
console.log('aaa')
}
function fn() {
console.log('bbb')
}
前面的和上面一样,对声明函数 声明定义,对变量声明然后就多了 fn = 3;对变量定义;然后执行fn();得到结果就是fn is not a function
函数内变量声明有无var的区别
(1)有var的声明,作用域在函数内部,外部直接获取不到
function ss() {
var a = 5;
}
ss();
alert(a);//a未定义
(2)无var的声明,为全局函数,外部可以直接使用
function ss() {
a = 5;
}
ss();
alert(a);//5