面试题
数据类型
什么是引用类型,值类型
值类型key与value存储在栈中(量小)
引用类型在栈存储的引用地址,在堆中存储是数据(量大)把引用类型赋值给一个变量,是吧变量的引用地址指向引用类型堆中地址
哪些值类型
String字符,Number数字,Boolean布尔,undefined未定义null空(特殊)Symbol符号
哪些引用类型
Object对象Array数字Function函数Map图Set集合
判断数据类型
typeof 类型
instanceof 实例
constructor 构造函数
Array.isArray()是否为数组
Object.prototype.toString.call(obj)原型
typeof判断
typeof "abc" string
typeof 123 number
typeof true boolean
typeof undefined undefined
typeof null object
typeof Symbol() symbol
typeof {} object
typeof [] object
typeof function(){} function
typeof new Map() object
typeof new Set() object
适合判断值与引用类型 不能判断具体引用类型
instanceof判断
[]instanceof Array true
[]instanceof Object true
{}instanceof Array false
{}instanceof Object true
判断是否是其原型链上的实例 只要这个构造函数在原型链都返回true
([]由Array创建的,Array是Object的子类,instanceof Array和Object都返回true)
constructor判断
判断实例对象构造函数
[].constructor===Array true
最精确
Object.prototype.toString.call(obj).slice(8,-1)
深拷贝和浅拷贝
浅拷贝
三种实现方法
var obj1 = {
name: "mumu",
age: 18,
friend: ["小红", "小绿", { name: "小蓝", job: "teacher" }],
};
var obj2 = { ...obj1 }; //如果属性值是引用类型,两个变量的属性都指向同一内存地址
var obj3 = {};
for (var k in obj1) {
obj3[k] = obj1[k];
}
//将参数的两个对象进行合并,属性相同后面覆盖前面
var obj4 = Object.assign(obj1, {});
深拷贝
- JSON.parse(JSON.stringify(数据))
json数据类只支持 布尔,字符串,数字 null,undefined array object
会忽略函数 等其他类型数据
- 通过判断类型 递归深拷贝
递归就是函数调用自己
一定要有结束条件
var obj1 = {
name: "mumu",
age: 18,
friend: ["小红", "小绿", { name: "小蓝", job: "teacher" }],
say() {
alert("你好我是" + this.name);
},
};
function deepCopy(obj) {
if (typeof obj == "object" && obj != null) {
var temp = null;
if (obj instanceof Array) {
temp = [];
for (var i = 0; i < obj.length; i++) {
temp[i] = deepCopy(obj[i]);
}
} else {
temp = {};
for (var k in obj) {
temp[k] = deepCopy(obj[k]);
}
}
return temp;
} else {
return obj;
}
}
var obj2 = deepCopy(obj1);
隐式转换
看符号
-
+字符串连接符号 会尝试把其他类型转换为 字符串
-
+-*/ == 会尝试把其他类型转换为数字
转换失败 NaN
false 转换为 0
true 转换 1
><>= <= ! != == 判断与逻辑返回会尝试把其他类型转换布尔值
严格等于
-
===判断类型和值是否都相对
-
应该在任何时候都使用===
(当判断是否为null或者为undefined可以为特例)
-
==
判断隐式转换后的值
“100” == 100 // true
null == undefined //true
0 == false //true
特例:NaN === null // false -
null === null true
- {} == {} // false
[] == {} //false
指向不同的内存地址
if判断
if()中判断的是否为truely变量
falsely变量:false “” 0 NaN undefined null
两次取反 !!a得到结果为false
除了falsely变量其他都为truely变量
逻辑且逻辑或
A||B
A为真(truely) 结果为A ,否则结果为B
A&&B
A为假(falsely) 结果为A,否则结果为B
判断对象
if(a&&a.b&&a.b.c){}
if(a?.b?.c){}
如果有a并且有a.b并且有a.b.c
if(a.b.c){}
原型与原型链
名词
类
(创建对象实例的模板)
本质上就是函数
构造函数用new来执行的函数
class xxx()
实例
由类创建的对象
(本质上就是对象)
显示原型
类/构造函数都有一个显示原型protype
本质就是对象
隐式原型
每个实例都要一个隐式原型__proto__
显与隐关系
类显示原型protype等于其创建的实例的隐式原型__proto__
原型链
查找对象实例的方法和属性时,先在自身找,找不到则沿着__proto__向上查找,__proto__形成的链条关系我们称为原型链(实现了js继承)
原型与原型链的作用
实现了js的继承
实现了实例的公用属性和方法
显与隐关系
var arr = [];
arr.proto === Array.prototype
类显示原型protype等于其创建的实例的隐式原型__proto__
js实现继承
class 的 extends方法
class Student extends People{
constructor(name,age,no){
//类中继承构造函数
super(name,age)
....
}
}
使用原型链
-
Stuent构造函数中继承People function Student(name,age,no){ People.call(this,name,age) .... }
-
继承原型链
Student.prototype = Object.create(People.prototype)
-
修正Student构造函数
Stuent.prototype.constructor = Student
实例公用方法
Array.prototype.max = function(){return Math.max(...this))}
所有数组将拥有max方法
String.prototype.reverse = function(){ return this.split("").reverse().join("")}
所有字符串将拥有 reverse 方法
注意:一般不要修改默认对象上的方法,扩展也谨慎
标签:面试题,obj,基础,原型,typeof,var,null,true From: https://www.cnblogs.com/aureazjl/p/16913021.html