• 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

  • 相关阅读:
    bzoj 3027 [Ceoi2004]Sweet——生成函数
    bzoj 3028 食物——生成函数
    JZOJ 5461 购物 —— 贪心
    JZOJ 1003 [ 东莞市选 2007 ] 拦截导弹 —— 递推
    JZOJ 1667 ( bzoj 1801 ) [ AHOI 2009 ] 中国象棋 —— DP
    洛谷 P2055 [ ZJOI 2009 ] 假期的宿舍 —— 二分图匹配
    洛谷 P3398 仓鼠找sugar —— 树链剖分
    洛谷 P1083 [ NOIP 2012 ] 借教室 —— 线段树 / 二分差分数组
    bzoj 3895 取石子 —— 博弈论
    洛谷 P1312 [ NOIP 2011 ] Mayan游戏 —— 搜索+模拟
  • 原文地址:https://www.cnblogs.com/xuruweb/p/4027377.html
Copyright © 2020-2023  润新知