1.递归
是一个函数的内部调用自身这个函数,本身是一个死循环
递归一直运行会产生内存泄漏,造成系统崩溃
如何使用:
要有边界条件,结合着return使用
//使用递归计算斐波那契数列第n项的值
//第n项的值 = 第n-1项的值 + 第n-2项的值
function fib(n){
//边界条件:当n为1或者2的时候,返回1
if(n === 1 || n === 2){
return 1;
}
return fib(n-1) + fib(n-2);
}
console.log( fib(70) );
JS属于单线程运行逻辑,无法充分利用CPU内核,递归对CPU消耗比较大,JS不适合深层次的递归嵌套。
2.匿名函数
function(){ }
没有名称的函数
2.1创建函数
//函数声明
function fn(){
}
//函数表达式
var fun=function(){
}
//变量名称就是函数名称
//调用
fun()
对比函数名称和函数名称()
函数名称():调用函数,得到函数的返回值
函数名称:本质上就是一个变量,保存了一个函数
对比函数声明和函数表达式创建函数的区别
函数声明存在函数提升,可以先写调用再写创建;
函数表达式只是变量声明提升,必须先写创建再写调用
2.2匿名函数自调用
目的是为了防止全局污染
//方法一:()()
(function(){
//函数作用域下,里边的变量都是局部变量
})();
//方法二:(())
(function(){
//函数作用域下,里边的变量都是局部变量
}())
2.3回调函数
将函数作为参数来传递到另一个函数
function tao(madai){
madai() //调用传递的回调函数
}
function dong(){
}
tao(dong) //dong是回调函数
tao(function(){ }) //匿名函数是回调函数
3.系统函数
3.1Number.isNaN()
判断一个值是否为NaN(非数字),会隐式转换为数值型,
是NaN -> true
不是NaN -> false
console.log(isNaN('10'));
//false
console.log(isNaN('10a'));
//true
//console.log(isNaN(NaN));
//true
3.2Number.isFinite()
方法用来检测传入的参数是否是一个有穷数。
console.log(Number.isFinite(1 / 0));
// expected output: false
console.log(Number.isFinite(10 / 5));
// expected output: true
console.log(Number.isFinite(0 / 0));
// expected output: false
3.3eval()
函数会将传入的字符串当做 JavaScript 代码进行执行
console.log(eval('2 + 2'));
//4
console.log(eval(new String('2 + 2')));
//2 + 2
console.log(eval('2 + 2') === eval('4'));
//true
console.log(eval('2 + 2') === eval(new String('2 + 2')));
//false
4.对象
是一组属性和方法的集合
一部手机,属性有颜色、品牌、CPU、内存... 方法有打电话、发短信、玩游戏、看视频、办公...
涛哥,属性有发色、身高、体重... 方法有摊煎饼、养兔子、跑接力赛...
万物皆对象
4.1JS中的对象
自定义对象:用户自己创建的对象
内置对象:JS提供的对象
宿主对象:根据不同的执行环境划分
4.2自定义对象创建方式
对象字面量
内置构造函数
自定义构造函数
4.3对象字面量
var obj={ 属性名1: 属性值1, 属性名2: 属性值2.... }
属性名的引号可以省略,如果含有特殊字符必须添加
4.4访问属性
对象.属性名
对象['属性名']
如果访问没有的属性,则返回undefined
4.5内置构造函数 (9种)
Number ()、String ()、Boolean ()、
Object ()、Array ()、Function ()、
Date ()、RegExp ()、Error ()
4.6遍历属性
for(var k in 对象){
k代表每个属性名
对象[k] 代表属性名对应的属性值
}
4.7检测属性是否存在
| 对象.属性名 === undefined | 存在 -> false 不存在 -> true |
|---|---|
| 对象.hasOwnProperty('属性名') | 存在 -> true 不存在 -> false |
| '属性名' in 对象 | 存在 -> true 不存在 -> false |
4.8对象中的方法
方法对应的是一个函数
var person = {
play: function(){
this 指代调用方法的对象
}
}
person.play(); //调用
5.数据的存储
原始类型,将数据直接存储在栈内存;
引用类型,将数据存储在堆内存中,然后自动生成一个16进制地址,然后将地址保存在栈内存
null:表示空地址,没有指向任何堆内存数据
引用类型的数据如果不被任何的地址所指向就会自动销毁,直接赋值为null,就可以销毁引用类型的数据。