JavaScript的相关知识点简单总结
为了更加合理的使用内存空间,针对不同的数据分配不同的空间
基本数据类型
1.Undefined :表示没有值,注意typeof(Undefined)的返回值 也是Undefined.可以将Undefined
赋值给任何变量或属性,但并不意味了清除了该变量,反而会因此多了一个属性。
2.Unll:没有值. 注意:typeof(Null)返回值是Object,具有Null值的变量也并非object.
3.Boolean:布尔类型,true or false ,真或假,既能被代码处理,也可以控制代码的流程.
4.Number:数字类型 ,便于代码进行批量处理,也控制代码的迭代和循环等。
注意:typeof(NaN)和typeof(Infinity)都返回number 。NaN参与任何数值计算的结构都是NaN,而且 NaN != NaN 。Infinity / Infinity = NaN
5.String:字符串类型
引用数据类型
1.Object 对象
2.Array 数组型
3.Funcation 函数型
可以通过typeof来查看变量名的数据类型
基本数据类型存储在栈中
引用数据类型存储在堆中
自定义函数的两种方法:
<script>
function f(){
}
</script>
调用时function会提前所以f()可在函数的前边或者后边
<script>
var fn = funcation(){
}
</script>
提前的时fn变量名,函数体不会提前,所以在调用时,要在函数的后边
函数的返回值:
1.当函数无明确返回值时,函数返回undefined
2.有返回值时正常返回相应内容
JavaScript本身不支持函数重载:如果两个函数名字一样,即使函数体内容不一样,后面定义的也会覆盖在前面定义的,调用时也是调用后边的。
<script>
function f(){
console.log(a)
}
function f(){
console.log(b)
}//名字一样后边会覆盖前边
</script>
JavaScript在执行代码时分两个阶段:
1.预编译
1.把加var 的变量进行提升,但变量的赋值不会,提升到代码段的最前端
2.把使用function声明的函数进行提升(提升的是函数体) 例外:当函数重复命名时只是提升函数体,当函数出现在判断条件中提升函数名不提函数体
<script>
var a = 1 ;//定义变量 此内容可挂载在全局执行上下文中和全局对象里边(window)
if ("a" in window)//判断a是否在window里,显然存在 则此内容为true 继续执行if语句中的内容
{
function f(){
console.log(a);//输出1
}
f()
}
</script>
2.代码执行:从上到下依次执行
闭包
一个不能被释放的栈空间,可以读取其他函数内部变量的函数
由于在JavaScript语言中,只有函数的内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在函数内部的函数”。
用途:
1.获取函数内部的局部变量
2.让这些变量始终保持在内存中
注意
由于闭包会使得函数中的变量一直保存在内存中,所以不能滥用闭包,容易导致内存泄漏,影响网页性能。
<script>
var i = 0 ;
function A(){
var i = 10;//10给i赋值
function x(){
console.log(i);
}
return x;
}
var y = A();//执行A 返回x 所对应函数的地址给y 此时对应i的值是10
y();//进入y所对应的地址(函数体)显示出i的值为10,因为闭包导致i的值依然存在为10
function B(){
var i = 20 ;
y();//此时调用函数用到的i的值为函数定义处i的值
}
B();//10
</script>
JavaScript数据类型转化:(运算符两侧需要数据类型一致,若不一致JS解释器会自行转化)
1.隐式类型转化:默默的自己转化 0、-0、" " 、undefined、null 以上会直接转成false
<script>
var a = 1 ;
function b(){
if(!a){
//判断的时候a没有值所以是undefined,取反为真,所以继续执行代码
var a = 2 ;//预提升a的变量名
}
console.log(a);//2
}
b();
</script>
2.强制转化类型:parseInt…
let、const共同特点:
1.声明的变量不提升
2.配合{}使用可以形成块级作用域
3.声明的变量不会挂载到window全局对象上边
4.不能重复声明
声明变量使用let,声明常量使用const(声明时必须赋值)