2021-最新Web前端经典⾯试试题及答案-史上最全前端⾯试题
(含答案)---JavaSc。。。
add(1)(2) //3
add(1,2,3)(10) //16
add(1)(2)(3,4)(5) //15
JavaScript⾯试真题
1. ★★ 介绍⼀下JS的内置类型有哪些?
1. 空类型:null
2. 未定义:undefined
3. 布尔:boolean
4. 数字:number
5. 字符串:string
6. 符号:symbol(ES6新增)
7. 对象:object
除了对象之外,其他为基本类型.
2. ★★★★ 介绍⼀下 typeof 区分类型的原理
typeof原理:不同的对象在底层都表⽰为⼆进制,在Javascript中⼆进制前(低)三位存储其类型信息。
000: 对象
deport010: 浮点数
100:字符串
110: 布尔
1: 整数
/*----------------------------------------------*/
typeof null 为"object", 原因是因为不同的对象在底层都表⽰为⼆进制,在Javascript中⼆进制前(低)三位都为0的话会被判断为Object类型,null的⼆进制表⽰全为0,3. ★★★ 介绍⼀下类型转换
/*-------------------显式转换---------------------*/
1. toString() // 转化为字符串,不可以转null和underfined
2. Number() // 转换为数字,字符串中有⼀个不是数值的字符,返回NaN
3. parseInt() // 转换为数字,第⼀个字符不是数字或者符号就返回NaN
4. String() // 转换为字符串,
5. Boolean() // 转换为布尔值
/*-------------------隐式转换(+-)---------------------*/
当 JavaScript 尝试操作⼀个 "错误" 的数据类型时,会⾃动转换为 "正确" 的数据类型
android下载地址11. num + "" -> String
2. num + bool -> num
// 当加号运算符时,String和其他类型时,其他类型都会转为 String;其他情况,都转化为Number类型
3. string - num -> num
// 其他运算符时,基本类型都转换为 Number,String类型的带有字符的⽐如:
4. 'a1' - num -> NaN
// 与undefined ⼀样。
/*-------------------隐式转换(逻辑表达式)---------------------*/
1. 对象和布尔值⽐较
对象和布尔值进⾏⽐较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字
[] == true; //false []转换为字符串'',然后转换为数字0,true转换为数字1,所以为false
2. 对象和字符串⽐较
对象和字符串进⾏⽐较时,对象转换为字符串,然后两者进⾏⽐较。
[1,2,3] == '1,2,3' // true [1,2,3]转化为'1,2,3',然后和'1,2,3', so结果为true;
3. 对象和数字⽐较
对象和数字进⾏⽐较时,对象先转换为字符串,然后转换为数字,再和数字进⾏⽐较。
[1] == 1; // true `对象先转换为字符串再转换为数字,⼆者再⽐较 [1] => '1' => 1 所以结果为true
4. 字符串和数字⽐较
字符串和数字进⾏⽐较时,字符串转换成数字,⼆者再⽐较。
'1' == 1 // true
5. 字符串和布尔值⽐较
字符串和布尔值进⾏⽐较时,⼆者全部转换成数值再⽐较。
'1' == true; // true
6. 布尔值和数字⽐较
布尔值和数字进⾏⽐较时,布尔转换为数字,⼆者⽐较。
true == 1 // true
4. ★★★★ 说说你对 JavaScript 的作⽤域的理解。什么是作⽤域链?
在 JavaScript 中有两种作⽤域类型:
1. 局部作⽤域:只能在函数内部访问它们
2. 全局作⽤域:⽹页的所有脚本和函数都能够访问它
JavaScript 拥有函数作⽤域:每个函数创建⼀个新的作⽤域。
作⽤域决定了这些变量的可访问性(可见性)。
函数内部定义的变量从函数外部是不可访问的(不可见的)。
作⽤域链:
当查变量的时候,会先从当前上下⽂的变量对象中查,
如果没有到,就会从⽗级(词法层⾯上的⽗级)执⾏上下⽂的变量对象中查,⼀直到全局上下⽂的变量对象,也就是全局对象。
这样由多个执⾏上下⽂的变量对象构成的链表就叫做作⽤域链
5. ★★ 解释下 let 和 const 的块级作⽤域
/*------------let-----------*/
phpmyadmin怎么登陆1. let声明的仅在块级作⽤域内有效,
2. let不会发⽣变量提升的现象,所以⼀定要在定义后使⽤,否则报错。
3. 暂时性死区:只要块级作⽤域内存在let命令,它所声明的变量就绑定这个区域,不再受外部影响。
4. 不允许重复声明,let不允许在相同作⽤域内,重复声明同⼀个变量:
/*-----------const----------*/
1. 声明⼀个只读的常量。⼀旦声明,常量的值就不能改变。
2. ⼀旦声明,就要⽴即初始化,否则也报错。
3. const命令声明的常量也不提升,同样存在暂时性死区,只能在声明的位置后使⽤。
4. 也不可以重复声明。
6. ★★★★ 说说你对执⾏上下⽂的理解
执⾏上下⽂有且只有三类,全局执⾏上下⽂,函数上下⽂,与eval上下⽂(eval⼀般不会使⽤)
1. 全局执⾏上下⽂:
全局执⾏上下⽂只有⼀个,也就是我们熟知的window对象,我们能在全局作⽤域中通过this直接访问到它
2. 函数执⾏上下⽂
函数执⾏上下⽂可存在⽆数个,每当⼀个函数被调⽤时都会创建⼀个函数上下⽂;
需要注意的是,同⼀个函数被多次调⽤,都会创建⼀个新的上下⽂。
3. 执⾏上下⽂栈(下⽂简称执⾏栈)也叫调⽤栈,
执⾏栈⽤于存储代码执⾏期间创建的所有上下⽂,具有LIFO(Last In First Out后进先出,也就是先进后出)的特性。
JS代码⾸次运⾏,都会先创建⼀个全局执⾏上下⽂并压⼊到执⾏栈中,之后每当有函数被调⽤,都会创建⼀个新的函数执⾏上下⽂并压⼊栈内;由于执⾏栈LIFO的特性7. ★★★ 对闭包的看法,为什么要⽤闭包?说⼀下闭包的原理以及应⽤场景?闭包的 this 指向问题?
闭包的作⽤:
1. 在外部访问函数内部的变量
2. 让函数内的局部变量可以⼀直保存下去
3. 模块化私有属性和公共属性
闭包的原理:
全局变量⽣存周期是永久,局部变量⽣存周期随着函数的调⽤介绍⽽销毁。
闭包就是在函数中定义且成为该函数内部返回的函数的⾃由变量的变量,该变量不会随着外部函数调⽤结束⽽销毁。
(注:不光是变量,函数内声明的函数也可以形成闭包)
当函数可以记住并访问所在的词法作⽤域,即使函数是在当前词法作⽤域之外执⾏,这时就产⽣了闭包。
闭包的应⽤场景:
// 1. 返回值最常见的⼀种形式
var fun_1 = function () {
var name = "limo";
return function () {
return name;
}
}
var fun_1 = function () {
var name = "limo";
return name;
}
var fu_1 = fun_1();
console.log("fu_1():" + fu_1());
// 2. 函数赋值⼀种变形的形式是将内部函数赋值给⼀个外部变量
var f2;
var fun_2 = function () {
localhost下载var name = "limop"
var a = function () {
return name;
}
}
f2 = a;
}
f2();
console.log(f2);
// 3. 函数参数通过函数参数引⽤内部函数产⽣闭包
var fn_3 = function (f3) {
console.log(f3);
}
function fun_3() {
var name = "limo";
var a = function () {
return name;
}
fn_3(a)
}
fun_3();
// 4. IIFE(⾃执⾏函数)
var fn_4 = function (f4) {
console.log(f4);
};
(function fun_4() {
var name = "limo";
var a = function () {
return name;
}
fn_3(a)
javaweb和html区别})();
// 5. 循环赋值
function foo(){
web前端基础面试题var arr = [];
for(var i = 0; i < 10; i++){
arr[i] = (function(n){
return function(){
return n;
}
})(i)
}
return arr;
}
var bar = foo();
console.log(bar[3]());
// 6. getter和setter
/
/ getter和setter函数来将要操作的变量保存在函数内部,防⽌暴露在外部 var getValue, setValue;
(function () {
var num = 0
getValue = function () {
return num
}
setValue = function (v) {
if (typeof v === 'number') {
num = v
}
}
})();
console.log(getValue()); //0
console.log(getValue()); //0
setValue(10);
console.log(getValue()) //10
// 7.迭代器(计数器)
var add = function(){
var num = 0;
return function(){
return ++num;
}
}();
console.log(add());
console.log(add());
function setUp(arr){
var i = 0;
return function(){
return arr[i++];
}
}
var next = setUp(['Steve','Alex','LingYi']);
console.log(next());
console.log(next());
console.log(next());
// 8.触发事件
var btn = document.querySelector('.btn')
lor = 'red'//保持对上层作⽤域的引⽤ btn
console.log('abc')
// this
}
}
闭包的this指向问题:
var myNumber = {
value: 1,
add: function(i){
var helper = function(i){
console.log(this);
this.value += i;
}
helper(i);
}
}
myNumber.add(1);
1.this指向window对象(因为匿名函数的执⾏具有全局性,所以其this对象指向window);
2.不能实现value加1(每个函数在被调⽤时都会⾃动取得两个特殊变量,this和arguments,内部函数在搜索这两个对象时,只会搜索到其活动对象为⽌,所以不能实现
3.修改代码实现正确功能
第⼀种解决⽅法:
var myNumber={
value:1,
add:function(i){
var that=this;//定义变量that⽤于保存上层函数的this对象
var helper=function(i){
console.log(that);
that.value+=i;
}
helper(i);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论