1.== 和 === 的不同
相等运算符(==)比较两个值是否相等,严格相等运算符( ===)比较是否为同一类型同一值。
=== 先比较类型是否相同,如果是同一类型再比较其值;
== 会把它们转换为同一个类型,再用严格相等运算符进行比较。
console.log(1 === “1”); //false
console.log(1 == “1”); //true
注意:undefined和null与自身严格相等
console.log(undefined === undefined); //true
console.log(null === null); //true
console.log(NaN === NaN); //false,NaN与任何值都不相等
2.简述 for in 循环的特点及使用场景
for in语句用于对数组或对象的属性进行循环操作。使用for in 会遍历数组所有的可枚举属性,包括原型。如果不想遍历原型方法和属性,可以在循环内部使用 hasOwnProperty()方法判断
for…in遍历的是数组的索引(键名),for…of遍历的是数组元素值
for…in一般得到对象的key或数组、字符串的下标
for…of一般得到对象的value或数组、字符串的值
var myObject={
a:1,
b:2,
c:3
}
for (let x in myObject) {
console.log(x);
}
//a b c
//for…of函数
for (var key of Object.keys(myObject)) {
console.log(key + ": " + myObject[key]);
}
//a:1 b:2 c:3
3.数组方法pop(), push(), unshift(), shift()
pop() 方法从数组中删除最后一个元素
push() 方法在结尾处向数组添加一个新元素
shift() 删除首个元素,并把所有其他元素“位移”到更低的索引
unshift() 在开头处向数组添加新元素,并“反向位移”旧元素
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.pop(); //Banana,Orange,Appel
var x = fruits.pop(); //x的值为 Mango,返回被删除值
fruits.push(“Kiwi”); //向fruits末尾添加新元素
var y = fruits.push(“Kiwi”); //5,返回新数组的长度
//shift() unshift()方法返回值类似
4.作用域链
作用域是在运行时代码中的某些特定部分中变量、函数和对象的可访问性。就是说,作用域决定了代码区块中变量和其他资源的可见性。
作用域就是一个独立的地盘,让变量不会外泄、暴露出去,即隔离变量,使不同作用域下同名变量不会有冲突。
分为:
- 全局作用域
- 函数作用域
- 块作用域(ES6):通过命令let,const声明
当一个变量在当前作用域无法找到时,会尝试寻找外层的作用域,一直延续到全局作用域,呈链式连接。作用域链保证对变量和函数的有序访问
作用域与执行上下文
作用域在函数定义时就确定,且不会改变;而执行上下文在运行时确定,但随时可以改变。
同一个作用域下,不同的调用会产生不同的执行上下文环境,从而产生不同的变量的值。
5.js判断类型
-
typeof
只能判断基本数据类型和function,无法判断对象和数组以及null,因为都返回object -
instance of运算符
用来判断数据是否是某个对象的实例,返回一个布尔值
可用于区分自定义对象
// 判断 p 是否为 Person 的实例
function Person(name) {
this.name = name
}
const p = new Person('sunshine')
p instanceof Person // true
不能直接判断基本数据类型,需要通过基本类型对应到包装对象来判断。
5 instanceof Number // false
new Number(5) instanceof Number // true
- Object.prototype.toString.call()
对每一种数据类型的实用,返回一个形如“[object XXX]”的字符串
但无法区分自定义对象类型
//正则表达式
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg); // "[object RegExp]"
- constructor
constructor属性表示原型对象与构造函数之间的关联关系。
console.log('22'.constructor === String) // true
console.log(true.constructor === Boolean) //true
console.log(new Date().constructor === Date). //true
- Array.isArray()
isArray()方法是Array类型的一个静态方法,可以判断一个值是否为数组,返回布尔值