数据类型检验

typeof
识别值类型,函数,typeof null object
字符串
charAt

substring


a可以大于b,会自动换成小的在前
substr

省略第二个参数和substring一样

slice



大写,小写

indexOf

数据类型转化
Number
NAN==NAN false

- Number({ }) //NaN
- Number([ ])//0
parseInt

parseFloat

String

toString


Boolean

- Boolean({ }) //true
- Boolean([ ]) //true
js



短路运算
主要是看前一个决定了结果,就返回前一个,否则就返回后一个
逻辑运算符非>与>或


运算顺序:非运算→数学运算-→关系运算→逻辑运算(&&>||)
数组方法

shift pop 返回值是删除的值
slice


splice


join split

字符串可以使用中括号

concat

reverse

indexOf includes

对于这两个方法数组里有22,搜索‘22’不会有结果因为是使用===判断的
冒泡排序

复杂数据类型


深克隆、浅克隆
利用forin 浅拷贝

深拷贝
function deepClone(o) {
if (Array.isArray(o)) {
let result = []
for (const key in o) {
result.push(deepClone(o[key]))
}
return result
} else if (typeof o == 'object') {
let result = {
}
for (const key in o) {
result[key] = deepClone(o[key])
}
return result
} else {
return o
}
}
const a = {
b: '123',
c: {
d: 4,
r: 5,
},
f: [1, 2, 3, 4, 5],
}
let copy = deepClone(a)
a.c.d = 999
a.f[0]=666
console.log(copy)
console.log(a)
上下文
函数的上下文由调用函数的方式决定

规则一


规则二


规则三


规则四立即执行函数


规则五,定时器,延时器里面那个函数的this指向



规则六

备份上下文


定时器内使用箭头函数,this是包裹箭头函数的父函数的this指向,要注意父函数是不是箭头函数
const obj = {
num: 10,
outf: outFun
}
function outFun() {
console.log('outFun', this); // obj
setTimeout(function() {
console.log('outFun', this); // window
});
setTimeout(() => {
console.log('outFun', this); // obj
});
}
obj.outf();
const obj = {
num: 10,
outf: outFun
}
const outFun = () => {
console.log('outFun', this); // window
setTimeout(function() {
console.log('outFun', this); // window
});
setTimeout(() => {
console.log('outFun', this); // window
});
}
obj.outf();
call applay



用new调用函数

构造函数

什么是构造函数
- 用new调用一个函数,这个函数就被称为"构造函数”,任何函数都可以是构造函数,只需要用new调用它
- 顾名思义,构造函数用来"构造新对象”,它内部的语句将为新对象添加若干属性和方法,完成对象的初始化
- 构造函数必须用new关键字调用, 否则不能正常工作,正因如此,开发者约定构造函数命名时首字母要大写
如果不用new调用构造函数

全局this window
构造函数中的this不是函数本身,this是那个秘密创建的空对象
、
什么是prototype
- 任何函数都有prototype属性
- prototype属性值是个对象,它默认拥有constructor属性指回函数

- 构造函数的prototype是实例的原型

has0wnProperty / in
has0wnProperty方法可以检查对象是否真正“自己拥有某属性或者方法既不是从原型链上的获取的属性或方法
xiaoming.hasOwnProperty('name');
// true
xiaoming . hasOwnProperty('age');
// true
xiaoming.hasOwnProperty('sex');
// true
xiaoming. hasOwnProperty('nationality');
// false
in运算符只能检查某个属性或方法是否可以被对象访问,不能检查是否是自己的属性或方法
'name' in xiaoming // true
'age' in xiaoming // true
'sex' in xiaoming // true
'nationality' in xiaoming // true
将方法写到prototype上
把方法直接添加到实例身上的缺点:每个实例和每个实例的方法函数都是内存中不同的函数,造成了内存的浪费

\
返回TRUE
原型链的终点

数组

利用原型链实现继承


包装类



Math



求数组最大值 Math.max(...arr)

Data

正则















