数据类型
一些基础题中经常遇到,做个总结笔记,对各类型的instanceof,typeof,valueOf(),tostring()区别用法。
5种简单数据类型:Undefined, Null, Boolean, Number, String 1种复杂数据类型:Object本质上由一组无序的键值对组成 不支持创建任何自定义类型的机制 -typeof操作符
var message = "some string";
alert(typeof message); // "string" typeof是一个操作符,不是一个函数
alert(typeof(message)); // "string" 圆括号可以使用但不是不必须的,
alert(typeof 95); // "number"
function test() {}
alert(typeof test) // 'function
从技术角度上讲函数在es中是对象,不是一种数据类型但函数确实有一些特殊属性,因此通过typeof操作符来区分函数和其他对象是有必要的
1.undefined
var message;
alert(message == undefined); // true
var message = undefined;
alert(message == undefined); // true
以上这两个例子是等价的
var message;
// 下面这个变量没有被声明
// var age
alert(message) // undefined
alert(age) // 产生错误
alert(typeof message) // undefined
alert(typeof age) // undefined
从上边的例子来看,显示的声明变量还是有必要的,当typeof返回undefined时我们可以知道被检测的变量还没有被声明,而不是尚未初始化 但是无论什么情况下都没必要将变量赋值为undefined
2. null类型
null类型表示空指针,但是如果用typeof操作符则返回object
var car = null;
alert(typeof car) // object
所以一个变量将来要存放对象,初始化最好为null 另外undefined值派生自null,所以alert(null == undefined)// true
3.Boolean
各类型中与boolean对应的值,对控制语句(if)非常重要
| 数据类型 | 对应true | 对应false |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | “”空串 |
| Number | 任何非0值 | 0和NaN |
| Object | 任何对象 | null |
| Undefined | n/a(not applicable) | udefined |
not applicable 不适用
4.Number
可以保存+0和-0,但是被认为是相等的
- 浮点数
var floatNum = .1; // 有效但不推荐
var floatNum1 = 3.12e7; // 科学计数法等于31200000
浮点数最高精度为17位小数 精度问题 浮点数精度远不如整数,如0.1+0.2=0.30000000000000004而不是0.3,如果是0.005+0.25或0.15+0.15都不会有问题,所以永远不要测试某个特定浮点的数值,例如:
if (a+b==0.3) {}
这是使用基于IEEE754数值的浮点计算的通病,其他使用相同数值格式的语言也存在这个问题,可用如下解决方式:
var num1 = 0.1;
var num2 = 0.2;
alert((num1+num2).toFixed(2) === 0.30)
// toFixed() 表示四舍五入保留几位小数,默认参数为0
- 范围 最小存在Number.MIN_VALUE中,为5e-324 最大存在Number.MAX_VALUE中,为1.7976931348623157e+308 如果某次计算结果超出范围,将会转换成Infinity(无穷),负值转换为-Infinity正值转换为Infinity(正无穷),可以用isFinite()函数确定一个数是不是在范围内
var result = Number.MAX_VALUE + Number.MIN_VALUE;
alert(isFinite(result)); // false 即超出范围
在执行极大或极小值时,检测监控这些值是可能的、也是必需的。
- NaN 即Not a Number当一个要返回数值的操作出现错误是返回NaN,这样就不会抛出错误了,比如一个数除以0,在其他语言中会报错,但在代码实操中,只有0/0才会NaN,其他返回+Infinity或-Infinity。
alert(NaN == NaN); // NaN与任何值都不相等
isNaN()
isNaN(NaN); // true
isNaN(10); // false
isNaN('10'); // false 可以被转换成10
isNaN("blue") // true 不能转换成值
isNaN(true); // false 可以被转换成1
- 类型转换 Number() parseInt() parseFloat()
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11 忽略前导的0
var num4 = Number(true); //1
var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)
5.String类型
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以由双 引号(")或单引号(')表示,左右符号只有一致就可以
- 字面量 特殊字面量转义
| 字面量 | 含义 |
|---|---|
| \n | 换行 |
| \t | 制表 |
| \b | 空格 |
| \r | 回车 |
| \f | 进纸 |
| \ | 斜杠 |
| ' | 单引号(转义才能显示) |
| " | 双引号 |
| \xnn | 以16进制代码nn表示的一个字符(n为0-F) |
| \unnnn | 以16进制代码nnnn表示一个Unicode字符(n为0-F) |
- 字符串特点 es中字符串是不可变的,一旦创建就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。例:
var lang = "Java";
lang = lang + "Script";
赋值过程:首先要创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后一步是销毁原来的字符串“Java”和“Script”,因为这两个字符串已经没用了。
- 转换为字符串 除了null与undefined其他值都有一个toString()方法,返回相应的字符串表现的副本。一般都不用传参,但数值的toString()可以传一个基数2/8/10/16来表示进制,默认是10进制 另一种方法是String()函数,如果有toString()方法,调用该方法,如果值是null返回null,是undefined返回undefined。
与“”空串相加也可获取string类型
6.object类型
与java语法类似,但是无参数可以省略圆括号,但不推荐
var o = new Object; // 有效不推荐
Object类型是所有实例基础,它所具有的任何属性和方法也同样存在于更具体的对象中
- constructor:用于创建对象的函数,上边的例子中就Object()
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是实例的原型中)是否存在,其中参数的属性名必须是字符串。例:hasOwnProperty('name').
- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,参数与hasOwnProperty()一样。
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示
- valueOf():返回对象的字符串、数值、或布尔值。通常与toString()方法返回值相同。 从技术角度讲,不适用于所有对象,比如BOM和DOM对象,它们是宿主对象,由宿主提供和定义,因此可能不会集成Object