JavaScript 中的数据类型可以分为两大类:基本类型和引用类型。
基本类型中有 5 种数据类型: String、Number、Boolean、Undefined、Null。引用类型中有 1 种数据类型:Object。
JavaScript 不支持创建任何自定义类型的机制,所以所有值都成为 6 种数据类型之一。
不同数据类型在计算过程中会自动进行转换:
数字 + 字符串:数字转换为字符串。
布尔值 + 字符串:布尔值转换为字符串。
布尔值+ 数字:布尔值转换为数字。
布尔值+布尔值:布尔值转换为数字。
可以进行类型检测来确认属于哪种数据类型:
- typeof:可以使用 typeof 运算符来检测一个值或者变量的数据类型。
语法:typeof 值或变量
,返回的是数据类型的小写字符串表达。字符串返回'string'
;数值返回'number'
;布尔值返回'boolean'
;未定义值返回'undefined'
;对象或 null 返回'object'
;函数返回'function'
。typeof 不是一个函数,而是一个内置的操作符。
数据类型首字母大写,typeof 返回的类型字符串小写。
typeof 在检测基本数据类型的时候好用,但检测引用类型的时候,并不能具体检测到到底是什么类型的 Object 对象。console.log(typeof 5); // ”number“ var name = 'Lee' console.log(typeof name); // ”string“
- instanceof:使用 instanceof 运算符检测引用类型,来判断对象的具体类型。
语法:A instanceof B
,实例对象 A 是否是构造函数 B 的实例。如果 B 函数的原型对象在 A 对象的原型链上,就返回 true,否则返回 false。function Foo(){} var f1 = new Foo() console.log(f1 instanceof Foo) // true console.log(f1 instanceof Object) // true。这是因为 Object.prototype 是原型链的终点
String 字符串类型:
使用单引号或者双引号括起来的一个或多个字符就是字符串。
字符串类型包含了一些特殊的字符字面量:转义序列,即以反斜杠开头的不可显示的特殊字符。
\b
:退格(将当前位置移到前一列)
\f
:换页(将当前位置移到下页开头)
\n
:换行(将当前位置移到下行开头)
\r
:回车(将当前位置移到本行开头)
\t
:水平制表(跳到下个 TAB 位置)
\v
:垂直制表
\\
:代表一个反斜杠”\”
\’
:代表一个单引号
\”
:代表一个双引号
\0
:空字符
var str = '你好\n世界'
var str = ”hello”;
属性:
- length:返回 string 的长度,代表的是字符串中字符的个数。每个汉字、英文字母、符号、空格都按一个字符算。
// 判断字符串长度: var len = 0; for (var i=0; i<this.length; i++) { if (this.charCodeAt(i)>127 || this.charCodeAt(i)==94) { len += 2; } else { len ++; } } return len;
- 数值下标:字符串可以使用方括号内下下标的形式,访问某个字符。
var str = '你好,世界' console.log(str[1]) // 好
方法:
-
通用方法:
str.toString()
、str.toLocaleString()
、str.valueOf()
都返回字符串的基本值。toString():转换为字符串。使用toString()方法,除了null和undefined,其他数据类型都可以转换为string类型。一般是不需要传参的,但在数值转换成字符串的时候可以传递进制参数。
如果在转型之前不知道变量是否是null或undefined的情况下,可以使用转型函数String()。如果值有toString()方法,则自动调用该方法并返回相应的结果;如果是null和undefined,则返回’null’和’undefined’。能够将任何类型的值转换成字符串。var box=10; alert(box.toString());//弹出’10’ alert(box.toString(2));//弹出’1010’,转成2进制
-
大小写转换方法:
str.toLowerCase()
:将字符串全部转换为小写。
str.toUpperCase()
:将字符串全部转换为大写。
str.toLocaleLowerCase()
:将字符串全部转换为小写,并且本地化。
str.toLocaleUpperCase()
:将字符串全部转换为大写,并且本地化。只有几种语言具有地方特有的大小写本地化,一般来说,是否本地化效果都一致。
-
字符方法:
str.charAt(index)
:返回指定索引位置的字符,索引从 0 开始。索引位置超出字符串长度则返回空字符串
str.charCodeAt(index)
:返回指定索引位置字符的 Unicode 编码,索引从 0 开始。var str=”hello”; console.log(str.charAt(1)); // “e” console.log(str[1]); // 通过数组方式获取,但在 IE 浏览器会显示 undefined,使用需谨慎。
-
位置方法:
str.indexOf(char)
:返回指定字符在字符串中首次出现的位置,如果没有找到则返回 -1。从前往后搜索,索引值从 0 开始。
str.lastIndexOf(char)
:返回指定字符在字符串中首次出现的位置,如果没有找到则返回 -1。从后往前搜索,但返回的位置的数字仍是从前面开始数的,索引值从 0 开始。可以传入第二个参数 n,表示开始查找的位置索引。
var str = "123456389"; console.log(str.indexOf("3")); // 2 console.log(str.lastIndexOf("3")); // 6
//找出全部的 L var box=’Mr.Lee is Lee’ var boxArr=[]; var pos=box.indexOf(‘L’); while(pos>-1){ boxArr.push(pos); pos=box.indexOf(‘L’,pos+1); } consolr.log(boxArr);
-
操作方法:
-
str.concat()
:拼接字符串。 -
str.replace(findstr,tostr)
:替换子字符串。findstr:要替换的字符串。tostr:替换后的字符串。 -
str.split(bystr,limit)
:拆分子字符串为数组。bystr:分隔符。limit:返回的数组的最大长度,可省略。var str=”1,2,3,4”; var strArray=str1.split(“,”); alert(strArray);//返回[1,2,3,4]
-
str.substr(start, length)
:获取子串,返回从 start 位置开始的长度为 length 的子串。索引值从 0 开始。如果省略 length,则返回从 start 开始到结尾的子字符串。参数支持负数。var name = ’Mr.Lee’; // 第一个参数为负数的话,表示倒数,最后一位是 -1,然后是 -2,以此类推,但是长度仍然是从前往后数。 console.log(name.substr(-3, 2)); // Le。
str.substring(from, to)
:获取子串,返回从 from 开始位置到 to 结束位置之间,不包含 to 的子串。索引值从 0 开始。如果省略 to,则返回从 from 开始到结尾的子字符串。参数不支持负数,会默认转为 0。var name = ’Mr.Lee’; // substring() 第二个参数可以小于第一个参数,将自动把较小的数字调整到前面 console.log(name.substring(3, 0)); // Mr.。(3, 0) 变为 (0, 3)。 // substring() 不支持负数,会默认转为 0。 console.log(name.substring(-3)); // Mr.Lee。-3 转为 0,返回从 0 开始到结尾的子字符串。 console.log(name.substring(3,-1)); // Mr.。-1 转为 0,并且把较小的数字提前变为 (0, 3)。
str.slice(from, to)
:获取子串,返回从 from 开始位置到 to 结束位置之间,不包含 to 的子串。索引值从 0 开始。如果省略 to,则返回从 from 开始到结尾的子字符串。参数支持负数。var name = ’Mr.Lee’; // slice() 第二个参数必须大于第一个参数 console.log(str.slice(3, 0)); // 返回空字符串 // slice() 支持负数,参数为负数的话表示倒数,最后一位是 -1,然后是 -2,以此类推。 console.log(name.slice(-3, -1)); // Le。
总结:
substr() 的第二个参数是子字符串的长度,而不是位置编号。
substring() 和 slice() 的功能基本一致,都是获取从开始位置到结束位置的子字符串。区别是:- substring() 可以自动交换两个参数的位置,而 slice() 不行。
- slice() 参数可以是负数,substring() 不行。
//去掉第一个和最后一个字符,获取到中间的元素 var str = '1哈哈哈1'; console.log(str.substr(1, str.length -1 )); console.log(str.slice(1,-1));
-
str.trim()
:删除字符串两端的空白符。var str = " Hello World! "; console.log(str.trim());
-
-
字符串的模式匹配方法:
str.search(str/RegExp)
:返回在字符串中与正则表达式匹配的字符的开始位置。和indexOf()
一样。str.match(str/RegExp)
:以数组的形式返回在字符串中与正则表达式匹配的字符。
静态方法:
String():转换函数,强制转换为字符串类型。
Number 数字类型:
JavaScript 中的数字类型类型分为整型和浮点型。所有数字都采用 64 位浮点格式存储。
对于过大或过小的数值可以使用科学计数法 。例如:
300000000
可以写成3e8
,表示 3 乘以 10 的 8 次方。
-
整型:十进制、二进制、八进制、十六进制。
二进制以
0b
开头,后面是0-1
。
八进制前导是0
, 后面是0-7
。
十六进制前面两位必须是0x
,后面是0-9
及A-F
(大小写都行)。
无论是什么进制,输出都是按十进制。var num1 = 070; // 有效的八进制 console.log(num1); // 56 var num2 = 08 // 无效的八进制 console.log(num2) // 自动解析为 8
-
浮点型:整数部分加小数部分组成,只能用十进制来表示。
浮点数中零点几的零可以省略不写。例如:
0.15
可以写成.5
。由于保存浮点数值需要的内存空间比整型数值大两倍,因此 ECMAScript 会自动将可以转换为整型的浮点数值转换为整型。
Javascript 使用了 IEEE754 二进制浮点数算术标准,这会使得一些个别的小数运算产生精度丢失的问题。例如:
0.1 + 0.2 // 0.30000000000000004
。
可以在进行小数运算时,通过调用数字的 toFixed() 方法保留指定的小数位数来解决。var num1 = 0.15;
静态属性:
静态属性:可以直接通过 Number 这个类型名称来调用的属性。
- MAX_VALUE:表示最大值。
MIN_VALUE:表示最小值。console.log(Number.MAX_ALUE);//1.7976931348623157e+308 console.log(Number.MIN_VALUE);//5e-324
//如果超过范围,就会出现Infinity(正无穷)或-Infinity(负无穷)。 var box=100e1000; console.log(box);//弹出Infinity
- POSITIVE_INFINITY:表示正无穷大。
NEGATIVE_INFINITY:表示负无穷大。console.log(Number.POSITIVE_INFINITY);//infinity
- NaN:是英语
not a number
的意思,不是一个数字。用于表示一个本来要返回数值却未返回数值的情况。可以通过
Number.NaN
得到 NaN 值。
在数学运算中,如果结果不能得到数字,那么就会得到 NaN。例如:0 除以 0。
任何与 NaN 进行运算的结果均为 NaN;
NaN 不与任何值相等,包括自身;console.log(Number.NaN); // NaN console.log(0/0); // NaN console.log(NaN+1); / /NaN console.log(NaN == NaN); // false
静态方法:
-
Number():转型函数,强制转换为数字类型。
- String 类型:如果只包含数值,则直接转换为数值;如果字符串为空,则转为 0;其他的字符串都转换为 NaN。
- Boolean 类型:true 转换为 1,false 转换为 0。
- Undefined 类型:转换为 NaN。
- Null 类型:转换为 0。
- Object 类型:对象都转化为 NaN。
console.log(Number(‘12’)); // 12 console.log(Number(‘’)); // 0 console.log(Number(‘你好’)); // NaN
-
parseInt() 和 parseFloat():用于把字符串转换为数值。parseInt() 用于整数转换,除了能识别十进制,也能识别八进制和十六进制。parseFloat() 用于浮点数值转换,不能识别八进制和十六进制。第一个参数是字符串,第二个参数是用于表明第一个参数是什么进制的。
console.log(parseInt(‘12.34’)); // 12。会自动截掉第一个非数字字符之后的所有字符 console.log(parseInt(‘12Lee34’)); // 12。会自动截掉第一个非数字字符之后的所有字符 console.log(parseInt(‘Lee12’)); // NaN。不是以数字开头,返回 NaN console.log(parseInt(‘’)); // NaN。不是以数字开头,返回 NaN // ECMAScript 为 parseInt() 提供了第二个参数,指定进制。 console.log(parseInt(‘AF’,16)); // 175。第二参数指定十六进制,可以去掉 0x 前导 console.log(parseFloat('12.34')); // 12.34 console.log(parseFloat('12.34.56')); // 12.34,只认一个小数点。会自动截掉第一个非数字字符、非小数点之后的所有字符 console.log(parseFloat('12Lee34')); // 12。会自动截掉第一个非数字字符、非小数点之后的所有字符 console.log(parseFloat('Lee12')); // NaN。不是以数字开头,返回 NaN console.log(parseFloat('')); // NaN。不是以数字开头,返回 NaN console.log(parseFloat(‘0xA’)); //0。不认十六进制
-
isFinite():确定一个数值是否超过了规定范围,没有超过返回 true,超过了返回 false。
var box=100e10; console.log(isFinite(box)); // true
-
isNaN():判断是否不是数值。如果不是数值,返回 true;如果是数值,返回 false。isNaN() 函数在接收到一个值之后,会进行隐式类型转换,将这个值转换成数值。
console.log(isNaN(‘25’)); // false,’25’是字符串数值,可以转成数值 console.log(isNaN(true));/ / false,true可以转成1 console.log(isNaN(‘你好’)); // true,小米不能转成数值
方法:
-
num.toString()
、num.toLocaleString()
。 -
num.toFixed(digit)
:数字转换为字符串,并保留小数点后指定的位数,不足用 0 补足。toFixed() 不是已四舍五入的方法进行取舍的,而是使用银行家舍入法进行取舍的,其实质是一种四舍六入五考虑的方法:
- 当舍去位的数值 <= 4 时,直接舍去。
- 当舍去位的数值 >= 6 时,在舍去的同时向前进一位。
- 当舍去位的数值 = 5 时:
- 5 后面的位不为空,且不全为 0, 在舍去的同时向前进一位。
- 5 后面的位为空或全为 0 :
- 5 前面的位为奇数,在舍去的同时向前进一位。
- 5 前面的位为偶数,直接舍去。
也就是:四舍六入五考虑;五后非零就进一;五后为零看奇偶,五前为奇要进一,五前为偶就舍去。
// 使数字按字符串类型相加: var a = 1; var b = 2; var c = a + ”” + b; // 12
Boolean 布尔类型:
JavaScript 中的布尔类型只有两个:true 和 false,用来表示真和假。
静态方法:
Boolean():转型函数,强制转换为布尔类型。
- String 类型:任何非空字符串转换为 true,空字符串转换为 false。
- Number 类型:0 和 NaN 转换为 false,其他转换为 true。
- Undefined 类型:undefined 转换为 false。
- Null 类型:null 转换为 false。
- Object 类型:任何对象都转换为 true。
var box="小米";
console.log(Boolean(box)); // true
String、Number、Boolean 是基本类型,但又是特殊的引用类型,因为可以调用内置方法,所以叫做基本包装类型。实际上,每当读取一个基本包装类型的时候,后台就会创建基本包装类型对应的一个对象,从而能够调用一些方法来操作这些数据。
基本包装类型无法给自己创建属性和方法,但可以调用系统内置的方法。//字面量方式: var box="你好"; // 基本类型 box.name="铛铛"; // 给基本类型添加属性,无效 box.age=function(){ return 20; }; // 给基本类型添加方法,无效 alert(typeof box); // string alert(box.substring(1)); // 好 alert(box.name); // undefined alert(box.age()); // 出错
// 使用 new 运算符:不推荐,因为会导致分不清到底是基本类型还是引用类型 var box=new String(‘你好’); // 引用类型,String 的引用类型 box.name=’铛铛’; // 给引用类型添加属性,有效 box.age=function(){ return 20; }; // 给引用类型添加方法,有效 alert(typeof box); // object类型 alert(box.substring(1)) ;// 铛铛 alert(box.name); alert(box.age());
Undefined 未定义值类型:
已经声名但是没有赋值的变量。Undefined 类型只有一个值,就是 undefined。
var a
console.log(a) // undefined
console.log(age) // 报错
// 但 typeof a, typeof age 返回的都是 undefined。
undefined 源生自 null,因此 ECMA262 规定对它们的相等性测试返回 true。
console.log(undefined == null) // true console.log(undefined === null) // false,因为数据类型不同
Null 空值类型:
表示一个空对象指针,用于定义空的或者不存在的引用,所以 typeof 会返回 Object。Null 类型只有一个值,就是 null。
var a = null;
可以初始赋值的时候给变量赋值为 null,表明后续将要赋值为对象;也可以通过给一个变量赋值 null 来清除变量的内容。
// 初始赋值为 null,表明将要赋值为对象
var box = null
box = {
name:’Lee’
}
// 让 box 指向 null,切断了 box 与之前对象的连接,之前那个对象没有变量再去引用指向它了,就成了垃圾对象,会被垃圾回收器回收,释放所占用的内存
box = null
Object 引用类型:
引用类型 Object 是一种数据结构,引用类型 Object 的值(对象)是引用类型的实例。
任意对象都是 Object 类型。Object、Array、Function、RegExp、Date、特殊的基本包装类型(String、Number、Boolean)以及内置对象(Global、Math) 等都属于 Object 类型。
var obj = {}
var arr = []
var fn = function () {}
var reg = new RegExp()