JavaScript知识点


  • js变量类型

在js中变量类型分为两类,值类型和引用类型。值类型包含undefiend、number、string、boolean,值类型不属于对象。引用类型常见的有函数、数组、对象、null等
function show(x) {
    console.log(typeof x) ; // undefiend
    console.log(typeof 10) ; // number
    console.log(typeof 'abc') ; // string
    console.log(typeof true) ; // boolean
    console.log(typeof function(){}) ; // function
    console.log(typeof ['x', '123']) ; // object
    console.log(typeof null) ; // object
    console.log(typeof new Number(10)) ; // object
}


  • 闭包

闭包是JavaScript中很重要的一个概念,简单地说就是定义在函数中的子函数。在JavaScript中的存在全局变量和局部变量,在函数内部可以访问外部的全部变量,但在函数外部无法访问函数内部的局部变量,有些情况下又必须访问局部变量,闭包就是为了解决这种问题而出现的。
function f1() {
    let n = 20
    function f2() {
        console.log(n)
    }
    return f2   // 函数f2就是一个闭包
}
let result = f1()
result() // 20

闭包的作用:
1、通过闭包可以访问函数内部的局部变量
2、通过闭包可以使变量始终存在内存中

//通过闭包可以使变量始终存在内存中
function f1() {
    let n = 20
    add = function() {
        ++n
    }
    function f2() {
        console.log(n)
    }
    return f2   // 函数f2就是一个闭包
}
let result = f1()
result() // 20
add() 
result() // 21

使用闭包的注意事项
1、闭包函数中的变量都存在内存中,所以不允许滥用闭包,否则会造成内存泄漏
2、闭包函数会在父函数外部改变父函数变量值。

参考:深入理解JavaScript原理和闭包

  • 设计模式:
  • 单例

    一个类只有一个实体对象,并提供一个访问它的全局节点

  • 最简单的单例模式就是对象的字面量

let singleton = {
    props: 'value',
    menthod: function(){}
}

此种单例模式的特点是所有的属性和方法都是公开的。使用者可以对属性进行相关操作。

  • 包含私有成员的单例模式(惰性实例化)
    通过闭包来创建类的私有成员
let singleton = (function(){
    let instance;
    let uid = '890425'
    function init() {
        return {
            name: 'lta',
            menthod: function() {
                console.log('-----', uid)
            }
        }
    }
    return {
        getInstance: function() {
            if(!instance) {
                instance = init()
            }
            return instance
        }
    }
})()
let obj = singleton().getInstance()

单例设计模式的优点在于对代码的组织作用,将相关的属性和方法封装在一个不会被多次实例化的对象中,使得代码的调试和维护更加轻松。隐藏实现细节可以防止被错误修改,还防止全局命名空间的污染。还可以通过惰性加载提高性能,减少不必要的内存消耗。


  • 工厂模式

工厂模式根据抽象的程度不同分为三类:简单工厂模式、工厂方法模式、抽象工厂模式

1、简单工厂模式:

// 第一种
let Kobe = function() {
    this.speak= function() {
        console.log('my name is 科比')
    }
}
let Manu = function() {
    this.speak = function() {
        console.log('my name is 妖刀')
    }
}
let AllStar = function('name') {
    switch(name) {
        case 'kobe': 
            return new Kobe()
            break;
        case 'manu':
            return new Manu()
            break;
        default:
            return  new Kobe()
    }
}
let kobe = AllStar('kobe')
kobe.speak() // my name is 科比
let manu = AllStar('manu')
manu.speak() // my name is 妖刀

// 第二种
let AllStar = function(name) {
    let object = new Object()
    object.name = name
    object.speak = function () {
        console.log('my name is' + name)
    }
    return object
}
let kobe = AllStar('kobe')
kobe.speak() // my name is kobe
let manu = AllStar('manu')
manu.speak() // my name is manu

2、 工厂方法模式:

3、抽象工厂模式:

这里写代码片

工厂模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值