数据之间的转换
转字符串
数值类型有toString() 方法,可以把number类型之间转字符串(null和undefined类型没有toString())
// 1. 数值类型的toString()
var num = 10
var num1 = num.toString();
console.log(typeof num,typeof num1)
// 2. 直接 + "",其他数据类型加字符串类型,就隐式转换(自动转换)为字符串
var num2 = num + ""
console.log(typeof num2, num2)
var num3 = null + ""
console.log(typeof num3, num3)
var num4 = undefined + ""
console.log(typeof num4, num4)
//3. String() 把任意数据类型转为字符串
var a1 = String(10)
console.log(typeof a1, a1)
var a2 = String(null)
console.log(typeof a2, a2)
var a3 = String(undefined)
console.log(typeof a3, a3)
var a4 = String(true)
console.log(typeof a4, a4)
转数字类型
//1. + 数值运算符号把其他类型转数字类型,不能转数字类型的则是NaN
a1 = +"1"
a2 = +"a"
a3 = +true // true 转为数字1
a4 = +false // false 转为0
a5 = +null // 转为0
a6 = +undefined // 转为NaN
console.log(typeof a5, a5)
//2. Number() 该方法可以把其他任意数据类型转为number类型,true--1,false--0,null--0,undefined--
NaN
a7 = Number(undefined)
console.log(typeof a7,a7)
//3. parseInt() 把数字转为整数,有小数会去掉小数,不能转为数字的都是转为(包括
boolean,null,undefined)NaN
a8 = parseInt(null)
console.log(typeof a8,a8)
//4. parseFloat() 将有小数的字符串转为保留小数的数字类型。不能转为数字的都是转为(包括
boolean,null,undefined)NaN
a8 = parseFloat("4.5555666")
console.log(typeof a8,a8)
//5. *乘法, / 除法,-减法或自动转为number计算,如果不能转为number计算结果就是NaN
a9 = 10 * "4"
console.log(a9)
转boolean类型
a1 = Boolean(1) // 非0的数字转为true
a2 = Boolean(0) // 0会转为false
a3 = Boolean("a") // 非空字符串转为true
a4 = Boolean("") // 空字符串转为false
a5 = Boolean(null) // 转为false
a6 = Boolean(undefined) // 转为false
console.log(a6)
// 在if条件语句里面,其他数据类型会自动转为boolean类型,同Boolean()一致。
if(0){
console.log("ok")
}
引用数据类型
js的数据类型可以分为三大类:
1. 原始数据类型: 数值类型number,字符串类型string,boolean类型,存放在栈内存
2. 特殊数据类型: null,undefined,存放在栈内存
3. 引用数据类型: 对象数据类型object,array 数组,function 函数。存放在堆内存里面
// 对于引用数据类型,直接赋值是一种浅拷贝,只拷贝了内存地址。堆内存的数据变化以后,其他引用该内存地址的数据也
会发生变化。
var p2 = p1;
console.log(p1 === p2) // 应用数据类型比较的是内存地址。
console.log(p1 === { // 创建一个引用数据类型则会自动在堆内存里面创建内存空间存储
name: "p1",
age: 12
})
//p2修改name只是修改了对应对象的属性name,并没有修改内存地址,所以p1和p2还是指向的同一个内存地址。
p2.name = "p2"
console.log(p1 === p2);
// 由于p2浅拷贝了p1的内存地址,p2值变化的时候,p1对于的对象也会跟着变化。
console.log(p1)
// 如果不想要浅拷贝(拷贝内存地址)。创建一个新的内存地址,然后拷贝对象的属性和值(深拷贝)
var p3 = {} // 在堆内存里面开辟新的内存地址存放对象
for(var a in p1){ // 变量p1的属性
//把p1的属性和属性值赋值给p3
p3[a] = p1[a]
}
console.log(p3 === p1)
p3.name = "p3"
console.log(p1)
对象数据类型 object
一种数据结构,由属性和方法构成
,
一类属性和方法的集合
(
一类数据的集合,可以表示很多数据
)
。用
{}
创建一个对象,对象由很多的属性和属性值组成(
也叫可以
key:value
的结构
),key
也叫对象的键。也叫键值对
,
键值对之间用
,(
逗号分割)
{键 (key): 值 ( 任意数据类型 ),键 (key): 值 (value),....}
- 创建对象
// 用{} 创建一个对象,对象由很多的属性和属性值组成。 // 比如描述人的信息,只能用对象描述 // 对象的键(key)是字符串类型,一般省略了双引号,对象会自动把键转为字符串类型 var per = { name: "张三", age: 14, "addr": "xxx号" } console.log(typeof per)
- 读取对象
// 读取对象 对象变量.键 读取指定的值 console.log(per.name) // 读取per对象的name属性对应的值 console.log(per.age) // 读取对象 对象变量[键] 读取指定的值,[]里面可以是字符串或者变量 console.log(per["name"]) // []里面的字符串需要加"" var key = "name" console.log(per[key]) // []里面可以给变量
- 修改对象的值
per.name = "李四" per["age"] = 55
- 删除对象
delete per.addr delete per["name"]
- 对象的属性值可以是任意数据类型,所以对象数据可以嵌套对象数据等
var animal={ name: "猫", age: 2, peo: { name: "张三", age: 30 } }
- with 语句可以操作对象的多个属性
提供一些便捷性,性能没有直接用 . 属性修改好,存在一定的安全隐患 ( 实际项目中少用 )
with(peo){ name='li' // 修改peo对象的name属性 age=11 }
- key in object 可以查看对象是否存在某个属性
存在返回 true, 不存在返回 false
console.log("name1" in peo )
- 遍历对象的属性 for..in
for(var x in object) 可以遍历对象的所有属性
for(var item in peo){
// item是属性,peo[item] 属性值
console.log(item,peo[item])
}