数据类型检验
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)