经过找工作笔试的洗礼,感觉自己js语法方面掌握的不是很系统,今天来梳理下——变量以及运算符。
基础篇
和C语言的不同点:是一种弱类型语言,申明变量时不需要指定类型;变量名的命名方法也有不同;简单类型种类也有不同;类型可以相互转化
1.命名
是以字母,_,$开头的,由数字,字母,下划线 $组成的,不包括关键子,区分大小写的串称为标识符(加入了美元符号,不能以数字开头啦)。
2. 申明
形式:var keyname; 可以多个一起申明,可以申明时初始化。
eg: var obj; var arr=[], objArr={};
注:(1)不需要申明类型,会根据程序的运行 自动转换类型。(2)没有定义就使用的,会报错;申明了,没有赋值的是undefinedd类型;(3)没有使用var申明的是全局变量,关于全局变量下面会具体分析。
3.变量类型
简单类型:boolean string number undefined null
注意点:
boolean:其值是true,false 也会转换为 0,1 使用, Isload()==1;
string: 当个字符,或者字符串都是string类型;可以用单引号或者双引号都可以var str='adafsd', str2="abc",其他同C语言;
number:表示 整数,小数;整数包括十进制,八进制(078),十六进制(ox78);数字常量:(Infinity 表示正无穷大 NaN 表示非数字)
null:是空类型,只有一个值null.表示没有数据。
复杂类型:Array object
Array:是数组类型,可以用下标访问,如:var t=[a,b,c];可以是复杂数组类型:var t=[{a=b},{a2=b}]
object: 对象类型,可以表示对象的 属性 -值 ,键值对。可以嵌套任意类型。访问用.进行访问。
4.传值和传址
当变量时简单类型时,是传值的;如果变量时复杂变量时,是传址的,及,传递的是原对象的引用(可以是指针,或者别名,指向的是原对象的的内存空间)。
5. 堆栈
简单类型 存放在栈中,复杂类型存放在堆中,通过引用来操作;栈比堆快,栈可以共享,栈中的内容生存周期是和上下文相关,离开上下文就消亡。这里提到了共享.
eg: var a="abc" ;var b="abc"; 这时 a===b(true);因为 abc存放在栈中,可以共享。
var a=new string("abc"); var b="abc"; var c=new string("abc"); 这时 a!==b!==c;在堆中时运行是分配内存,不可以共享,并且堆中的东西和栈中更不相等。
顺便 说下,内存管理。javascript中有内存管理机制,只要是没有人再引用这个单元时,垃圾回收机制(GC)会自动收回内存。
垃圾回收:主要通过标记法和引用法两种方式。标记法策略:当变量进入一个上下文就为变量标记为“进入环境”,离开上下文就标记为“离开环境”,垃圾回收机制为每个在内存中的变量都进行标记,他会为每个进入上下文的变量或者引用的变量进行清除标记,如果在这之后加上的标记就表示是准备删除的数据。GC会回收内存,清除标记。引用法:记录引用他的次数,不引用时减1.
内存泄露:虽然有内存管理机制(和java类似),但是也存在内存泄露的情况。比如闭包。
提升篇
主要总结 数据类型转换,变量作用域,相关内容
1.类型转换
分类:分为显示转换和隐式转换
a 、显示转换
转换为数字:Number(); parseInt(stirng,radix);parseFloat(string);
转换为字符串:String(); toString();
转换为布尔类型:Boolean(mix);
Number()规则
Number(Null)===0;
Number(undefinde)=NaN;
Number("")===0;
Number(boolean)===0/1;
Number(string):当只包含数字时返回数字;当包含数字是float类型时,返回小数;空字符串返回为0;否则返回为NaN
b 、隐式转换
1.递增符号的转换
1. 当变量时字符串时,会根据Number()规则,转换成数字,然后加++,--; 字符串中没有数字转换为NaN
2. 当变量时boolean时,会转换为0,1 ,进行++ --操作,变量从boolean 变为数字型。
3.Float 会自动+1;
总结:NaN,void,undefined,null ,以及常规的boolean-》0,1
NaN 运算符NaN(其他)结果为NaN(NaN是数字型,但是不是数字,每次都是计算机给分配的随机值,NaN===NaN(false))
null==undefined(true)在类型转换时unfinished=》null
null===undefined(false) 两个是不同的类型,不相等
void(任意):void d ; 会将d的值清除 返回undefined,(void 返回undefined)
‘''=='0'(false)
"0"==0(true)
""==0(true)
void(2)+4=NaN (void(2)=>undefined=》NaN+4=NaN)
2. 作用域提升
变量必须要定义之后才能使用,但是在一个作用域中,如果先用,再定义也不会报错,只是出来的结果会不是想象中的。这个就是变量作用域提升。
原理:函数调用时,会建立上下文,(1)声明参数,并给参数赋值,(2)声明函数并给函数符函数的引用(3)声明变量,给变量赋值undefined(对于函数名和变量名重名的情况,会忽略变量的声明,变量名依然指向函数的引用)
然后才会处理this的指向,最后调用执行;可见在执行之前会将函数内部的所有变量声明,只是赋值为undefined,具体赋值要在执行期做。
所以类似 eg: alert(t); var t=30; alert(t); 输出: undefined 30