有关JS的基础面试题

  1. 判断数据类型
    typeof返回的类型
    number string boolean undefined function object
    基本数据类型
    Undefined Null Boolean Number String
    值类型
    数值、布尔值、null、undefined
    引用类型
    对象、数组、函数

  2. 声明函数作用提升,声明变量和声明函数的提升有什么区别?
    (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);

  1. 预编译
    程序执行的前一刻创建活动对象(函数作用域/执行期上下文/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
发布了15 篇原创文章 · 获赞 0 · 访问量 81

猜你喜欢

转载自blog.csdn.net/weixin_45806273/article/details/104024161