- 微信扫码关注公众号 :前端前端大前端,追求更精致的阅读体验 ,一起来学习啊
- 关注后发送关键资料,免费获取一整套前端系统学习资料和老男孩python系列课程
js--常见面试题
- demo1-变量声明提升与初始化
- demo2-块级作用域
- demo3 -箭头函数this指向
- demo4-- 类型转换
- demo5--浅拷贝
- demo6 --全等与等的差异
- demo7--静态方法,构造方法,默认值
- demo8-- 全局属性
- demo9 --函数也是对象
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)//{}
- 不加变量声明提示符定义出的变量是隐式全局变量
demo9 --函数也是对象
function fn() {
console.log('hello')
}
fn.text = 'world'
fn()
console.log(fn.text)
- 输出: hello world
- 解析:函数本身也是对象,为它设置属性并访问,完全符合逻辑