数据类型
ECMAScript目前有7中数据类型,Undefined, Null, Number, String, Boolean, Object, Symbol
- typeof 操作符
typeof操作符可以鉴定变量的数据类型。如下 :
var testUndefined
var testNull = null
var testNumber = 123
var testString = 'hello,world'
var testBoolean = true
var testObject = {}
var testArray = []
var testSymbol = Symbol(1)
console.log(typeof testUndefined) // 结果: undefined
console.log(typeof testNull) // 结果:object
console.log(typeof testNumber) // 结果:number
console.log(typeof testString) // 结果:string
console.log(typeof testBoolean) // 结果:boolean
console.log(typeof testObject) // 结果:object
console.log(typeof testArray) // 结果:object
console.log(typeof testSymbol) // 结果:symbol
可以看到Null, Array通过typeof操作符来判断返回的都是object,通过Object.prototype.toString.call(变量)来进行精确的判断。如下:
console.log(Object.prototype.toString.call(testNull)) // 结果: [object Null]
console.log(Object.prototype.toString.call(testArray)) // 结果:[object Array]
- Undefined 类型
声明未初始化的变量的默认值为undefined - Null 类型
从逻辑角度来看, null 值表示一个空对象指针,可以用来初始化一个对象。 -
Boolean 类型
布尔类型,之后两个:true或者false.一般多用于条件控制语句。其他类型都可以转化为Boolean。规则如下:
- Number 类型
(1) ECMAScript中的数值类型采用IEEE754格式来表示。整数的类型,有十进制,八进制,十六进制。默认为十进制,在数值计算和赋值的时候都会转化为十进制的结果。如下:
var num10 = 100
var num8 = 070
var num16 = 0xA
console.log(num10) // 100
console.log(num8) // 56
console.log(num16) // 10
需要注意的是,严格模式下,八进制会报错。Uncaught SyntaxError: Octal literals are not allowed in strict mode.
(2) 采用IEEE754格式的浮点数计算有个通病,那就是小数位有计算精度。产生这个结果的原因是因为小数在计算机计算过程中以下几个步骤:
1 转化为二进制
2 采用科学技术法
3 表示成 IEEE 754 形式
在1和3的过程中都会发生精度丢失的问题。如十进制的0.7可以准确的表示一个小数,但是转换为二进制却是一个循环的小数。所以才会导致精度丢失的问题。
解决办法很多,介绍其中一种:可以通过toPrecision来指定小数位。例子如下:
// 浮点数计算精度问题
let num = 0.2 + 0.4
console.log('num: ', num) // num: 0.6000000000000001
let toPrecision = num.toPrecision(1)
console.log('toPrecision: ', toPrecision) // toPrecision: 0.6
(3) 数值范围
ECMAScript不可能保存所有范围内的数值。他的最大值和最小值保存在Number中的两个属性中。如下:
console.log(Number.MIN_VALUE) // 5e-324
console.log(Number.MAX_VALUE) // 1.7976931348623157e+308
(4) NaN
代表非数值。可以通过isNaN来判断一个数值是否是非数值。如下:
console.log(isNaN(num10)) // false
console.log(isNaN('hello')) // true
(5) 数值转换
数值转换有3个方法:Number(), parseInt(), parseFloat()
Number()
直接看例子:
console.log(Number(true)) // 1
console.log(Number(false)) // 0
console.log(Number('123')) // 123
console.log(Number('123hello123')) // NaN
console.log(Number({a: 1})) // NaN
console.log(Number(undefined)) // NaN
console.log(Number(null)) //0
parseInt()
转为整数,parseInt的第二个参数可以指定转换时的基数(进制),如果不指定的话,第一个参数以0开头,有可能会指定基数为8。例子如下:
console.log(parseInt(070)) // 56 基数为8
console.log(parseInt('010', 10)) // 10
console.log(parseInt('123hello', 10)) // 123
console.log(parseInt('0x')) // NaN
console.log(parseInt('0xA')) // 10 基数为16
parseFloat()
转为浮点数,只会解析十进制。16进制会解析为0,因为以0开头。如果有多个小数点的话,只会取第一个小数位的有效位数。如下:
console.log(parseFloat('123.456.78')) // 123.456
console.log(parseFloat('0xA')) // 0
console.log(parseFloat('22.5')) // 22.5
console.log(parseFloat('1.23e2')) // 123
- String 类型
由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。由单引号或者双引号包起来。 - Object 类型
Object是一组数据和功能的集合。由于在 ECMAScript 中 Object 是所有对象的基础,因此所有对象都具有这些基本的属性和方法。创建方式可以通过字面量或者构造函数,如下:
var obj1 = {} //字面量
var obj2 = new Object() //构造函数
Object的实例属性和方法,如下:
(1) constructor
构造函数
(2) hasOwnProperty(propertyName)
用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。有点绕口。直接看例子:
var obj = {
name: 'hello, world',
say: function () {
console.log('saying...')
}
}
obj.prototype = {
getName: function () {
console.log(this.name)
}
}
// 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。
console.log(obj.hasOwnProperty('toString')) // false
console.log(obj.hasOwnProperty('getName')) // false
console.log(obj.hasOwnProperty('say')) // true
(3) isPrototypeOf()
测试一个对象是挂载与另一个对象的原型链上。如下:
// 方法用于测试一个对象是否存在于另一个对象的原型链上。 Fee > Fi > Fo > Fum
function Fee() {
// . . .
}
function Fi() {
// . . .
}
Fi.prototype = new Fee();
function Fo() {
// . . .
}
Fo.prototype = new Fi();
function Fum() {
// . . .
}
Fum.prototype = new Fo();
var fum = new Fum();
console.log(Fi.prototype.isPrototypeOf(fum)) // true
(4) toString()
返回对象的字符串表示
(5) valueOf()
作用和toString()类似
引用
javascript高级程序设计第三版
浮点数问题
代码之谜 浮点数
isPrototypeOf()