在计算机中,不同的数据类型所占的空间不同。js是弱类型或动态语言,数据类型在运行中确定。
且变量的数据类型是可以变化的。
(1)基本概念
-
在编程语言中,能够表示并操作的值(value)的类型,称为数据类型(type);
-
变量(variable)是一个值的符号名称,可以通过变量引用值;
-
可以把一个值赋值给一个变量, 这样程序在任何需要使用该值的地方,就可以直接引用该变量。
(2)数据类型分类
- 简单数据类型又叫值类型或者基本数据类型
- string ,number ,boolean , undefined ,null
- null的特殊:返回的是objiect-->如果我们以后打算将一个变量存储为对象,暂时没想好放什么,就给他null值。
- 复杂数据类型又叫引用数据类型,变量中存储的仅仅是地址
- Object(对象), Array(数组) ,Date(日期)
(3)基本数据类型
基本数据类型(数字、字符串、布尔值、未定义值、空值)
1.数字(number)
1.1进制数字表示
1)八进制表示:数字面前加0;
var numl=010;//numl表示8
2)十六进制表示:数字前面ox;
var numl=0xa;//10
- 在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
- 八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。
- 十六进制字面值的前两位必须是 0x,后跟任何十六进制数字(0~9 及 A~F)。其中,字母 A~F可以大写,也可以小写。(严格模式下也可以使用)
1.2 浮点数值
所谓浮点数值,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
1)解析成整数
var floatNum1 = 1.; // 小数点后面没有数字——解析为 1
var floatNum2 = 10.0; // 整数——解析为 10
2)科学计数法
var floatNum3 = 3.125e7; // 等于 31250000
//在默认情况下,ECMASctipt 会将那些小数点后面带有 6 个零以上的浮点数值转换为以 e 表示法表示的数值
var floatNum 4=0.0000003 ; //3e-7
1.3 浮点数运算有精度问题
1)0.1+0.2 != 0.3 //0.300000000000000003
解决办法:
1.4 数字型的最大最小值
1) 数字型的最大最小值
alert(Number.MAX_VALUE);//1.7976931348623157e+308
alert(Number.MIN_VALUE) ; //5e-324
2) 超出 JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的 Infinity 值。不能被计算
- lnfinity(无穷大)=Number.MAX_VALUE*2,
-Infinity(无穷小)=Number.MIN_VALUE*2;
3) isFinite()函数。这个函数在参数位于最小与最大数值之间时会返回 true,
1.5 非数字 (NaN)//not a numb
这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
- 例子:任何数除以0
实际上只有 0 除以 0 才会返回 NaN,正数除以 0 返回 Infinity,负数除以 0 返回-Infinity。
console.log(typeof 1 / 0) //NaN,typeof操作符的优先级高于除法
console.log(typeof typeof 5 / 0) //NaN
console.log(typeof (7 / 0)) //number
console.log(typeof (typeof 9 / 0)) //number
console.log(typeof typeof (typeof 4 / 0)) //string; typeof()返回的是一个字符串
- NaN两个特别的地方:
1)任何涉及 NaN 的操作(例如 NaN/10)都会返回 NaN
2)NaN 与任何值都不相等,包括 NaN 本身。
- isNaN(value)方法。用来判断非数字,数值返回false,非数字返回true
1.6 类型转换为数字
- 隐式转换:不可以全为字符串类型的 - * /运算
var = 2018 - “2016”; //2
-
parseInt() :
1)得到的是整数,可以提取首字母为数字的任意字符串,
2)如果第一个字符不是数字字符或者负号, parseInt()就会返回 NaN;
var num1 = parseInt("1234blue"); //123
var num2 = parseInt(""); //0
var num3 = parseInt("0xA"); //10 --》0x:16进制
var num4 = parseInt(22.5); //22
var num5 = parseInt("070"); //0
var num6 = parseInt("70"); //70
3)第二个参数:转换时使用的基数(即多少进制,可选值2/8/10/16)
var num = parseInt("0xAF", 16); //175
var num = parseInt("0xAF", 16); //175
- parseFloat():
1)得到小数浮点数,可以提取首字母为数字的任意字符串
2)由于 parseFloat()只解析十进制值,因此它没有用第二个参数指定基数的用法。
-
Number():只能转换数字型字符串。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number("100abc"); //NaN
var num5 = Number(true); //1
var num6 = Number([]); //0,Number(["100"])值为100
var num7 = Number([100, 100]); //NaN
2. 字符串型String
- 字符串的双引号不是字符,是一种标记为了和变量名做区分
- 使用单引号('内容')或着双引号("内容")或者反引号(`引起的内容`,多行字符串的表示方法)
1) 单引号里面只能用双引号;同理
var = "he'll'o" //he'll'o 单引号看作字符,双引号不是字符
2)字符串转义符(写在引号里面)
3)字符串长度:length属性;(语法:string.length)
var str = ’my name‘;
console.log(str.length);
4)字符串拼接:+; 字符串+数字(或其他类型)=字符串
3. 布尔值(boolean)
字面值:true 和 false //多用于选择结构的条件判断
4.未定义的值(undefined)
- 变量没有初始赋值
var n;//n=undefined,没有初始赋值;
- 对象的某个属性值不存在
var obj={name:"李明"};
obj["age"] ;
- undefined的意义:为了程序的安全设定。为了防止野指针(比如:变量是没有初始赋值还是为null)
5.空值
- 用来描述空值;
- unll的意义:变量有数据,但是还没有业务数据
var n=null;//n为null
n+1; //1
n+'op'; //'nullop'
(4)typeof()方法
对一个值使用 typeof 操作符可能返回下列某个字符串:
- "undefined"——如果这个值未定义;
- "boolean"——如果这个值是布尔值;
- "string"——如果这个值是字符串;
- "number"——如果这个值是数值;
- "object"——如果这个值是对象或 null;
- "function"——如果这个值是函数。
1)获取数据类型(这是检测(不是取值操作),如果检测变量是无声明无赋值不会报错)
var num=10;
console.log(typeof num);//number
console.log(typeof num1);//undefined
var re = typeof("20")
var re1= typeof(null)
var re2 = typeof(function(){})
2)typeof()检测数据类型的底层原理
数据类型在底层都是以二进制形式表示的(存储的地址)
二进制的前三位为 0 会被 typeof 判定为对象类型,null为全0所以会被误判为"object",
- 000 - 对象,数据是对象的应用
- 1 - 整型,数据是31位带符号整数
- 010 - 双精度类型,数据是双精度数字
- 100 - 字符串,数据是字符串
- 110 - 布尔类型,数据是布尔值