2021整理面试知识点
1.null和undefined的区别
null:代表空对象指针。现在没有,将来可能会有
undefined:空,未定义。现在没有,将来也不会有(js中独有的数据类型)
区别
1)两者类型不一样
console.log(typeof null) // Object
console.log(typeof undefined) // undefined
2)转成数值结果不一样
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
null出现情况:
--某个元素找不到;
--对象彻底销毁的时候为null(对象销毁,给复合数据类型赋值null,清除当前变量占用的内存)
undefined出现情况:
--变量未赋值
--函数默认返回值
--严格模式下this为undefined
--简单类型加上属性为undefined
2.js中检测数据类型的集中方式
1)typeof
一元运算符,用来检测数据类型。只可以检测:string、undefined、object、Boolean、function、number
对基本数据类型是没问题的,引用数据类型不起作用(无法细分对象)
2)instanceof
二元运算符,用来检测某个对象是不是另一个对象的实例。
只能用来判断对象和函数,不能判断字符串和数字
例:
let arr = [1, 2, 3]
console.log(arr instanceof Array) // true
3)constructor
js中所有对象都继承于Object,constructor是其中一个属性,默认指向实例的构造函数(可以修改)。
例:
function fs() {}
let f = new fs
console.log(f.constructor === fs) // true
console.log(f.constructor.name) // fs
4)[拓展] Object.prototype.toString.call
js中,Object.prototype.toString()判断某个对象值属于哪种内置类型
例:
let dt = new Date
console.log(Object.prototype.toString.call(dt)) // [Object Date]
let arr = [1, 2, 3]
console.log(Object.prototype.toString.call(arr)) // [Object Array]
let fs = function() {}
console.log(Object.prototype.toString.caal(fs)) // [Object Function]
3.css3实现单行文本溢出显示省略号
width: 100px;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
4.[了解]正则常用的修饰符与元字符
https://www.cnblogs.com/theblogs/p/9943070.html
5.闭包
什么是闭包?
闭包是一种保护机制,保护私有作用域中的私有变量不受全局变量的污染。
js中,函数套函数,子函数使用父函数中的参数或者变量,且子函数被外界所引用(没有释放)。此时父函数的参数或变量不会被浏览器垃圾回收机制所回收,这时候父级便形成了闭包环境。
例:
function fs () {
let a = 10
return function() {
a++
console.log(a)
}
}
let f = fs()
console.dir(f)
闭包特点:
1)函数套函数
2)子函数访问父函数的参数或者变量
3)子函数被外界所使用着,没有释放
闭包应用场景:
1)存储父函数的变量或者参数
2)保护私有变量不受外界干扰
闭包缺点:
相对于普通函数更消耗内存,使用不当容易造成内存泄漏;所以一般尽量避免使用闭包。
6.es6箭头函数
=> 箭头函数是es6新增的函数表达式。(低版本浏览器不兼容)
影响this的作用域。
例:
let fn = a => {
return a
}
或
let fn = a => a
箭头函数需要注意的点:
1)箭头函数不能new(不能当做构造函数),否则报错
2)this指向不再是Window,而是父级(指向可变)
3)不可以使用arguments,在函数体内不存在;如果需要使用,rest参数代替
7.改变this指向的三种方法(call、apply、bind)
共同点:
三者都可以改变this指向。若第一参数为null/undefined,this默认指向window。
区别:
call、apply可以自动执行,bind不会自动执行,需要手动调用
call、bind可以有无数个参数,apply只能传两个参数,第二个参数一定要为数组
1)call(无数个参数)
参1:this指向
参2:实参
使用之后会立即执行该函数。
例:
function fx(a, b, c) {
console.log(this, a+b+c) // window, NaN
}
fx()
fx.call(document, 1, 2, 3) // #document, 6
2)apply(两个参数)
参1:this指向
参2:数组(实参)
使用之后会立即执行该函数。
例:
function fx(a, b, c) {
console.log(this, a+b+c) // window, NaN
}
fx()
fx.apply(document, [1, 2, 3]) // #document, 6
3)bind(无数个参数)
参1:this指向
参2:实参
返回值是一个新函数,新函数需要重新调用,不会自动执行。
function fx(a, b, c) {
console.log(this, a+b+c) // window, NaN
}
let fxx = fx.bind(document, 1, 2, 3)
fxx() // #document, 6
8.
9.