前端面试题(五)

1.基本数据类型有哪些?引用数据类型?各个数据类型是如何存储的?

基本数据类型:

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • Symbol

引用数据类型:
引用数据类型也就是对象数据类型object

  • Obiect
  • function
  • array
  • data

数据类型存储:

  • 基本数据类型都是一些简单的数据段,它们是存储在栈内存中。
  • 引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用。可以理解为,栈内存中保存了一个地址

2.判断数据类型有哪些方法?

  1. typeof
    typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等。
  2. instanceof
    instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型
    instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
  3. constructor
  4. toString
    toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
    对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

详细解释:https://www.cnblogs.com/onepixel/p/5126046.html
标识位:

  • 00对象
  • 1整型
  • 010双精度类型
  • 100字符串
  • 110布尔类型
  • 000 Object
  • 全为0 Null

3.call、apply、bind

改变函数执行时的上下文,再具体一点就是改变函数运行时的this指向

  1. call
    通过在call方法,给第一个参数添加要把b添加到哪个环境中,简单来说,this就会指向那个对象。
var a = {
    user:"追梦子",
    fn:function(e,ee){
        console.log(this.user); //追梦子
        console.log(e+ee); //3
    }
}
var b = a.fn;
b.call(a,1,2);
  1. apply
    同样apply也可以有多个参数,但是不同的是,第二个参数必须是一个数组
 var a = {
    user:"追梦子",
    fn:function(e,ee){
        console.log(this.user); //追梦子
        console.log(e+ee); //11
    }
}
var b = a.fn;
b.apply(a,[10,1]);
  1. bind
    bind方法和call、apply方法有些不同,但是不管怎么说它们都可以用来改变this的指向。实际上bind方法返回的是一个修改过后的函数。
 var a = {
    user:"追梦子",
    fn:function(e,d,f){
        console.log(this.user); //追梦子
        console.log(e,d,f); //10 1 2
    }
}
var b = a.fn;
var c = b.bind(a,10);
c(1,2);

总结:call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。

4.字面量创建对象和new创建对象有什么区别

字面量:

  • 字面量创建对象更简单,方便阅读
  • 不需要作用域解析,速度更快
var obj2 = {
    name: "小明",
    age: 20,
    sayHi:function () {
        console.log("我是:" + this.name);
    },
    eat:function () {
        console.log('吃了');
    }
}
 
obj2.sayHi();
obj2.eat();

new

  • 创建一个新对象。
  • 这个新对象会被执行[[原型]]连接。
  • 将构造函数的作用域赋值给新对象,即this指向这个新对象
  • 如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象。
function new(func) {
    lat target = {};
    target.__proto__ = func.prototype;
    let res = func.call(target);
    if (typeof(res) == "object" || typeof(res) == "function") {
    	return res;
    }
    return target;
}

5.作用域与作用域链

  1. 规定变量和函数的可使用范围称作作用域
  2. 每个函数都有一个作用域链,查找变量或者函数时,需要从局部作用域到全局作用域依次查找,这些作用域的集合称作作用域链

6.闭包

  • JavasSript 语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。起到保护和保存的作用
  • 闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样,理解闭包需要循序渐进的过程。

这些是本人理解和网上查找,如有错,请留言,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI小智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值