数据类型
a. 什么是引用类型/值类型?
1.值类型key与value储存在栈中(量小)
2.引用类型在涨储存的应用类型,在栈中储存数据(量大)
3.把引用类型赋值给一个变量,是把变量的引用地址指向引用类型堆中地址
b.有那些值类型?
String字符,Number数字,Boolean布尔,undefined未定义,null空,Symbol符号
c. 有那些引用类型?
Object对象,Array数字,Function函数,Map图,Set集合
d.如何判断数据类型?
- typeof 类型
typeof “abc” ----------- string
typeof 123 ----------- number
typeof true ----------- boolean
typeof undefined ----------- undefined
typeof null ----------- object(null空指针)
typeof {
} ----------- object
typeof [] ----------- object
typeof function() ----------- function
//引用类型出函数外 返回的是object
//适合判断值类型与引用类型,不能判断具体引用类型
- instanceof 实例
[] instanceof Array ----------- true
[] instanceof Object ----------- true
{
} instanceof Array ----------- false
{
} instanceof Object ----------- true
//判断是否是其原型链上的实例,只要构造函数在原型链上都返回true
//[]由Array创建的,Array是Object的子类,instanceof Array和Object都返回true
- constructor 构造函数
//判断实例对象构造函数
[] constantor === Array true
- Array.isArray()是否为数组
- Object.prototype.toString.call(obj)原型
- 最精准判断
Object,prototype.toString.call(obj).slice(8,-1)
//返回最精准的数据类型
浅拷贝与深拷贝
你能举几个浅拷贝的方法?
- 扩展{…obj}
- for遍历(浅拷贝(如果属性值是引用类型,两个变量的属性都指向同一内存地址))
- Object.assign() (把参数的两个对象进行合并,属性相同后面覆盖前面)
// js拷贝对象
// 浅拷贝,只能拷贝值类型,引用类型数据还是指向地址
var obj1 = {
name:"mumu",
age:18,
friend:["小红","小蓝",{
name:"小绿",
job:"teacher"
}]
}
// ES6扩展
var obj2 = {
...obj1}
// 循环
var obj3 = {
}
for(var k in obj1){
obj3[k] = obj1[k];
}
// Object.assign把参数的两个对象进行合并,属性相同后面覆盖前面
var obj4 = Object.assign(obj1,{
});
b.你对深拷贝的了解?
深拷贝,目标对象与源对象相互之间切断联系
- JSON.parse(JSON.stringify(数据)):
json数据类型只支持不二,字符串,数字,null,undefined,array,object会忽略函数等其它类型数据 - 通过判断类型 递归深拷贝(递归就是函数自己调用自己,一定要有结束条件)
// js拷贝对象
// 深拷贝,目标对象与元对象相互之间切断联系
var obj1 = {
name:"mumu",
age:18,
friend:["小红","小蓝",{
name:"小绿",
job:"teacher",
say(){
alert("你好,我是"+this.name)
}
}]
}
// JSON转字符串,字符串转对象
var obj2 = JSON.parse(JSON.stringify(obj1))
// json字符串的值指挥保留数组、对象、字符串、数字、null、undefined
// 对象中的函数会被过滤掉(一般数据也是不带函数的)
//通过递归自己调用自己
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);
隐式转换
tip:数据类型转换分为:强制转换,隐式转换;
a.强调转换有哪些?:
- Number()转换为数字
- String()转换为字符串 Boolear()
转换为布尔值
b.隐式转换符号有哪些?:
- +字符串连接符号 会尝试把其他类型转换为 字符串;
- ± * / == 会尝试把其他类型转换为数字;
转换失败 NaN; - false 转换为 0 ;true 转换 1;
- <,>,>= ,<=, ! !,= = = 判断与逻辑返回会尝试把其他类型转换布尔值(falsely变量转换为false ;空字符串,null,NaN,undefined,0,转换为false)
c.严格等于与相对等于含义?
-
= = =
判断类型和值是否都相对
应该在任何时候都使用= = =(当判断是否为null或者为undefined可以为特例)
null === null true -
==
判断隐式转换后的值
“100” == 100 // true
null == undefined //true
0 == false //true -
特例:NaN === null // false
{} == {} // false
[] == {} //false
指向不同的内存地址
if判断是干什么的?
-
if()中判断的是否为truely变量
-
falsely变量:false 空字符串 0 NaN undefined null (两次取反 !!a得到结果为false)
-
除了falsely变量其他都为truely变量
扫描二维码关注公众号,回复: 15069862 查看本文章
逻辑且 逻辑或 执行区别?
1. A||B
A为真(truely) 结果为A ,否则结果为B
2. A&&B
A为假(falsely) 结果为A,否则结果为B
3. 判断对象
if(a&&a.b&&a.b.c){}
if(a?.b?.c){}
如果有a并且有a.b并且有a.b.c
if(a.b.c){} 这样写是错误的
原型与原型链
a.什么是原型,什么是原型链?
- 显示原型:类/构造函数都是一个显式原型ptotype,本质上就是个对象
- 隐式原型:每个实例都有一个隐式原型__proto__
- 显与隐的关系:类显示原型protype等于其创建的实例的隐式原型__proro__
b.什么是原型链?(可以绘制图标)
- 查找对象实例的方法和属性时,先在自身找,找不到则沿着__proro__向上查找,__proro__形成的链条关系我们称之为原型链
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原型</title>
</head>
<body>
<script>
// 01 创建People类
function People(name,age){
this.name = name;
this.age = age;
}
// 02 给pepole显示原型添加 eat方法
People.prototype.eat = function(){
console.log(this.name+"正在吃饭")
}
// 03 创建学生类继承 People类
function Student(name,age,no){
// 执行People构造按函数(执行people函数并把当前的this传入函数,当前peoplethis)
People.call(this,name,age);
// 定义学号
this.no =no;
}
// 04 让Student原型链继承People的原型链
Student.prototype = Object.create(People.prototype);
// 05 修正 Student 显示原型上的构造函数
Student.prototype.constructor = Student;
// 06 在Student显示原型链添加方法
Student.prototype.study = function(){
console.log(this.name+"正在好好学习,dayday up");
}
// 07 构建Student的实例 s1
var s1 = new Student("小曾",18,9527);
</script>
</body>
</html>
c.原型与原型链的作用?
- 实现了js的继承
1.1class 的 extends方法
//- class 的 extends方法
class Student extends People{
constructor(name,age,no){
//类中继承构造函数
super(name,age)}
}
1.2 使用原型链
1. Stuent构造函数中继承
function Student(name,age,no){
People.call(this,name,age) .... }
2.继承原型链
Student.prototype = Object.create(People.prototype)
2. 修正Student构造函数
Stuent.prototype.constructor = Student
- 实现类的实例方法扩展
- Array.prototype.max = function(){return Math.max(…this))}
所有数组将拥有max方法 - String.prototype.reverse = function(){ return this.split(“”).reverse().join(“”)}
所有字符串将拥有 reverse 方法
注意:一般不要修改默认对象上的方法,扩展也谨慎