关于JavaScript中七种数据类型的详细介绍,包括6种原始数据类型(简单数据类型)和一种复杂数据类型
6种简单数据类型
undefined类型
undefined类型只有一个值,就是特殊值undefined
let str
console.log(str) //undefined
console.log(str===undefined) //true
console.log(typeof str) //undefined
当我们声明一个变量并没有对其初始化赋值时,这个变量保存的值就是undefined值。
let str
console.log(str) //undefined
console.log(age) //报错! 未定义
注意:定义但没有初始化和本身就没有定义是不一样的
Null类型
Null类型只有一个值,就是特殊值null
let person = null
console.log(person) //null
在定义一个保存对象的变量时可以用null值来初始化
let person = null
console.log(typeof person) //object
null值表示一个空对象指针,所以在用typeof操作符时返回值为object
let person //person的值为undefined
console.log(person==null) //true
console.log(person===null) //false
undefined值是由null值派生而来的,所以第二行会打印出true
Boolean类型
布尔类型有两个字面值,true和false
let b1=true
let b2=false
console.log(b1,b2) //true,false
let str= 'hello'
if(str){
console.log(str) //hello
}
在流程控制语句中其他类型的值会被执行Boolean()转型函数来转换成布尔值,具体原则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | “ ” (空字符串) |
Number | 非零数值(包括无穷值) | 0、NaN |
Object | 任意对象 | null |
Undefined | N/A (不存在) | undefined |
Number类型
Number类型可以用来表示整数和浮点数
- 整数
整数包括八进制,十六进制,最常用的还是十进制整数。
- 浮点数
浮点数中必须包含小数点并且小数点后面必须有数字,不然就会被转换成整数,浮点数在内存中使用的内存空间是整数的两倍。
- 特殊值NaN
NaN的意思是“不是数值”,表示本来要返回数值的但是操作失败了,如下:
console.log(5/0) //NaN
console.log(NaN/5) //NaN 有关NaN的任何操作返回结果都是NaN
console.log(NaN===NaN) //false NaN不等于任何值,包括他自己
String类型
String数据类型表示0或多个16位Unicode字符序列
let str1= "hello"
let str2= 'my'
let str3=`friend`
console.log(str1,str2,str3) //hello,my,friend
在定义字符串时可以使用双引号,单引号,反引号,都是合法的
- 字符串是不可改变的
字符串一旦创建,值就不能改变。如果要我们要想修改某个变量中的字符串就必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量
let str1="hello"
str1+=",world"
console.log(str1) //hello,world 原字符串“hello”会被销毁,打印的是str中保存新的字符串“hello,world”
第一行str1被定义为“hello”字符串,但是在执行第二行时后台会给str1分配一个可以容纳11个字符的空间,str1由“hello”和“,world"拼接而成一个新的字符串,原本的两个字符串"hello"和",world"会被销毁,所以说字符串是不可变的
- toString()方法
作用:返回当前值的字符串等价物(用于数值、布尔值、对象、字符串)
let name="kobe"
console.log(name.toString()) //字符串“kobe”
let flag=true
console.log(flag.toString()) //字符串“true”
let num=10
console.log(num.toString()) //字符串“10”
console.log(num.toString(2)) //字符串“1010”
console.log(num.toString(8))) //字符串“12”
对于数值调用该方法时可以填入参数,不填参数默认返回的字符串表示的是十进制数值,填参数会反对对应进制数值的字符串表示
- 模板字符串
let str=`first line
third line`
console.log(str) //first line
//
// thirst line
相对于单引号和双引号不同的是模板字符串是可以保留换行符和空格的
- 向字符串中插值
let num=1
console.log('num的值为1'+num) //num的值为1
let age=20
console.log(`我今年${++age}岁`) //我今年21岁
也可以通过模板字符串采用上面这种写法去向字符串中插值,插入的值都会使用toString()方法转为字符串
Symbol类型
symbol是ES6新增的一个原始数据类型,可以看这里
1种复杂数据类型
Object类型
对象是一组数据和功能的集合,Object(祖宗类)是派生其他对象的基类,Object类型的所有属性和方法在派生对象上同样存在
const person = new Object()
可以通过Object类型来“new出”一个实例对象(不推荐)
const Person={
name:'kobe',
salary:'30k',
say(){
console.log('hello')
}
}
这个Person对象是一个包含了姓名,薪水,和say方法的集合
console.log(person)
打印结果:
{name: "kobe", salary: "30k", say: ƒ}
name: "kobe"
salary: "30k"
say: ƒ say()
[[Prototype]]: Object
constructor: ƒ Object()
hasOwnProperty: ƒ hasOwnProperty()
isPrototypeOf: ƒ isPrototypeOf()
propertyIsEnumerable: ƒ propertyIsEnumerable()
toLocaleString: ƒ toLocaleString()
toString: ƒ toString()
valueOf: ƒ valueOf()
__defineGetter__: ƒ __defineGetter__()
__defineSetter__: ƒ __defineSetter__()
__lookupGetter__: ƒ __lookupGetter__()
__lookupSetter__: ƒ __lookupSetter__()
get __proto__: ƒ __proto__()
set __proto__: ƒ __proto__()
每个对象实例都会有来自Object的方法和属性(通过原型链)
- constructor属性
属性值为Object()函数,用于创建当前对象的函数
- hasOwnProperty(peropertyname)
用于判断当前对象本身是否具有该属性(不会通过原型链去查找),属性名是字符串
console.log(person.hasOwnProperty('name')) //true
- isPrototypeOf(object)
用于判断当前对象是否在参数对象的原型链上
const p = {
msg: 'hello'
}
person.__proto__ = p
console.log(p.isPrototypeOf(person)) //true
- propertyIsEnumerable(propertyName)
用于判断给定属性是否可以通过for-in来枚举 ,参数同样是字符串
const num = {
arr: [1, 2, 3, 4, 5]
}
console.log(num.propertyIsEnumerable('arr')) //true
- toLocaleString( )
返回对象的字符串表示,该字符串反映对象所在的本地化执行环境
- toString( )
返回对象的字符串表示
- valueOf( )
返回对象对应的字符串、数值或布尔值表示