javaScript理解

159 阅读7分钟

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,返回第二个值。