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)