前端学习问题总结

1.null和undefined的区别?
答:Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

2.什么是单例模式,单例模式在前端开发中有什么应用?
答:单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式在前端的应用较为广泛的有登录模块,首次点击登录按钮时候,渲染登录弹窗,在以后点击登录按钮时,如果是已经登录状态,就不再渲染弹窗,又比如一个音乐播放程序,如果已经存在一首正在播放的进程,点击其他歌曲的时候要关掉正在播放的音乐,然后在播放下一首歌曲,这些都是单例模式在前端开发中的应用。下面介绍一下前端如何创建一个单例模式:

class Singleton {
    constructor(name) {
        this.name = name;
        this.instance = null;
    }
    // 构造一个广为人知的接口,供用户对该类进行实例化
    static getInstance(name) {
    //检验是否是已经创建过这个对象
        if(!this.instance) {
            this.instance = new Singleton(name);
        }
        return this.instance;
    }

3.js分为哪两大类型?都有各自的什么特点?
答:js分为原始类型和对象类型,原始类型又称基本数据类型,分别有6种:null,String,symbol,undefined,number,boolean,除了这这些基本数据类型剩下的都是对象类型,比如数组、对象之类,判断一个变量是什么类型的方法是,首先使用typeOf方法,如果是数据基本类型会返回基本数据类型的名称,如果返回的是object,则需要使用instanceof,instanceof会返回对象的构造函数。如果是数组类型会返回它的构造函数Array,通过这个可以判断对象的类型,但是instanceof并不能准确的判断对象的类型,具有一定得局限性。

4.原生js常用的方法有哪些?
(1)typeof,是判断元素具体是什么类型的方法,一般会返回数据类型,但是需要注意的是typeof null返回的结果是object,这是一个js的bug,typeof [1,2]返回的结果是object,因为在数据类型中并没有array这一项,typeof Symbol()返回的结果是symbol,这是ES6新特性。
(2) instanceof,它用于实例和构造函数的对应,返回的是一个布尔类型数据。比如想要判断一个变量是不是一个数组,用typeof方法已经不合适了,但是可以用[1,2] instanceof Array来判断。因为,[1,2]是数组,它的构造函数是Array。同理:

function Foo(name) {
    this.name = name
}
var foo = new Foo('bar')
//这里foo的是Foo的实例,所以执行下面的方法会返回true
console.log(foo instanceof Foo) 

5.关于值类型和引用类型,请说出他们的区别?
答:上面提到的数据类型都是值类型,只有object和function是引用类型,其他的都是值类型。在参数传递方式上,值类型是按值传递,引用类型是按照共享传递。下面通过例子更及时透彻的说明一下:

// 值类型
var a = 10
var b = a
b = 20
console.log(a)  // 10
console.log(b)  // 20

上述代码中,a和b都是值类型,两者分别修改赋值,相互之间没有影响。下面是引用类型的例子:

// 引用类型
var a = {x: 10, y: 20}
var b = a
b.x = 100
b.y = 200
console.log(a)  // {x: 100, y: 200}
console.log(b)  // {x: 100, y: 200}

在上述代码中,a和b都是引用类型,在执行了b=a后,a的内存地址指向了b,它们共享一个内存地址,所以在修改了b中的x和y以后,a中的x和y也会修改。
下面有个经典的面试题:

function foo(a){
    a = a * 10;
}
function bar(b){
    b.value = 'new';
}
var a = 1;
var b = {value: 'old'};
foo(a);
bar(b);
console.log(a); // 1
console.log(b); // value: new

6.new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别?
在调用new的过程中会发生一下四件事情:
1.新生成一个对象
2.链接到原型
3.绑定this
4.返回新对象
对于对象来说,其实都是通过new产生的,无论是function foo()还是let a={ b:1 },对于创建一个对象来说,更推荐使用字面量的方式创建对象(无论是考虑性能还是可读性)。因为你使用new Object()的方式创建对象需要通过作用域立链一层一层的找到object,但是你使用字面量方式就没这个问题。

function Foo() {}
// function 就是个语法糖
// 内部等同于 new Function()
let a = { b: 1 }
// 这个字面量内部也是使用了 new Object()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值