js数据类型分两种
1.基本数据类型
这些类型可以直接操作保存在变量中的实际值
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问
Number、String、Boolean、Null、Undefined、Symbol(ES6)
- 1.Number数值类型
NaN 非数字类型,属于数值型基本数据类型
特点:
1、设计任何的NaN操纵都会返回NaN
`console.log('ab'/10);` // NaN
2、 NaN不等于自身。
`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 布尔类型
该类型只有两个值:true、false
// 布尔类型和数字相加 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...in和Object.keys()
2.引用数据类型
引用数据类型也叫对象数据类型,包括function,object,array,date,RegExp等可以可以使用new创建的数据,又叫对象类型,他们是存放在堆内存中的数据
- 引用类型的值可以改变
- 引用数据类型可以添加属性和方法
- 引用数据类型的赋值是对象引用
- 引用类型的比较是引用的比较
- 引用类型是同时保存在栈区中和堆区中的,引用类型的存储需要在内存的栈区和堆区中共同完成,栈区保存变量标识符和指向堆内存的地址
3.基本数据类型和引用数据类型的区别
1、声明变量时内存分配不同
原始类型:在栈中,因为占据空间是固定的,可以将他们存在较小的内存中-栈中,这样便于迅速查询变量的值
引用类型:存在堆中,栈中存储的变量,只是用来查找堆中的引用地址。
2、不同的内存分配带来不同的访问机制
在javascript中是不允许直接访问保存在堆内存中的对象的,所以在访问一个对象时,首先得到的是这个对象在堆内存
中的地址,然后再按照这个地址去获得这个对象中的值,这就是传说中的**按引用访问**。而原始类型的值则是可以直
接访问到的。
3、参数传递的不同(把实参复制给形参的过程)
首先我们应该明确一点:ECMAScript中所有函数的参数都是按值来传递的。
但是为什么涉及到原始类型与引用类型的值时仍然有区别呢?还不就是因为内存分配时的差别。
1)原始值:只是把变量里的值传递给参数,之后参数和这个变量互不影响。
2)引用值:对象变量它里面的值是这个对象在堆内存中的内存地址,这一点你要时刻铭记在心!
因此它传递的值也就是这个内存地址,这也就是为什么函数内部对这个参数的修改会体现在外部的原因了,因为它们都指向同一个对象。