JavaScript 数据类型
JavaScript 中有五种可包含值的数据类型:
- 字符串(string)
- 数字(number)
- 布尔(boolean)
- Symbol(Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值)。
- 函数(function)
同时有两种不能包含值的数据类型:
- null
- undefined
有三种对象类型:
- 对象(Object)
- 日期(Date)
- 数组(Array)
如果一个变量是数据类型,那么在它被赋值之后,这个值就是不可变的。
JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型:
var x; // x 为 undefined
var x = 5; // 现在 x 为数字
var x = "John"; // 现在 x 为字符串
JavaScript 数值始终是 64 位的浮点数。与许多其他编程语言不同,JavaScript 不会定义不同类型的数,比如整数、短的、长的、浮点的等等。JavaScript 数值始终以双精度浮点数来存储。整数(不使用指数或科学计数法)会被精确到 15 位。小数的最大数是 17 位,但是浮点的算数并不总是 100% 精准:
var x = 999999999999999; // x 将是 999999999999999,15个数
var y = 9999999999999999; // y 将是 10000000000000000,17个数,由原来的16位进一位
var x = 0.2 + 0.1; // x 将是 0.30000000000000004
// 使用乘除法有助于解决上面的问题
var x = (0.2 * 10 + 0.1 * 10) / 10; // x 将是 0.3
1.JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示;
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
1.1 NaN的特点
- NaN和任何值进行操作都会返回NaN
- NaN与任何值都不相等,包括NaN本身
console.log(NaN === NaN) //返回false,始终坚持使用===来进行比较
1.2 isNaN()函数:
isNaN
意思是:是不是非数值
,是的话返回true
,所有能被该函数转换能Number
类型的值,都返回false
。- 在使用isNaN进行检测的时候,首先会验证检测的值是否为数字类型,如果不是,先基于Number()这个方法,把值转换成数字类型,然后再检测。
- 空字符串、空数组、布尔值、
null
会转成数值,所以isNaN
函数返回false
。 - 空对象、函数、
undefined
不能转换成数值,返回true
。
console.log( isNaN(NaN ) // true
console.log( isNaN(10 ) // false
console.log( isNaN('10') // false
console.log( isNaN('blue') // true
console.log(isNaN( true )) // false (true会被转换成1)
1.3 数值转换函数
Number()
parseInt()
取整parseFloat()
浮点数
1.3.1 Number()转换规则:
- 如果是布尔值,
true
和false
会被转换为1
和0
。 - 如果是数字,只是简单的传入和返回。
- 如果是
null
值,返回0
。 - 如果是
undefined
,返回NaN
。 - 如果是字符串:
- 字符串中只包含数字(包括前面带正/负号的情况),则将其转换为十进制数值,数字前面有
0
的会被忽略(不管前面有几个0
,全部忽略),例如"010"
会转换成10
。 - 字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值。
- 字符串中包含有效的十六进制格式(一般用数字
0
到9
和字母A
到F
(或a~f
)表示,其中:A~F
表示10~15
,这些称作十六进制数字),如"0xf",
将其转换成相同大小的十进制整数值。 - 字符串为空,转换成
0
。 - 字符串中包含除了以上格式之外的字符,则转换为NaN,如字符串中既有数字又有字母的情况。
- 如果对象,调用对象的valueOf(),空数组返回0,空对象返回NaN。
1.3.2 parseInt(string,radix)将一个字符串转换成x进制的整数。
- 第一个参数为字符串,如果参数不是字符串,则将其转换为字符串(使用
ToString
抽象操作)。字符串开头的空白符将会被忽略。如果是小数则会采取直接取整数部分结果。 - 第二个参数为整数,表示按照
xx
进制转换,如传入参数10
表示按十进制规则转换。 -
第一个参数从左到右依次查找有效数字字符,直到遇到非有效数字字符,停止查找(只能出现在开头,不管后面是否好友数字),把找到的当做数字返回。如果字符串中以
0x
开头且后跟数字字符,就会将其当做一个十六进制整数。如果字符串以"0"
开头且后跟数字字符,则会被当做一个八进制数来解析。 -
如果不传第二个参数,默认会按照八进制解析。在大多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的。
1.3.3 parseFloat(string)
解析一个参数(必要时先转换为字符串)并返回一个浮点数。默认解析十进制值。
- 从左到右依次解析字符,一直解析到字符串末尾,遇到非数字字符会或遇到第二个浮点数(在这之前的字符串都会被解析)会使解析停止,如
"3.14"
解析成3.14
,"3.14.1234"
解析成3.14
2.所有用单引号、双引号、反引号包起来的都是String字符串数据类型。
2.1把其他类型转换成字符串
- [val].toString()
2.2 字符串相关操作
- 字符串拼接两种方式
- length属性返回字符串的长度
var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sln = txt.length; // 返回26
- toUpperCase()方法将字符串转换为大写
-
toLowerCase()方法将字符串转换为小写
-
indexOf()
方法返回字符串中指定文本首次出现的索引(位置) - lastIndexOf()方法返回指定文本在字符串中最后一次出现的索引。如果没找到,都返回-1
var a = "The full name of China is the People's Republic of China.";
var pos = a.indexOf("China"); // 返回17
var poslt = a.lastindexOf("China"); //返回51
// 两种方法都接受作为检索起始位置的第二个参数
var pos = a.indexOf("China",18); // 返回51,从前往后
var poslt = a.lastIndexOf("China",50); // 返回17,从后向前
var noresult = a.indexOf('Cchina'); //返回-1,检索不存在
- slice()方法提取字符串的某个部分并在新字符串中返回被提取的部分。
// 该方法设置两个参数:起始索引(开始位置),终止索引(结束位置)。
var str = "Apple, Banana, Mango";
var res = str.slice(7,13); // 返回Banana
// 如果某个参数为负,则从字符串的结尾开始计数。
var str = "Apple, Banana, Mango";
var res = str.slice(-13,-7); // 返回Banana
// 如果省略第二个参数,则该方法将裁剪字符串的剩余部分。
var res = str.slice(7); // 返回Banana, Mango
// 从结尾计数到剩余部分。
var res = str.slice(-13); // 返回Banana, Mango
var res = a.substring(7,13); // 返回Banana
var res = a.substr(7,13); // 返回起始位置为7长度为13的子字符串Banana, Mango
substring()
方法 类似于 slice()。不同之处在于 substring() 无法接受负的索引。- substr() 类似于 slice()。不同之处在于第二个参数规定被提取部分的长度。如果省略第二个参数,则该 substr() 将裁剪字符串的剩余部分。
- replace()方法不会改变调用它的字符串。它返回的是新字符串。默认地,replace() 只替换首个匹配;默认地,replace() 对大小写敏感。
str = "Please visit Microsoft and Microsoft!";
var n = str.replace("Microsoft", "W3School"); // 结果为Please visit W3School and Microsoft!
var n = str.replace("MICROSOFT", "W3School"); // 结果为Please visit Microsoft and Microsoft!
/*使用正则表达式,来替换默认的设置,请注意正则表达式不带引号*/
var n = str.replace(/MICROSOFT/i, "W3School");
// 正则表达式 /i(大小写不敏感),结果为Please visit W3School and Microsoft!
var n = str.replace(/Microsoft/g, "W3School");
// 正则表达式的 g 标志(用于全局搜索)替换全部,结果为Please visit W3School and W3School!
- trim() 方法删除字符串两端的空白符
- 字符串元素访问比如str[3]
- 不适用 Internet Explorer 7 或更早的版本
- 它让字符串看起来像是数组(其实并不是)
- 如果找不到字符,[ ] 返回 undefined,而 charAt() 返回空字符串。
- 它是只读的。str[0] = "A" 不会产生错误(但也不会工作!)
var str = "HELLO WORLD"; str[0] = "A"; // 不产生错误,但不会工作 str[0]; // 返回 H,因为不能修改,是不可变数据类型
3.布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有true
、false
(小写)两种值,要么是true
,要么是false
,可以直接用true
、false
表示布尔值,也可以通过布尔运算计算出来。
逻辑运算符:&&(与),||(或),!(非)
JavaScript允许对任意数据类型做比较;JavaScript在设计时,相等运算符有两种比较运算符:
第一种是==
比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===
比较,它不会自动转换数据类型,如果数据类型不一致,返回false
,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用==
比较,始终坚持使用===
比较。
false == 0; // true 两个等号,先转换类型再比较
false === 0; // false 三个等号,类型不一致立刻返回,若一致再比较值
注意浮点数的相等比较:这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值。
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
4. null和undefined
null
表示一个“空”的值,它和0
以及空字符串''
不同,0
是一个数值,''
表示长度为0的字符串,而null
表示“空”。JavaScript的设计者希望用null
表示一个空的值,而undefined
表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null
。undefined
仅仅在判断函数参数是否传递的情况下有用。
5.对象
JavaScript的对象是一组由键-值组成的无序集合。JavaScript对象的键都是字符串类型,值可以是任意数据类型。每个键又称为对象的属性。要获取一个对象的属性,我们用对象变量.属性名
的方式。
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
person.name; // 'Bob'
person.zipcode; // null
6.数组
数组是一组按顺序排列的集合,集合的每个值称为元素。JavaScript的数组可以包括任意数据类型。数组用[]
表示,元素之间用,
分隔。出于代码的可读性考虑,强烈建议直接使用[]
。
// 两种创建数组的方法
a=[1, 2, 3.14, 'Hello', null, true];
a=new Array(1, 2, 3.14, 'Hello', null, true);