一。
1.isNaN
是NaN吗
isNaN ) )函数用于检查参数是否为非数值。
console.log(Isnan;
结果:
isNaN () { [native code] }
console.log(Isnan(2);
结果:假
如果检测为数值,则返回false;
console.log(Isnan ) (" Hello " );
结果:真
如果检测为非数值,则为true;
[native code]的意思很明确了。 native的代码
实现的插件函数,而不是JavaScript代码
isNaN也有隐式类型转换、旋转值和严格旋转
console.log(Isnan )“2”);
结果:假
原因:因为isNaN导致隐式转换,旋转数值,并遵循严格的旋转
因此,console.log(Isnan ) (“2a”);
结果为true
2.js中的三大特殊数据
未定义
南大
空值
console.log(Nannan;
结果:假
console.log (undefined==undefined ); //t
console.log(undefined==null ); //t
console.log(Nanundefined;
结果:假
console.log(Nan==null );
结果:假
console.log(undefined===null ); //f
在非严格模式下,如果不编写声明关键字,而是直接为不存在的变量赋值,则变量将自动声明到顶级范围(全局范围)。 (但是,这是不规范的写法,请勿使用。)
二.递归
1 .概念
在一个函数内部执行自己
function fn () }
console.log(1) )。
fn ();
console.log(2)。
}
fn ();
2 .特点
占用内存
低版本的浏览器会导致内存泄漏
编程的想法可以利用递归的思想来解决问题
代码非常简洁
3 .递归解决问题的思想
传递:向内运行
归:向外结束
在黑漆漆的电影院找地方
公式: fn(n )=fn ) n-1 ) 1
传递终点、返回起点: fn(1)=1;
函数fn (n ) {
if(n==1) {
返回1
}else{
返回fn (n-1 ) 1;
}
}
fn(5;
计算n*…32*1
公式: fn(n )=fn(n-1 ) * n
目标: fn(1)=1;
函数fn (n ) {
if(n==1) {
返回1;
}else{
返回fn (n-1 ) *n;
}
}
console.log(fn(4);
1,1,2,3,5,8,13,21…,计算第n个数字
函数fn (n ) {
if(n===1||n===2) {
返回1;
}else{
returnfn(n-1 ) fn (n-2 );
}
}
fn(7;
3 .数组
1 .数组的概念和含义
数据的组合
数据打包、数据有序集合和索引是顺序的
2 .创建数组
字面量
var arr=[];
构造函数
var arr=new Array (
//使用构造函数构建数组,并将数组长度设置为5
vararr=array(5);
使用的构造函数创建数组时,如果只有一个数字数据,则需要创建数组
的长度
3 .使用数组
索引操作(数组的本机操作) )
增:
var arr=[“a”、“b”和“c”;
console.log(arr ) )。
//增加
var len=arr.length;
arr[len]=“hello”
console.log(arr[Len];
结果:
arr[6]=“world”;
console.log(arr[6];
结果:第6位直接添加world
删除:
arr.length=2;
Console.log(ARR.Length );
改:常用
写第几个人就是换第几个人
ARR[1]=“你好”
查:常用
console.log(arr[0] ) ) ) ) ) ) ) ) )。
console.log(arr[1] ) ) ) ) ) ) ) ) )。
console.log(arr[2] ) ) ) ) ) ) ) ) )。
用for循环遍历数组
for(varI=0; iarr.length; I ) {
console.log(arr[i]);
}
4.数组的方法操作
arr.push()
// 功能:末尾新增
// 参数:要新增的数据
// 返回值:新增之后的数组的长度
// 是否改变原数组:是
var res=arr.push(“d”);
// console.log(res);
// console.log(arr);
arr.pop()
pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。
// 功能:末尾删除;
// 参数:无;
// 返回值:返回数组最后一位数;
// 是否改变原数组:是
var res=arr.pop();
console.log(res);
console.log(arr);
arr.unshift()
// 功能:开头新增;
// 参数:要新增的数据;
// 返回值:新增之后的数组的长度
// 是否改变原数组:是
var res=arr.unshift(“hello”,“world”);
console.log(res);
console.log(arr);
arr.shift();
// 功能:开头删除;
// 参数:无;
// 返回值:数组的第一个元素
// 是否改变原数组:是;
var res=arr.shift();
console.log(res);
console.log(arr);
arr.splice()
// 功能:删除并且替换
// 参数:第一个参数是要删除的数据与的起点索引,必须写的
第二个参数是要删除几个数据,可选可以写0,则不会删除任意元素,而可以直接新增元素到这个位置
第三个参数,在删除的位置插入数据,可选
…,可插入多条新数据,可选
// 返回值:所删除的数的数组,若未删除则返回空数组
// 是否改变原数组:是
// 删除第一个索引第一个数,并且新增hello,123,asdas
// var res=arr.splice(1,1,“hello”, “123”,“asdas”);
// console.log(res);
// console.log(arr);
// 当第二个参数为0,直接在第一个索引增加"hello", “123”,“asdas”
// var res=arr.splice(1,0,“hello”, “123”,“asdas”);
// console.log(res);
// console.log(arr);
arr.slice()
// 功能:截取一段有范围的数组
// 参数:
// 参数1:数据截取起点
// 参数2:数据截取终点(不包括当前的数据)
// 返回值:截取出的新数组
// 是否改变原数组:否
var res=arr.slice(1,3);
console.log(res);
console.log(arr);
三.方法
1.专指属于某个对象的函数
var obj={
username:“admin”,show:function(){}
}
// console.log(username); 错误的
console.log(obj.username);
console.log(obj.show);
归属
变量如果属于某个对象,不叫变量,叫这个对象的属性
函数如果属于某个对象,不叫函数,叫这个对象的方法
show就称为obj的方法
四、数组的分类
当数组中全是字符时,叫字符数组
[“a”,“b”]
当数组中全是数值时,叫数值数组
[1,2,3]
当数组中全是对象时,叫对象数组(json数组)
[{name:“admin”},{name:“root”}]
// 对象数组
var arr=[{name:“admin”},{name:“root”}];
// 获取数组里面全部的对象
console.log(arr);
// 错误写法,无法获取
console.log(arr.name);
// 取数组下第一个索引,是一个对象
console.log(arr[0]);
// 取数组下第一个对象下的name的值
console.log(arr[0].name);
当数组中全是数组时,叫数组数组(二维数组,多维数组)
[[“a”,“b”],[1,2,3],[{name:“cbdyf”}]]
var arr=[[“a”,“b”],[1,2,3],[{name:“cbdyf”}]]
console.log(arr);
// 打印二维数组下索引1所在的数组
console.log(arr[1]);
// 打印第一层数组索引1的数组里面的索引2的数字
console.log(arr[1][2]);
6.多维数组:
var arr =[[[[1,2,3]]]];
console.log(arr);
console.log(arr[0]);
console.log(arr[0][0]);
console.log(arr[0][0][0]);
// 取3
console.log(arr[0][0][0][2]);
7.复杂数组的操作
逐层解析
五、内存中对数据的存储形式
内存的栈和堆
内存:计算机的运行空间
内存颗粒:一沙一世界
栈:保存的是类似于变量名(地址)
空间小,稳定,不可被修改
先进后出
堆:保存的是值
空间大,可被修改
先进先出
关系:一对一,多对一,没有一对多
数据类型的分类
值传递(基本数据)
内存中,值就是地址,地址就是值
拷贝的是值
引用传递(负责数据)
内存中,地址就是地址,值就是值
拷贝的是地址
引用传递数据的拷贝方式
浅拷贝:拷贝的是地址,修改新数据,会影响老数据
深拷贝:拷贝的是值
先创建一个新的空对象
利用for-in遍历老对象,逐个拷贝老对象的属性到新对象
var a=10;
var b=a;
b=20;
console.log(a);
console.log(b);
var o={
name:“admin”,
age:18,
sex:1
}
// var o2=o;
// o2.name=“root”;
// console.log(o2);
// 引用数据类型被拷贝时,修改新数据,会影响老数据,这种拷贝方式,称为浅拷贝
// console.log(o);
// 对象的专属遍历方式for-in,可以实现深拷贝
var o2={};