javascript中常见的数据类型Boolean、String、Number、Object、Undefined
Undefined类型
数据类型:
6种简单数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol(es6新增)一种复杂数据类型:Object(对象)
typeof操作符
对一个值使用typeof操作符会返回下列
字符串之一
"undefined"表示值未定义"boolean"表示值为布尔值"string"表示值为字符串"number"表示值为数值"object"表示值为为对象(而不是函数)或null"function"表示值为函数"symbol"表示值为符号
- 但是
typeof null返回的是"object",这是因为特殊值null被认为是一个对空对象的引用。
- typeof 返回始终是:字符串
typeof typeof 1234 //'string' typeof 1234='number'
Undefined类型
Undefined类型只有一个值,就是特殊值undefined,当使用了var或let声明了变量但是没有初始化时,就相当于给变量赋予了undefined值
let message=undefined
console.log(message==undefined);//true
对未声明的变量,使用typeof的时候,返回结果也
"undefined"
因为未初始化的变量会被自动赋予undefined值
(没看懂……)
console.log(typeof age);//undefined
Null类型
Null类型同样只有一个值,即特殊值null。null值表示一个
空对象指针,这也是typeof(null)返回结果为"object"的原因
let car=null
console.log(typeof car)//"object"
在定义将来要保存对象值的变量时,建议用null来初始化,不适用其他值,这样,只
要检查这个变量的值是不是null就可以知道这个变量是否在后来被重新赋予了一个对象的引用。
if(car!=null){
//此时car是一个对象的引用
}
undefined值是由null值派生而来的,因此ECMA-262将它们定义为表面上相等,比如下面列子:
console.log(null == undefined)//true
null和undefined转换成Number类型又是不一样的啊 
Boolean类型
Boolean类型两个字面值:true和false。
不同类型与布尔值之间的转换规则:
| 数据类型 | 转换为true的值 | 转换为false |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | “” 空字符串 |
| Number | 非零数值 | 0 、NaN |
| Object | 任意对象 | null |
| Undefined | N/A(不存在) | undefined |
Number类型
number类型数据是:0 1 NaN 数值吗?其中0代表false,1代表true
浮点值的精确度最高可达17位小数,但在算术计算中远不如整数精确。列如0.1+0.2得到的不是0.3而是0.300 000 000 000 000 04
永远不要测试某个特定的浮点值
NaN:
它的意思不是数值(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。比如用
0除以任意数值在其他语言中通常都会导致错误,从而终止代码执行。
console.log(0/0) //NaN
console.log(-0/+0) //NaN
分子是非0值,分母是有符号0或无符号0,则会返回Infinity或-Infinity
console.log(5/0) //Infinity 正无穷
console.log(5/-0) //_Infinity 负无穷
NaN的有几个特殊的属性
- 任何涉及NaN的操作始终返回NaN(如NaN/10),在连续多步计算时可能是个问题。
console.log(NaN==NaN) //false
根据ECMAScript提供了isNaN() 函数,该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。把一个值传给isNaN()后,该函数会尝试把它转换为数值。某些非数值的值可以直接转换成数值,如字符串"10"或布尔值。
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN("10"));//false 可以转换为数值10
console.log(isNaN("blue")); //true 不可以转换为数值
console.log(isNaN(true));//false ,可以转换为数值1
isNaN()可以用来测试对象,原理是:对象会先调用对象valueof()方法,然后再确定返回的值是否可以转换为数值,如果不能,再调用toString()方法,并测试其返回值。
- 利用这一点可以区分
对象和Null,因为使用typeof二者返回结果都是"object"。
var obj={name:'哈哈'}
console.log(isNaN(obj),'是对象');//true
var isObj=null
console.log(isNaN(isObj),'不是对象');//false
数值转换:
•有三个函数可以将非数值转换为数值:Number() 、parseInt()、parseFloat()
Number()
- a. 布尔值,true转换为
1,false转换为0 - b. 数值,直接返回
- c. null,返回
0 - d. undefined返回NaN

