• 微信扫码关注公众号 :前端前端大前端,追求更精致的阅读体验 ,一起来学习啊
  • 关注后发送关键资料,免费获取一整套前端系统学习资料和老男孩python系列课程
    js--常见面试题_js--常见面试题



js--常见面试题


demo1-变量声明提升与初始化

function sayHi() {
console.log(name);
console.log(age);
var name = "Lydia";
let age = 21;
}

sayHi();

  • 输出: undefined age is not defined
  • 解析:var,let都存在声明提升,但前者会初始化赋值undefined,后者不会,且let存在暂时性死区,未声明变量不可使用

demo2-块级作用域

for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}

for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}

  • 输出: 333 012
  • 解析:var定义的变量全局有效,回调执行时i只有一个,即全局的i,为3.let每次循环都定义一个新值,存在块级作用域,每次回调得到的i都是不同的

demo3 -箭头函数this指向

const obj = {
number: 10,
f1() {
return this.number * 2
},
f2: () => 2 * this.number
}

console.log(obj.f1())
console.log(obj.f2())

  • 输出: 20 NaN
  • 解析:箭头函数中的this指向并非当前对象,而是执行上下文对象,浏览器的window,node中的{}

demo4-- 类型转换

console.log(+true);
console.log(!"hello");

  • 输出: 1 false
  • 解析:+ 进行number转换,true转为1,false转为0,字符串不为空真值为true,取反为false

demo5–浅拷贝

let obj1 = { name: 'TOM' }
let obj2 = obj1
obj1.name = 'JACK'
console.log(obj2.name)

  • 输出: JACK
  • 解析:简单赋值相当于复制一份引用,两个对象本质指向内存中同一个地址,一变皆变

demo6 --全等与等的差异

let a = 3
let b = new Number(3)

console.log(a == b)
console.log(a === b)

  • 输出: **true false **
  • 解析:==只比较值,===比较值和类型,new Number()本质是个对象,而不是基本类型number

demo7–静态方法,构造方法,默认值

class Obj {
static getColor(color='green') {

return color
}

constructor(color='blue') {
this.color = color
}
}


console.log(new Obj('red').color)
console.log(new Obj().color)
console.log(Obj.getColor())
console.log(Obj.getColor('black'))
console.log(new Obj.getColor())

  • 输出: red blue green black error
  • 解析:静态方法实例不可用,默认值在不传参情况下生效

demo8-- 全局属性

let a
b={}
console.log(b)//{}

js--常见面试题_块级作用域_02

  • 不加变量声明提示符定义出的变量是隐式全局变量

demo9 --函数也是对象

function fn() {
console.log('hello')
}
fn.text = 'world'
fn()
console.log(fn.text)

  • 输出: hello world
  • 解析:函数本身也是对象,为它设置属性并访问,完全符合逻辑
    js--常见面试题_块级作用域_03