js数据类型

358 阅读4分钟

js数据类型分两种

1.基本数据类型

这些类型可以直接操作保存在变量中的实际值

基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问

NumberStringBooleanNullUndefinedSymbol(ES6)

- 1.Number数值类型

NaN  非数字类型,属于数值型基本数据类型
特点:  
1、设计任何的NaN操纵都会返回NaN  
`console.log('ab'/10);` // NaN  
2NaN不等于自身。  
`console.log(NaN == NaN);// false;`

判断是否是一个数字 isNaN (is not a number), 不是一个数字返回true,是数字返回false

    // var age = '23'
    // console.log(isNaN('23')) //false
    // console.log(isNaN(23)) //false
    // console.log(isNaN('lucy')) //true

数值类型的转换:
Number():可以用于任何的数据类型
parseInt:提取 整数数值
paseFloat:提取浮点数值

- 2.String字符串

特点:  
1、字符串的单引号和双引号作用效果一样  
2、字符串有`length`属性,可以取得字符串的长度  
3、字符串的值是不可变的,所以很多的字符串的`api`不会改变原字符串值
    // var str = '12dkfajfdajfadlaf;fad;f'
    // console.log(str.length)
字符串转换:  
`String()`:适用于任何的数据类型(null -> null undefined -> undefined)  
`toString()`:`null`和`undefined`没有这个功能  
`console.log(null.toString()); //error 报错`
字符串拼接:
    // console.log('今天是星期二' + true) //今天是星期二true
    // var age = 43
    // console.log('我的年龄是' + age + '岁') //我的年龄是43

- 3.Boolean 布尔类型

该类型只有两个值:truefalse

    // 布尔类型和数字相加  true 1  false 0
    // console.log(true + 3) //4
    // console.log(false + 3) //3
出现场景:  
(1)条件语句导致执行的隐士类转换  
(2)字面量或变量定义

- 4.Undefined

声明了变量但是没有初始化,默认为undefined,在if语句中默认转化为false,

    // 一个变量只声明不赋值,值为undefined 数据类型为undefined
    // var un
    // console.log(un, typeof un) //undefined 'undefined'
    // console.log(un + 1) //NaN
    // console.log(un + 'hello') //undefinedhello
    // var b = undefined
    // console.log(b + 1) //NaN
`undefined`:表示‘缺少值’,就是应该有一个值,但是没有定义,以下用法是典型的出现`undefined`情况
(1)变量被申明,等于`undefined`2)调用函数时,应该提供的参数没有提供,该参数等于`undefined`3)对象没有赋值的属性,该属性值为`undefined`4)函数没有返回值,默认返回`undefined`

- 5.Null

如果定了一个对象,初始化可以为null,因为null的基本类型是`Null`,在`if`语句中默认转化为`false`,在和数值计算默认为`0`  
出现场景:对象不存在

- 6.Symbol (ES6新增的基本数据类型 值唯一)

    var s1 = Symbol()
    var s2 = Symbol()
    var s3 = Symbol('hello')
    console.log(s1 === s2) //false
    console.log(s1 == s2) //false
    // 用来做对象的属性名
    var o = {}
    o.name = '张三'
    o['name'] = '李四'
    console.log(o.name)  //李四
    var cc = 'hello'
    var oo = {
      name: 'lucy',
      12: { name: 1234 },
      true: 0,
      [cc]: 'world',
      [function () {}]: 0,
      [s1]: 78,
      [s2]: 12,
    }
    console.log(oo)

Symbol属性类型不支持for...inObject.keys()

2.引用数据类型

引用数据类型也叫对象数据类型,包括function,object,array,date,RegExp等可以可以使用new创建的数据,又叫对象类型,他们是存放在内存中的数据

-   引用类型的值可以改变
-   引用数据类型可以添加属性和方法
-   引用数据类型的赋值是对象引用
-   引用类型的比较是引用的比较
-   引用类型是同时保存在栈区中和堆区中的,引用类型的存储需要在内存的栈区和堆区中共同完成,栈区保存变量标识符和指向堆内存的地址

3.基本数据类型和引用数据类型的区别

1、声明变量时内存分配不同

原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,这样便于迅速查询变量的值
引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址。

2、不同的内存分配带来不同的访问机制

在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存
中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的**按引用访问**。而原始类型的值则是可以直
接访问到的。

3、参数传递的不同(把实参复制给形参的过程

首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。

但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。

1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。

2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!

因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。