Javascript 基础—变量 &运算符

经过找工作笔试的洗礼,感觉自己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

原文地址:https://www.cnblogs.com/xuruweb/p/4027377.html