undefined:声明但是没有赋值,本应该有值
1.变量被声明了,但没有赋值时,就等于undefined。
2.对象没有声明或者赋值的属性,该属性的值为undefined。
3.函数没有提供参数或者返回值,默认为undefined(扩展知识)。
null:表示"没有对象",即该处不应该有值
1.作为函数的参数,表示该函数的参数不是对象(扩展知识)。
2.作为对象原型链的终点(扩展知识)。
Number:
1.正数、负数、0、小数
2.NaN:不是一个数字
isNaN:如果检测值不是数字类型,浏览器先转成数字类型,再判断
NaN==NaN返回false
var a=Number("12px");
if(a==12){
console.log("a=12");
}else if(a==NaN){
console.log("a不是一个数字");
}else{
console.log("以上都不成立");
}
3.强制数据类型转换:Number,可以转换任意类型为数字,如果是字符串,比如是纯数字字符串,不能含有其他字符。
4.非强制数据类型转换:parseInt\parseFloat,只能转换字符串或者数字。可以含有其他字符,但是数字必须开头。
从左到右,一个一个字符查找,把字符串转化成数字,如果遇到非数字,就不再查找。
5.float类型bug(扩展知识)
0.1+0.02==0.3
0.8*7==5.6
解决办法:toFixed
.Boolean
1.!:将值转成布尔类型,然后取反
2.!!:将值转成布尔类型,相当于Boolean
3.如果只有一个值:只有0,NaN,null,undefined,""返回false,其他全部返回true。
2.比较规则:
1.对象与对象比较永远不相等。[]==[] {}=={} 3=="3"
2.基本数据类型比较 只要值相等就相等
3.对象与字符串比较,先将对象转成字符串 []==""
4.对象与Boolean比较,对象转成字符串,然后转成数字,Boolean也转化成数字比较
5.对象与数字比较,对象转成字符串,转数字,然后与数字比较
6.数字==布尔,布尔转成数字
7.字符串==数字,字符串转数字
8.字符串==布尔,都转化成数字
9.null==undefined,true,与其他所有类型都不等
10.===比较数据类型,==转成同一个数据类型比较
字符串
1.定义
2.转义符
\n \r \t \b \\ \' \''
3.转字符串:
.toString()
String()
4.字符串是不可变的引用类型
5.字符串常用方法(API):
substr
substring
replace
replaceAll
Object
1.由多组属性名\属性值组成(多个键值对key\value组成)
2.对象的两种创建方式(json字面量创建,new实例创建)
3.JSON类型:JSON.parse,JSON.stringify
4.数组类型:Array,常用属性和方法,访问方法
5.属性增删改查,属性不能重复
两种方式访问属性
假删除\真删除
6.对象细分:Object,RegExp,String,Boolean,Date,Array,Function,Math等对应的实例
对象、类、实例
变量
1.变量:可变的量,用来存储值和代表值
2.定义方法:后台定义方法,前台定义方法
3.=是赋值操作,左侧是变量名,右侧是存储的值
4.松散数据类型
2.数据类型:
1.typeof用来判断六中数据类型
2.基本数据类型:number,string,boolean,null,undefined
3.引用数据类型:object,array,function,regexp,Date,包装对象,Math,Globle
数据类型检测
1.例子
var num=12;
num2=num;
num2++;
console.log(num2);
//++num2
//num2+=num2;
var obj={name:"zhufeng"};
var obj2=obj;
obj2.name="zhufengpeixun";
console.log(obj);
2.结构存储
1.内存存储数据的两个逻辑组成部分:堆与栈
栈(stack):有限的空间,不可变大小,操作速度快,线性表,先进先出。不仅仅是变量,执行环境等都可以存在于堆中,由系统自动分配。
堆(heap):空间相对比较大,可变大小空间,map形式存储(key,value),通过new手动分配(部分对象可以不用new声明分配)
2.堆与栈的功能:
栈负责保存我们的少量数据代码与数据引用和代码执行路径
堆则负责保存大量数据对象。
3.内存地址:0x+八位数字
3.数据在内存中的存储
1.引用类型总是放在堆中。
2.值类型总是存在于栈中。
3.指针总是存在于它声明的地方。
4.基本数据类型和引用数据类型区别
1.基本数据类型把值直接赋给变量。接下来操作过程中,直接使用值操作。两个基本数据类型没有什么关系。
2.引用数据类型:
1.在定义一个变量
2.开辟一个新的空间,把属性名和属性值存在这个空间中。
3.把空间地址赋给变量。
4.连个引用类型相等引用的同一个内存空间的值,一个改变,另外一个也跟着改变。
5.如果一个变量断开引用,重新赋值,另一个变量不受影响
5.数据类型检测
1.typeof:返回数据类型字符串,不能检查object下细分的类型。可以检查函数和null(例子:多个typeof嵌套)
2.instanceof
3.Object.prototype.toString.call();(扩展知识)
4.constructor([].constructor===Array)(扩展知识)
if.4个判断语法
1.if、else:能完成所有的判断
if判断条件可以是表达式,也可以是一个值,也可以是多个表达式
重点:判断代码块内部声明的变量外部也可以访问,所以全局变量不要以i~n字母命名
2.三元运算符:多值单条件判断
false?console.log("1"):void(0)
3.switch:单值多条件判断
break与不写break
条件判断:===
4.&&:多值单条件简单判断
&&和|| 多值判断
2.js判断的应用(开关灯)
1.获取body
document:上下文context
document.getElementById:只能获得一个
get element by id
2.让body有个点击事件
3.点击时候让body颜色改变
4.用if else switch 三元运算符来实现
1.for 四部曲:
1.声明赋值变量 var i=0;
2.执行判断条件 i<5
3.执行{}内代码
4.执行i++部分
声明变量可以在外部访问。
赋值区、判断区、操作区都可以写多个表达式
5.退出双重循环
2.循环逻辑控制语句:break/continue;
break:直接退出循环,不执行下次循环,不执行i++部分
continue:终止当前循环,执行下一次循环
3.练习题:
for(var i=0;i<10;i++){
if(i<=5){
i=i+2;
continue;
}
i=i+5;
break;
console.log(i);
}
console.log(i);
2. forin while dowhile
1.forin
key value:有多少个属性,就遍历多少次,不管是对象属性还是原型属性
迭代会先迭代数字,后迭代属性,最后迭代原型属性
for in循环中想获取我们的属性名,只能用[],不能用.,因为不确定是否存在数字属性名
2.while
3.dowhile
3.隔行变色,三行变色
1.用for,forin,while,dowhile实现
2.用多种判断方式实现
3.鼠标移入改变颜色
函数
function:函数数据类型,相当于一个方法或者一个功能
函数别名:方法,如果被当作事件处理函数,又称作句柄
1.定义一个函数(计划一段代码,定义一个模板)
1.在内存堆中开辟一个内存空间
2.把函数体js代码当作字符串存在内存中间内(如果函数只定义,没执行的话,没有任何意义)
3.堆栈中的函数名对应地址,地址引用
4.当一个函数执行时候,执行环境被推入内存中,这个过程叫做压栈。
2.执行函数(执行计划)
1.在堆栈中开辟一片空间,这个空间叫做执行环境
2.把存储空间的js代码字符串当作代码运行
3.function 作用:
1.防止代码重复
2.将代码进行封装,代码没有必要重新编写,只需要执行以下函数即可。
3.隐藏变量,创建私有变量
4.创建类
4.参数:求1+1的和(形参:可以理解成一个变量)(多态:一个功能的多重形态,通过参数实现不同的功能)
function sum(){
var total=1+1;
console.log(total);
}
sum();
1.形参的作用:实现一个功能,发现部分原材料没有,置顶计划时候没有办法获取,需要从外部获取。
这时候我们需要把原材料定义在形参上,在执行计划的时候,只提供原材料就好了。
2.定义一个形参,没有传递值,默认值:undefined,传递参数检测,没有重载
function sum(num1,num2){
if(typeof num1==="undefined"){
total+=num1;
}
if(typeof num2==="undefined"){
total+=num2;
}
console.log(total);
}
3.arguments:函数内置接受参数机制,类数组(数字作为索引,索引从0开始,代表第几个传递的参数)
//内置:天生存在的,不管你传递参数没有,都会有这个对象的存在
console.dir(arguments);
[0],length,callee:代表当前函数本身
4.函数执行时候,会在内部实现一个私有地盘,只有在这个地盘内的代码可以访问私有变量,外部代码不可以访问私有变量。
函数执行时候会形成一个私有作用域保护里面的变量不受外界干扰,我们把这个机制叫做闭包。
arguments修改会修改形参内容,同理形参修改也会修改arguments。只有一种情况例外,
arguments的长度不是可变的,所以修改形参不会增加arguments.
5.外部如何访问total?return
在外部想访问什么值,函数内部return这个值就可以了.外面可以访问这个结果或者对结果再进
行加工。
这个时候函数终止执行,控制函数函数体代码执行到什么位置结束。
如果我们没有写return,或者写return;,默认返回值undefined
实名函数、匿名函数、函数表达式和立即执行函数
~,!,+,-与()都可以定义立即执行函数
终止外部函数执行
6.事件句柄
7.eval
数组
1.两种创建方式
new Array(数组内容) //实例创建方式
[xx,xx,xx] //字面量创建方式
console.dir([])
2.数组是由多个项组成的,每个项之间用逗号隔开,每一项存储的数据类型可以是任意数据类型
3.数组也是对象类型的,是由属性名和属性值组成
属性名:数组中代表第几项的编号,也可以称之为索引
4.输出数组内容:
数组[索引项]:就是获取数组中第索引+1项的对应的内容
length/['length']:获取数组长度
如果索引超出索引项,会返回undefined
数组迭代,for 循环和for in 循环,for循环声明前两个属性实现数组迭代
1.添加方法
push:
shift:
pop:
unshift:
splice(实现shift,pop,unshift,push)
2.查询和复制方法
slice(实现复制)
concat(实现复制)
3.转字符串
toString
join
实现求和:eval(join("+"))
4.数组排序和排列
reverse
sort:原有数组也改变:只能处理10以内的数字排序
//由小到大
sort(function(a,b){
//a,b a代表每次循环当前项,b代表每次循环后续项
//通过冒泡排序的思想实现
return a-b; //如果前面比后面大,这样就交换位置
});
5.不兼容方法
map,forEach,indexOf等方法