JS基础面试题

数据类型
引用类型,值类型?

值类型key与value存储在栈中(可存内存较小)
引用类型在栈存储的引用地址,在堆中存储是数据(可存内存较大)把引用类型赋值给一个变量,是把变量的引用地址指向引用类型堆中地址
值类型

String字符,Number数字,Boolean布尔,undefined未定义null空(特殊)Symbol符号

引用类型

Object对象   Array数字   Function函数   Map图   Set集合

怎么判断数据类型

typeof类型
适合判断值了与引用类型不能判断具体引用类型
typeof "abc” string
typeof 123 number
typeof true boolean
typeof undefined undefined
typeof null object
typeof Symbol()
symboltypeof object
typeof 0]object
typeof function()function
typeof new Map() object
typeof new Set() object

constructor构造函数
判断实例对象构造函数
[   ].constructor === Array true

Array.isArray)是否为数组
Object.prototype.toString.callobj)原型
Object.prototype.toString.call(obj).slice(8,-1)返回数据的精确类型

instanceof实例
[  ]instanceof Array true
[  ]instanceof Object true
{  }instanceof Array false
{  }instanceof Object true

浅拷贝
Object.assign(A,B)
for in遍历拷1贝
{...A}对象扩展 
var obj1 = {name:"白菜头子",age:20,friend:["大白菜","小白菜",{name:"中白菜",job:"程序员"}],say(){alert("你好我是"+this.name)}}
//案例
var obj3={};
for (var k in obj1){
    obj3[k]=obj1[k]
}
var obj4=Object.assign(obj1,{})

var obj2={...obj1}

 深拷贝
JSON.parse(JSON.stringify(数据))
json数据类只支持 布尔,字符串,数字 null,undefined array object会忽略函数 等其他类型数据
通过判断类型 递归深拷贝
递归就是函数调用自己一定要有结束条件
转字符串   

var obj2 = JSON.parse(JSON.stringify(obj1))

 递归

function deeCopy(obj){

    if(typeof obj==="object"&&obj!==null){

      var result;

      if(obj.instanceof Array){

         result = [];

         for(var i=0;i<obj.length;i++){

               result[i] = deepCopy(obj[i])

         }

      }else{

         result = {};

         for(var k in obj){

             result[k] = deepCopy(obj[k])

         }

      }

      return result;

    }else {

        return obj;

    }

}

隐式转换
数据类型转换:强制转换,隐式转换、强制转换

Number()转换为数字string() 转换为字符串 BooLean()转换为布尔值隐转换符号
+字符串连接符号(隐式转换为字符串) + -*/数学运算(隐式转换为数字)><>=<=/ / && !比较与逻辑(隐式转换为布尔值)

字符串和任意数据+连接都会转换为字符串
数学运算符号会会尝试隐式转换数据为数字
如果数据没有转换数字成功结果就是NaN(not a num的检测)l / true转换为数字默认 转换为1false默认会转换为0
/ / alert( ! !a);//false
逻辑与比较运算符号会把变量转换为布尔值
空字符串,0, nuL4L, undefined NaN false才会被转换为false,其他都会被转换 为true/把以上的变量值称为fLasely变量值,其他的变量都称为truely变量值
alert( ! ! -1); //true
全等【  === 】

判断类型和值是否相同

注:判断是否为null或者为undefined为特例(其他为fasle)

null === null

undefined === undefined

结果:true

等于【  == 】

判断值是否相同

案例:

“100” == 100 // true
null == undefined //true
0 == false //true

注:NaN === null // false

特殊:

[] == {} //false

{} == {} // false

因为里边指向不同的内存地址

if判断
if()中判断的是否为truely变量
除了falsely变量其他都为truely变量
falsely变量:false "" 0 NaN undefined null 两次取反 !!a得到结果为false
逻辑且逻辑或
逻辑 或 ||

前||后

若前边的为true返回前边的值,反之返回后边的值

逻辑 且 &&

前&&后

前边为true结果返回后面的值,反之返回前边的值

判断对象

if(a&&a.b&&a.b.c){ }
if(a?.b?.c){ }
如果有a并且有a.b并且有a.b.c
if(a.b.c){ } 这样写是错误的

原型和原型链
什么是原型,什么是原型链

每个构造函数(class)都有一个显示的原型prototype

每个实例对象都有个隐示原型__proto__

实例的隐式原型__proto__等于其构造函数的显示原型prototype

当查找一个对象的属性或方法时先在实例上查找,找不到沿着__proto__向上逐级查找

我们把__proto__的__proto__形成的链条关系成为原型链

作用:1 原型链实现了js继承,2.原型可以给构造函数创建的实例添加公用方法

作用

实现了js的继承
实现了实例的公用属性和方法
例如:

var arr=[ ]

arr.__proto__===Array.prototpe

Array.prototpe.__proto__===Object.prototpe

Object.prototpe===arr.__proto__.__proto__

注:相当于形成一个链子,一环套一环,从arr的__proto__到Object的prototpe形成一个链条

js实现继承

class 的 extends方法
class Student extends People{
constructor(name,age,no){
//继承构造函数Student继承People里边的内容
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

原型链示图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值