- e. 字符串规则:
- 如果字符串包含
数值字符,则转换为一个十进制数值。比如Number('1')返回1,Number('011')返回11(忽略前面的0) - 如果字符串中含有
有效的浮点格式,则会转换为响应的浮点值(同样忽略前面的0) - 如果字符串包含有效的十六进制格式如
'0xf',则会转换为与该十六进制对应的十进制整数值。 - 如果是
空字符串,则返回0 - 如果字符串包含除以上述情况之外的其他字符,则返回
NaN。
- 如果字符串包含
- f. 对象
调用valueOf()方法,并按照上述规则转换返回的值,如果转换结果是NaN,则调用toString()方法,再按照转换字符串的规则转换。
let num1=Number('hello world') //NaN
let num2=Number('') //0
let num3=Number('00011')//11
let num4=Number(true)//1
parseInt()
parseInt()更专注于
字符串是否包含数值模式,字符串最前面的空格会被忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符,加号或减号,parseInt()立即返回NaN。这意味着空字符串也会返回NaN。
let num1=parseInt('1234bule')//1234
let num2=parseInt("")//NaN
let num3=parseInt('0xA')//10,解释为十六进制整数 0-8 A-F
let num4=parseInt(22.5) //22
let num5=parseInt('70')//70 解释为十进制
// parseInt的第二个参数用于指定进制数
let num = parseInt("0xAF", 16); // 175
parseFloat()
parseFloat()函数始终忽略字符串开头的零。第一次出现的小数点是有效的,但第二次出现的小数点就无效了,此时字符串的剩余字符都会被忽略。
let num1=parseFloat('1234blue')//1234
let num2=parseFloat('0xA') //0
let num3=parseFloat('22.5')//22.5
let num4=parseFloat('22.34.5')//22.34
let num5=parseFloat('0098.5')//98.5
String类型
字符串可以使用双引号,单引号,反引号表示。
转换为字符串,首先是使用几乎所有值都有的toString()方法,这个方法的唯一的用途就是返回当前值的字符等价物。null和undefined值没有tostring方法。
Symbol类型
符号是原始值,且符号实例是唯一、不可变的,符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。
- 符号的基本用法
符号本身是原始类型,所以typeof操作符对符号返回symbol
Symbol()函数不能用作构造函数,与new关键字一起使用,这样做是为了避免创建符号包装对象,像使用Boolean String Number那样它们都支持构造函数可用于初始化包含原始值的包装对象。
let sym=Symbol()
console.log(typeof(sym),'符号类型');//'symbol'
这个symbol真的是太繁琐了……不看了
Object类型
ECMAScript中的对象其实就是一组数据和功能的集合,对象通过new操作符后跟对象类型的名称来创建,开发者可以创建Object类型的实例来创建自己的对象,然后再给对象添加属性和方法。
let o =new Object();
每个Object实例都有如下的属性和方法
constructor:用于创建当前对象的函数,在前面的例子中,这个属性的值就是Object()函数。hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性,要检查的属性名必须是字符串。如o.hasOwnProperty('name')返回结果是Boolean类型isPrototypeof(object):用于判断当前对象是否为另一个对象的原型。propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用for-in语句枚举toLocaleString():返回对象的字符串表示,改字符串反映对象所在的本地化执行环境。toString():返回对象的字符串表示。valueOf():返回对象对应的字符串、数值或布尔值表示,通常与toString()的返回值相同。
最后:原始值和引用值
原始值是最简单的数据,引用值是由多个值构成的对象。- 保存原始值的变量时按值访问的,因此我们操作的就是存储在变量中的实际值,但是引用值是保存在内存中的对象,
JavaScript是不允许直接访问内存位置,因此也就不能直接操作对象中的属性。- 在操作对象的时候,实际上操作的是该
对象的引用而非实际的对象本身,为此保存引用值的变量时按引用访问的- 只有
引用值可以动态添加属性,原始值也是基本数据类型不可以添加。- 但是……对于原始值如果使用的是
new关键字,则JavaScript创建的其实是一个object类型的实例。当前类型使用typeof使用就是object类型的。
更多推荐

所有评论(0)