前端面试题
1、let const var 有什么区别?
let 声明的变量只在它所在的代码块有效;
for (let i = 0; i< 10; i++) {
console.log(i)
}
console.log('12300')
console.log(i) // i is not defined
上面代码中,计数器 i 只在for循环体内有效,在循环体外引用就会报错。 如 var 代码:
var a = [];
for (let i = 0; i< 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6]() // 10
变量i是var声明的,在全局范围内有效,所以每一次玄幻,新的i值都会覆盖旧值,导致最后输出的是最后一轮的值。
但是如果使用let ,声明的变量仅在块级作用域内有效,最后输出的是6, 如下:
var b = [];
for (let i = 0; i< 10; i++) {
b[i] = function () {
console.log(i)
}
}
b[6]() // 6
不存在变量提升;
let 不想var 那样会发生变量提升,因此,变量需要先声明然后使用,否则报错;
// var 的情况
console.log(foo) // undefined
var foo = 2;
// let 的情况
console.log(foo) // 报错
let foo
暂时性死区
块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响;如下代码:
var tmp = 123
if (true) {
tmp = 'abc'
let tmp
console.log(tmp) // tmp is not defined
}
上面代码定于全局变量tmp,但块级作用域内let又声明了一个局部变量tmp,导致绑定了这个块级作用域;因此console.log(tmp)会报错。
不允许重复声明
let 不允许在相同作用域内,重复声明同一个变量。如下代码
function a () {
let a = 10
var a = 1
console.log(a)
}
a ()
也不能在函数内部重新声明参数。
function fun1 (index) {
let index // 报错
}
function fun2 (index) {
{
let index // 不报错
}
}
ES6的块级作用域
function n () {
let n = 5;
if (true) {
let n = 10
}
console.log(n) // 5
}
n ()
上面的代码有2个代码块,都声明了变量n,运行输出5,说明外层代码不受内层代码块的影响,如果使用了变量var ,那么输出的就是10。
const 命令
const 声明一个只读的常量,一旦声明,常量的值就不允许改变。
const a = 1
a = 2
console.log(a) // 报错
常量一旦声明了变量,就必须初始化,不能留到以后赋值。如果使用const声明一个变量,但不赋值,也会报错;如下:
const aa ; // 报错
const的作用域 与 let命令相同;只在声明所在的块级作用域内有效。
if (true) {
const aa = 1
}
console.log(aa) // 报错
不可重复声明 (和 let 一样)
var message = "Hello!"
let age = 25;
// 以下两行都会报错
const message = "HI"
const age = 30
但是对于复合类型的变量,比如数组,存储的是一个地址,不可改变的是这个地址,既不能把一个地址指向另一个地址,但是对象本身是可变的,比如可以给它添加新的属性;如下:
const arr = []
arr.push('hello') // 可执行
arr.length = 0 // 可执行
arr = ['55'] // 报错
var 没有块级作用域
在javascript中没有块级作用域,在for()里面定义变量i ,在循环外部依然可以进行正常访问。var定义变量还有一个问题如下:
var i = 15
var i = 5
alert (i) // 5
其中变量 i 重复定义没有报错,反而输出值为5,说明被重复写了。用var 定义变量还存在一个问题,如下:
for (var i = 0; i < 3 ; i++) {
setTimeout (function () {
console.log(i)
}, 1000)
}
输出结果为3,3,3,因为当循环结束时,i 的值为三。所以在执行setTimeout 函数时,会打印3次。(ps:如果将var 换成 let 就不会出现这个问题)
2、箭头函数和普通函数的区别
箭头函数中的this
默认指向在定义它时,他所处的对象,而不是执行时的对象,定义它的时候,可能环境是window(即继承父级的this)
普通函数中的this:
1. this总是代表它的直接调用者, 例如 obj.func ,那么func中的this就是obj
2.在默认情况(非严格模式下,未使用 'use strict'),没找到直接调用者,则this指的是 window
3.在严格模式下,没有直接调用者的函数中的this是 undefined
4.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象
网址:前端面试题 https://www.yuejiaxmz.com/news/view/76078
相关内容
【前端校招面经】快手本地生活2023前端校招面经面试题
生活部招新面试问题
职场小油条 | 面试前必看八大经典问题!附答题模板~
hr面试性格测试30题
50个经典面试问题和答案
各类面试问题
【职场小白】面试常见问题及面试问题回答技巧
职场面试的5个基本问题
【荐读】面试常见问题及回答,面试问题回答技巧