- 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、闭包函数会在父函数外部改变父函数变量值。
- 设计模式:
单例
一个类只有一个实体对象,并提供一个访问它的全局节点
最简单的单例模式就是对象的字面量
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、抽象工厂模式:
这里写代码片