JavaScript数据类型
一、数据类型
数据是有类型
在JS(ES5),数据分为两大类:
基本数据类型5类:Number、String、Boolean、Undefined、Null
复杂数据类型:Object、Array、Function
1.基本(简单)数据类型
- 数值类型(number) 即数字,包括整数、小数、八进制、十六进制等,除这些简单的数字外,在 Number 类型中还有几个比较特殊的情况。
- 算术运算不能得到正常数字会返回 NaN——NaN number(任意两个 NaN 都不相等的)
- 无穷大——Infinity number
- 小数相加 会有一点偏差(计算机为二进制,精度问题)
- 1,2,3,6,1.1,-100,-100.99…
- 字符串类型(string) 是用引号引起来的数据,单双引号都可以。“ web”或 ‘web’
- length属性:字符串长度
- charAt(index):在字符串中获取对应下标的字符,下标从 0 开始
- 字符串[下标]:在字符串中获取对应下标的字符,ie7 及一直下获取到 undefind
console.log(str[0]);//IE7 及以下返回 undefined
注意:除了引号引起来的是字符串外,所以我们从 input 表单中获取的用户输入的内容都是字符串,哪怕输入的是数字。
- 布尔类型(boolean)
- 属性:真假 true false
- 口诀:“非 0 为真,非空为真”——即 0 为假,其他数字为真;空字符串为假,其他为真。
- null 表示值为空
- undefined 表示变量没有初始化,值是空缺的
- 未定义 表示变量定义了,但是没有初始化(赋值)
注意:若检测null的数据类型,结果为object
console.log(typeof o);//object
特殊情况:NaN not a number
console.log(a);//NaN
console.log(typeof a);
null和undefined的区别:
undefined是访问以未初始化的变量时的返回的值
null是访问一个不存在的对象时返回的值
undefined表示访问一个空的变量,null表示访问一个空的对象
2.复杂数据类型
引用(对象)类型
例如:Object 、Array、Function 、Date…
1)Object类型
具体的东西(事物)都可以看做对象,也就是说万物皆对象(从页面当中获取的所有元素(标签)都是对象类型)。
声明 object 对象类型有两种方式,一种通过关键字 new 实例化对象(var obj=new Object()),还有一种通过字面量的形式声明对象(var obj1={}).在 object 数据类型中,储存值时,通过键值对的形式储存(name:“张三”)其中 name 叫做键名(属性名),“张三”叫做键值(属性值)。
var obj={ //定义对象
name:"jack",
age:20
};
//取出对象的值
console.log(obj.age);
//对象赋值
obj.age=100;
2)数组类型 Array
数组中可以保存多个数据,js 里面的数据组项没数据类型的限制,一个数组当中可以存放任意类型的数据。
属性:length 数组的元素个数
索引:从0开始
数组可以通过 [索引] 形式来取值和赋值
var arr = [10, 20, 10, 20, 100, 50];
console.log(arr[0]);//取值
console.log(arr[5]);
arr[0]=100;//赋值
console.log(arr);
3)Function类型
函数是一种封装
函数主要用于存放代码块,函数不会自动执行,需要调用才能执行。
//定义一个函数
function show() {
console.log('hello');
console.log('world');
console.log('哈哈哈');
}
show();//调用函数
show();
show();
判断数据类型:typeof
如果这个值未定义,返回——“undefined”
如果这个值是布尔值,返回——“boolean”
如果这个值是字符串,返回——“string”
如果这个值是数值,返回——“number”
如果这个值是对象或 null,返回——“object”
如果这个值是函数,返回——“function”
常量和变量
二、数据类型转换
1.为什么要进行数据类型转换?
2.数据类型转换
强制类型转换和隐式类型转换
3.强制类型转换
1)其它类型转换为number类型
Number()
- 可以将数字类型的字符串转换为数值类型
- 其它的类型则会转换为NaN
parseInt()
- 转换为 Number 类型,取整,舍弃小数部分。
- parseInt 还可以有第二参数,即以什么进制进行转换(建议任何时候加上第二参数 10,即以 10 进制转换),而 parseFloat 没有第二个参数。
parseFloat()
- 转换为 Number 类型,保留小数
注意: parseInt 和 parseFloat 在转换时对数据进行解析转换,前者是整数,后者是浮点数。他们的解析原则是从前往后进行解析,尽其可能。若存在有能识别的数字就解析,遇到不能识别的就结束转换,如果第一位就不是数字则返回 NaN。
//parseInt() 自左向右一个一个的转换,遇到非数字型字符,结束转换
// var a="hello";
// var b="10";
// var c="hello999";
// var d="999hello888";
// var s=parseInt(a);//NaN
// var s=parseInt(b);
// var s=parseInt(c);//NaN
// var s=parseInt(d);//999
// console.log(s);
//parseFloat()
// var s=parseFloat(a);//NaN
// var s=parseFloat(b);//10
// var s=parseFloat(c);//NaN
// var s=parseFloat(d);
var a="9.99";
var s=parseInt(a);//转换为整数类型
var s1=parseFloat(a);//转换为浮点类型
console.log(s,s1);
可以通过isNaN()方法来判断指定变量是否为:非数字,返回布尔值,是数字返回 false,不是数字返回 true。可以用于判断当前字符串是否是纯数值字符串。
2)其它类型转换为字符串类型
- 调用toString()
- 例如:a.toString() - String(变量)
- 两个方法会生成一个新的字符,不会改变原来的变量
- 两者区别:String 能针对任何数据类型,而 toString 不能针对 undefind 和 null
JavaScript中的假值:undefind、null、false、空字符串、0、NaN
4.隐式类型转换
在数据类型之间进行算术运算时,除了加法运算,其他(- * / %)都将转为 num-ber 类型。加法运算在遇到有字符串时,“+”变为连接符号,将字符串的前后拼接到一起。转换为 string 类型的值,如果两边都没有字符串,则都转成数字,变成数字的加法运算。
在JavaScript中运算过程中,会发生数据类型之间的转换。例如:加减乘除
+碰到了字符串,则运算结果是字符串类型
数字类型字符串,进行减法、乘法、除法等…
三、运算符
能够进行运算的符号
1.算术运算符
+(加法) - * / %(取余)
++(自增) --(自减)
计算规则:
如果两边都是数字,则就是普通的数学计算
如果有一边是字符串,则另一边也转成字符串,变成字符串的拼接
如果没有字符串,则调用 Number 方法,转成数字,再进行相加
如果有一边是对象,则对象调用 toString 得到的字符串表示,再进行计算
注意:
- 若+(加法)运算符两边有一个为字符串类型,则执行拼接操作,拼接结果为字符串类型
- 数字型字符串可以进行算术运算
自增自减运算符的前置和后置对变量自身没有影响 ++a a++
若自增和自减出现在了赋值语句中:
运算符前置,先运算,再赋值
运算符后置,先赋值,后运算
2.赋值运算符
= += -= *= /= %= (先运算,再赋值)
将一个数值赋给一个变量,即 a=10;则 10 赋给 a,那么 a 的值为 10。
3.比较(关系)运算符
运算结果是:布尔类型
大于 > < >= <= == != ===
注意:>=和<= 有一个成立即可
和=的区别: ==只比较数值,===既比较数值,又比较数据类型
console.log('我' == '我');//判断两个字符串是否一致
console.log(null==undefined);//true
console.log(null===undefined);//false
4.逻辑运算符
一般情况下,逻辑运算符的运算结果为:布尔类型
&& 逻辑与
两边均为真,则为真,其它均为假
口诀:“一假则假”
|| 逻辑或
两边只要有一个为真,则结果为真。两边均为假,则假
口诀:“一真则真”
! 非
取反
5.条件运算符
?:
条件?表达式1:表达式2
执行规则:若条件为真,则结果为表达式1,若条件为假,则结果为表达式2
6.运算符的优先级
四、拓展
基本数据类型与引用数据类型的区别
- 基本数据类型:保存在栈内存中
- 引用数据类型:数据的保存分为两部分,在堆中保存数据;在栈中保存数据在堆中的地址。
手绘内存图