-
判断数据类型
typeof返回的类型
number string boolean undefined function object
基本数据类型
Undefined Null Boolean Number String
值类型
数值、布尔值、null、undefined
引用类型
对象、数组、函数 -
声明函数作用提升,声明变量和声明函数的提升有什么区别?
(1) 变量声明提升:变量申明在进入执行上下文就完成了。
只要变量在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(2) 函数声明提升:执行代码之前会先读取函数声明,意味着可以把函数申明放在调用它的语句后面。
只要函数在代码中进行了声明,无论它在哪个位置上进行声明, js引擎都会将它的声明放在范围作用域的顶部;
(3) 变量or函数声明:函数声明会覆盖变量声明,但不会覆盖变量赋值。
同一个名称标识a,即有变量声明var a,又有函数声明function a() {},不管二者声明的顺序,函数声明会覆盖变量声明,也就是说,此时a的值是声明的函数function a() {}。注意:如果在变量声明的同时初始化a,或是之后对a进行赋值,此时a的值变量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);
-
预编译
程序执行的前一刻创建活动对象(函数作用域/执行期上下文/GO/AO)
GO{}
将var关键字声明的变量作为GO对象的属性名,赋值为undefined 注意:有重名不新增属性名直接替换
GO{
a : undefined,
b : undefined,
}
检测function声明的函数,函数名作为GO对象的属性名,赋值为函数体
如果有和变量重名,注意:不新增属性名直接替换值
GO{
a : undefined,
b : undefiend,
fun : function…
}函数运行的前一刻创建活动对象AO AO{} 将var声明的变量和形参作为活动对象的属性名,值为undefined 有重名不新增属性名直接替换 AO{ m : undefined, n : undefined, f : undefined, } 将实参和形参的值统一 AO{ m : 1, n : 2, f : undefined, } 检测function声明的函数,函数名作为AO对象的属性名,赋值为函数体 如果有和变量重名,注意:不新增属性名直接替换值 AO{ m : 1, n : 2, f : undefined, }
function fun(m,n) {
var f;
console.log(a); // 10
// console.log(a + c); //报错 10 + 未定义
console.log(++a + b++);//NAN 11 + undefined NaN Number(undefiend)
c = 10;
console.log(a + c++); //21 c = 11 11 + 10 = 21 c++ = 11
console.log(m + n); // 3 1+2 = 3
console.log(m + b); // 22 1 + undefined = NaN
console.log(typeof m); //number
}
a = 10;
fun(1,2);
b = 20;
console.log(c) //11