JS基础-04-匿名,系统函数及对象

78 阅读3分钟

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进制地址,然后将地址保存在栈内存

图片1.png

null:表示空地址,没有指向任何堆内存数据

引用类型的数据如果不被任何的地址所指向就会自动销毁,直接赋值为null,就可以销毁引用类型的数据。