1.基础
1.1 Object.is == === 区别
- == 会先进行转换再比较
- === 对值和类型进行比较 不进行类型转换,类型不同则返回false
- Object.is`它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基 本一致 ,不同之处只有两个:一是`+0`不等于`-0`,二是`NaN`等于自身。
<script>
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true
Object.is(0n, -0n); // true
Object.is(NaN, 0/0); // true
Object.is(NaN, Number.NaN) // true
</script>
1.2 undefined 和 null的区别
1)声明变量没有赋值,返回undefined
2)函数的形参(没有传递实参的形参)没有赋值 ,返回undefined
3)函数默认的返回值,返回undefined
4)数组下标越界,返回undefined
5)访问数组的空位,返回undefined
null 则表示"什么都没有",即"空值"。一般用来释放对象
1.3 如何判断js变量的数据类型
① typeof 运算符返回一个字符串,表示操作数的类型。
表示要返回类型的对象或基本类型的表达式。
<script>
console.log(typeof 42);// Expected output: "number"
console.log(typeof 'blubber');// Expected output: "string"
console.log(typeof true);// Expected output: "boolean"
console.log(typeof undeclaredVariable);// Expected output: "undefined"
</script>
②instanceof
Object是所有类型的父类型
运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
<script>
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);// Expected output: true
console.log(auto instanceof Object);// Expected output: true
</script>
③ Object.prototype.toString.call(value):[object Array]
toString() 方法返回一个表示该对象的字符串。
该方法旨在重写(自定义)派生类对象的类型转换的逻辑。
<script>
const arr = [1, 2, 3];
arr.toString(); // "1,2,3"
Object.prototype.toString.call(arr); // "[object Array]"
</script>
1.4 i++和++i的区别
对于变量i来说都是+1
i++ 先使用(返回),再++
++i 先++ 再返回
2.函数
2.1 作用域
作用域是当前的执行上下文,值和表达式在其中“可见”或可被访问。如果一个变量或表达式不在当前的作用域中,那么它是不可用的。作用域也可以堆叠成层次结构,子作用域可以访问父作用域,反过来则不行。
1)作用域指变量执行的范围
2)ES5中有两个作用域:全局作用域/函数作用域
①全局作用域:全局作用域的变量在任何位置都可以访问
②函数作用域:函数作用域中的变量只能在函数内部访问
3)变量分为全局变量和局部变量
①全局变量:在任意位置都可以读取
②局部变量:形参和在函数内部声明的变量称为局部变量 只能在函数内部读取
4)ES6新增了块级作用域
if(){}
for(){}
2.2 函数声明与表达式的区别
1)函数声明(function命令法)
有声明提升 可以先调用 再声明,
函数声明可以定义命名的函数变量,而无需给变量赋值。
2)函数表达式
没有声明提升 不可以把声明写在调用之前
函数表达式将函数定义为表达式语句(通常是变量赋值)的一部分。通过函数表达式定义的函数可以是命名的,也可以是匿名的。
2.3 什么是高阶函数
1)概念
把函数作为参数传递到另外一个函数中或者函数的返回值是一个函数,都称为高阶函数
2)常见
<script>
arr.map((item,index,arr)=>{return item});//高阶函数
arr.filter((item,index,arr)=>{return item>3});//高阶函数
arr.forEach((value,index,arr)=>{})
arr.reduce((a,b)=>{return a+b})
</script>
2.4break return continue 三者的区别
1)break 是在循环中用来终止循环的语句,它跳出了整个循环体。
2)continue 是在循环中用来跳过本次循环迭代并直接开始下一次循环的语句,它只跳出了当前循环的剩余部分。
3)return 是在函数中用来结束函数并返回一个值的语句
3.数组
4.对象
4.1 this指向的问题
1)介绍
this指向一个对象,指向调用他的对象
2)使用情况
- 普通函数:指向调用函数的对象 全局指向window
- 箭头函数:没有自己的this 指向父级作用域中的this
- call、apply、bind可以改变this的指向,this借用的对象
① 全局环境
指向window对象
var声明的变量和function声明的函数,都会自动挂载到window对象上,成为window对象的属性和方法。
<script>
function fn(){
console.log(this);//window
}
fn();//相当于window.fn() */
</script>
② 对象的方法中
指向调用方法的对象
<script>
let obj1 = {
name:'明明',
hobby:function(){
console.log( this.name+'正在敲代码');
}
}
obj1.hobby();//obj对象调用了hobby方法,this指向调用他的对象 -obj
</script>
③ 箭头函数
<script>
let obj = {
name:'关晓彤',
hobby:()=>{
return this.name+='是个演员' ;//window 指向上层作用域中的this
}
}
obj.hobby();
</script>
4.2 call apply bind 区别
bind ()和call与apply不同。
bind是新创建一个函数,然后把它的上下文绑定到bind ()括号中的参数上,然后将它返回。
所以,bind后函数不会执行,而只是返回一个改变了上下文的函数副本,
而call和apply是直接执行函数。