js基础一些知识点总结
数据类型
undefined与null的区别
let num //undefined
console.log(undefined+1)//NaN
undefined 声明一个变量没有赋值
let num = null //null
console.log(null+1) //1
null赋值了但内容为空
检测null数据类型得到的是object
因为js底层的语言设计缺陷所导致的
隐式转换
- +号作为正号解析可以转换为Number
- 任何数据和字符串相加结果都是字符串
- 减法- 只能用于数字,它会使空字符串""转换为0
类型转换
- 0、undefined、null、false、NaN转换为布尔值后都是false,其余为true
- null经过数字转换之后会变为0
- undefined经过数字转换转换会变成NaN
- NaN不等于任何值,连它自己都不等于
逻辑与与逻辑非的短路问题
符号 | 短路条件 |
---|---|
逻辑与&& | 遇到false就不执行右边的代码 |
逻辑非|| | 遇到true就不执行右边的代码 |
&&只要有一个false运算结果就为false ||只要有一个true运算结果就为true
&&优先级大于||优先级
退出循环break与continue的区别
break:退出整个循环,不再执行此循环
continue:退出本次循环,继续执行下次循环
数组的操作
- push 动态向数组的尾部添加一个单元
- unshift 动态向数组头部添加一个单元
- pop 删除最后一个单元
- shift 删除第一个单元
- splice 动态删除任意单元
使用上面4个方法时,都是直接在原数组上进行操作,即成功调任何一个方法,原数组都跟着发生相应的改变。并且在添加或删除单元时 length
并不会发生错乱
splice()不能在循环中使用,删除元素会使元素长度发生改变,数组的索引值也相应变化,会删除错乱
函数
函数参数
形参过多 会自动填上undefined
实参过多 多余的实参会被忽略(函数内部有一个argument,里面装着所有的实参)
如果不传入实参,会导致结果为undefined,所以可以给形参默认值,未传参时取默认值
返回值
return函数可以没有return,但是会默认返回undefined
作用域分类 全局作用域和局部作用域
局部作用域-函数作用域
如果函数内部变量没有声明,直接赋值,当作全局变量来看
函数内部的形参也可以当作局部变量
局部作用域-块级作用域( {}里的变量 ,如if)
必须是let const声明的变量
匿名函数与具名函数
// 1 函数表达式(匿名函数 )
let fn = function (x, y) {
console.log('函数表达式')
// console.log(x + y)
return x + y
}
具名函数调用的时候可以写到任意位置
匿名函数,比先声明函数表达式,后调用
立即执行函数 (之后会经常使用
/* 第一种写法 */
(function (a,b) {
console.log(a+b)
})(2,3)
// 第二种写法
(function (a,b) {
console.log(a+b)
}(2,3))
避免全局变量之间的污染,多个立即执行函数之间使用分号隔开
对象
let obj = {
uname:'小红',
age:18,
sex:'女',
}
for(let k in obj){
//console.log(k) // 属性名 'uname' 'age' 'sex' 数据类型 string
console.log(obj.uname)// 输出属性值
//console.log(obj.k) // undefined 因为对象里面没有k这个属性,所以是undefined
// console.log(obj.k) 相当于 console.log(obj.'uname')
// 对象名['属性名']
console.log(obj['uname']) // 'uname' === k
console.log(obj[k]) // 输出属性值 obj[k]
// k是获取对象的属性名 对象名[k]是获取属性值
}
堆栈空间分配
栈 : 由操作系统自动分配释放存放函数的数值, 局部变量的值 简单数据类型存放在栈里面
堆: 一半由程序员分配释放, 若程序员不释放, 由垃圾回收机制回收 引用数据类型存放在堆里面
值类型: 存储的是值本身,string number boolean undefined null
引用类型存储的仅仅是地址(引用) 通过new关键字创建的对象 array object function