1.变量的存储。
概念:计算机内存中的一块存储空间,是存储数据的基本单元。
程序执行从硬盘加载到内存中,再发送给CPU进行执行。
java中的变量:
变量三要素:数据类型,变量名,值
如:int money = 100;//定义一个整型变量,变量名money,值100
因为整型是32位的,所以会在内存中先开辟出一个32位的空间,同时生成一个16进制的地址映射到变量money上,100存入这个空间中,通过地址取到对应值100.
因此变量的类型决定了空间大小。
javaScript中的变量:
let name='李四'
内存中有专门区域存储变量,存储时从大的区域开辟出小区域进行存储。开辟出来的区域大小固定,但是数据不是确定的,数据超出内存会照成内存溢出。
javaScript不同于java根据数据类型事先留好空间大小。所以JavaScript开辟出新的内存空间,首先内存会找有没有重复数据,如果没有重复数据便开辟出一个新的空间,其他变量赋值相同,直接赋值内存地址,这样节省内存空间。由于变量和值处于两个内存空间,变量里存的是值的内存地址,通过内存地址找到值。变量并不直接存储任何值,存储内存地址。
let a = 10
内存中创建两个空间一个变量名存储指向10的地址。一个空间存储10
a=12
当a赋值12 ,先在内存寻找有没有重复的数据,没有开辟一个新的空间存放12,同时a的地址指向变成12的空间地址,但是10的空间还在。所以原始值属于不可变类型,一旦创建就无法修改。
2.数据类型
1.对象(可变类型):
对象是一个复合数据类型,相当于一个容器,存储各种类型数据。
创建对象也是开辟一个空间,变量存储值也是指向属性值的地址,属性值开辟的空间也是指向值得地址,值也在另一个内存空间。所以可变区域在属性值区域,是可以添加其他属性的。
需要注意的是,两个变量指向同一个对象,当一个变量修改对象时,另外一个变量也会受到影响。两个对象进行相等或全等比较时,比较是对象内存地址,为false。
let boj=Object()
let boj1=Object()
boj1和boj不相等,创建的地址不一样
let boj2=boj 相等,地址进行赋值,true
创建一个对象{}
let obj = new Object()
let obj = Object()
let obj={}
属性名要求:可以是任意值,特殊属性名,需要[]进行设置,否者报错。
如:obj["sdf213@#!@#we!!!!ads1113"]
使用symbol符号作为属性名,添加属性。获取及修改都需要使用symbol,通常希望不被外界访问。
let mySymbol= Symbol()
obj[mySymbol]="不被访问"
console.log(obj[mySymbol]) //不被访问
对象添加属性,对象.属性名=属性值,如:
obj.name="李四"
//删除属性
delete obj.name
//取出值
obj.name
obj["name"] //[]中可以传变量
注:没有对应属性返回undefined,不会报错。
//检查对象中是否存在某个属性
”name“ in obj 有返回true,没有返回false
简化例子:
let mySymbol= Symbol()
let obj={
name:'李四',
["age"]:18,
[mySymbol]:"不被访问",
arr:{
number:12
}
}
枚举:将对象中所有属性全部获取。
//循环输出,每次执行会将一个属性名赋值给prop自定义变量。并不是所有属性都可以枚举。如使用符号Symbol,因为符号是不希望被外界进行操作的。
for( let prop in 对象){
console.log(prop)
对象[prop] //获取属性值
}
2.数值Number
包括整数和浮点数,但数值不是无限大,当数值超过一定范围就会显示近似值,不能精确显示后面数值,再大就会变成科学计数法,直到变成Infinity无穷。
小数运算时有时会不精确的,需要进行注意。
3.大整数(BigInt)
表示一些比较大的整数,需要n结尾,根据内存大小范围。打印出来后面会带n,所以大整数只能和大整数进行计算。number不能和BigInt进行计算。
let number= 99999999999999999999999999999n
4.字符串string
使用单引号或双引号来表示字符串。
转义字符
let a='我"爱吃"肉'
let a = "我爱吃\"肉"
\"得到”
\'得到’
\\得到\
\n得到换行
如:
let a="单纯的
换行
"
会报错。
加入\,就是单纯的进行换行,没有结构上的换行。但不是所有浏览器都支持,所以一般使用模板字符串反单引号``
let a="单纯的\
换行
"
模板字符串还可以嵌入变量
let week="三"
let a=`今天星期${week}`
5.布尔值(boolean)
true和false,主要用来进行逻辑判断。
6.空值null
空值表示一个空对象,空值只有一个null,使用typeof 返回object类型。
7.未定义undefined
当声明一个变量没有赋值时,返回值就是undefined.
8.符号Symbol
创建一个唯一标识
let s = Symbol()
3.类型转换
强制或显示类型转换
1.转为字符串,toString()方法
let a=10
a.toString这个过程是将a指向的值进行复制变成字符串,生成新的空间。
let b = a.toString
String()函数将其他类型转换成字符串
let a =10
a=String(a)
区别就是toString不允许null 和undefined.而Strong可以允许。
2.转为数值
使用Number()
let a = "1"
a = Number(a)
当字符串不是合法数字转化为NaN 不是一个数字
let a = “ab”
a = Number(a) //NaN
let a = ""空或者 let a = " " 空格
a = Number(a) //返回0
a=true 转化1
a=false 转化0
a=null 转化0
a=undefined 转化NaN
专门将字符串转化成数值
parseInt() 将一个字符串转化成一个整数
parseFloat()将一个字符串转化成一个浮点数
区别就是 123px,不是一个合法数值,但是parseInt()可以转为123
因为解析时,会从左往右读取字符串中所有有效数字,将有效的数字输出。
读取小数点也是,如123.12得到123,也用于取整,但是会转化成字符串,在取整。
2.Boolean 布尔值
let a = 1
a= Boolean(a) true
0和NaN,空字符串 转化为false,其余都是true,空格字符串为true
null和undefined 转化为false.
对象转化为true
总结所有表示空性的没有错误的值都会转化为false
0和NaN,空字符串,null,undefined,false
4.??空赋值
只有变量值为null或nudefined 时才会赋值,有值才不会赋值。
如:
let a =null
a??=1
a为1
let a =1
a??=2
a为1
5.一元正负
对非数字类型进行正负运算时,先将其转化为数值类型在运算
let a = -10 负数
let b = '11'
b=+b //转化为正数 11数值类型
6.自增自减
原变量值会进行改变。
let a=1
let b=a++ //1 旧值,自增前的值
a++ 返回结果
a-- 返回结果
返回值不同
let a=1
let b=++a //2 是自增后的值,就是新值
--a
++a
如:
let a=1
let b = a++ + ++a + a //1+3+3= 7
7.逻辑运算符
!逻辑非 进行取反操作,非布尔值进行取反先进行转化为布尔值再取反,可以用于将其他类型转化为布尔值两次取反!!进行转化
let a =true
let b=!a //false
&&逻辑与 对两个值进行与运算,左右都为true 返回true,否则返回false。短路的与,第一是false,则不看第二个值。与运算找false,找到false直接返回,没有找到才返回true。非布尔值进行运算,先转化为布尔值,然后返回原值,返回第一个值是false 返回第一个值,如果第二个字是false,返回第二个值,如果都为true返回第二个值。所以第一个是true就返回第二个,第一个是false就返回第一个值。
||逻辑或 两个值进行或运算,左右有true,则返回true,否则返回false,两边有一个满足就行。两个false才返回false,其他有一个true都返回true.短路的或,第一个true就不看后面的值。非布尔值会转化成布尔值,再返回值,第一个为true返回第一个值,如果第一个为false,返回第二个值。