数据类型

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等方法

你可能感兴趣的:(数据类型)