数据类型:

  1. 6种简单数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol(es6新增)
  2. 一种复杂数据类型: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的有几个特殊的属性

  1. 任何涉及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. 字符串规则:
    1. 如果字符串包含数值字符,则转换为一个十进制数值。比如Number('1')返回1,Number('011')返回11(忽略前面的0
    2. 如果字符串中含有有效的浮点格式,则会转换为响应的浮点值(同样忽略前面的0
    3. 如果字符串包含有效的十六进制格式如'0xf',则会转换为与该十六进制对应的十进制整数值。
    4. 如果是空字符串,则返回0
    5. 如果字符串包含除以上述情况之外的其他字符,则返回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()的返回值相同。

最后:
原始值引用值

  1. 原始值是最简单的数据,引用值是由多个值构成的对象。
  2. 保存原始值的变量时按值访问的,因此我们操作的就是存储在变量中的实际值,但是引用值是保存在内存中的对象,JavaScript是不允许直接访问内存位置,因此也就不能直接操作对象中的属性。
  3. 在操作对象的时候,实际上操作的是该对象的引用而非实际的对象本身,为此保存引用值的变量时按引用访问的
  4. 只有引用值可以动态添加属性,原始值也是基本数据类型不可以添加。
  5. 但是……对于原始值如果使用的是new关键字,则JavaScript创建的其实是一个object类型的实例。当前类型使用typeof使用就是object类型的。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