Javascript声明和使用变量

1.1变量的声明

要在程序中使用变量,就必须从声明变量学起,因为Javascript语法与我们基础的其他程序语言声明变量的方法略有不同,但是Javascript语法的变量应用非常强大,使用也非常简单。

1.1.1声明和命名变量

要使用变量,就必须声明变量,可以使用关键字var来声明,如果不使用var关键字可能会导致程序不易阅读。变量区分大小写。

基本的规则:var 变量名;

(1)声明一个变量名:var firstName;

(2)声明多个变量名,用逗号分隔:var firstName,middleName,lastName;

(3)在声明变量时直接为变量赋值:var firstName = "chengmingxiaowu";

(4)一条语句声明多个变量,同时为这些变量赋值:var firstName="chengming",middleName="xiao",lastName="wu";

1.1.2变量和标识符的命名规范

变量名必须是一个js标识符,遵循以下标准命名规则

(1)第一个字符必须为字母,下划线(_)或者美元符号($);

(2)后面可以跟字母、下划线、美元符号、数字,最好不要包含其他符号。

(3)变量名不能是一个关键字或者逻辑常量。(true,null,false,underfind)

(4)变量名在其作用范围内必须是唯一的。

tip:使用错误的变量名在执行时就会导致错误,但是大多数浏览器不会提示这种语法错误。

1.1.3

数据类型可分为简单数据类型和复杂数据类型

一、简单的

数据类型取值范围

Booleantrue或false。

js也会在适当的时候将值转换为1和0。

Number双精度浮点型。

两个数字常量:

(1)Infinity表示无穷大

(2)NaN表示非数字

String表示一个字符序列,一般使用双引号或者单引号包围。除了内存限制以外,对其长度没有限制。

UnderfindUnderfind数值类型仅有一个值,与类型名相同,注意区分大小写。

当定义了一个变量而未为该变量赋值时,该变量就是underfind.

NullNull数值类型仅有一个值,与类型名相同,注意区分大小写。

当一个用于引用某个对象的变量不再使用时,就可以为该变量赋值为null,

从而该变量就不再引用那个对象了,该变量的值就是空引用。

使用情况:

(1)声明变量还没有接收到值;

(2)声明变量不再包含值;

(3)作为函数的返回值,表明很熟没有可以返回的值;

(4)作为函数的一个参数,表明省略了一个参数。

二、复杂数据类型

(1)Array数据类型

Array为数组变量,数组可以是连续数字索引的数组也可以是符合数组,并且数组元素的数据类型也可以多种多样。

(2)Object数据类型

Object是属性的集合,属性是用来描述对象特性的。

1.1.4自定义常量和内建常量

常量也是变量,但它是一个用于表示其值永远不会改变的变量。

用户可以使用const关键字自定义常量;开发可以使用con_或者大写所有的常量名来区分常量和变量。(IE中的常量定义不生效,所以不推荐自定义的常量。)

以下是常量表:

常量说明

false一个表示与true相反的唯一逻辑值,表示逻辑假

Infinity表示正无穷大 IEEE-754值

-Infinity表示负无穷大的IEEE-754值

NaN一个预定义的变量

null一个可以分配给变量的或由未提供数据的函数返回的特殊值。

true一个表示与false相反的唯一逻辑值,表示逻辑真

undefind一个特殊值,通常用于指示变量尚未赋值。

将underfind用于不同的类型转换函数时,结果也不相同:

(1)String 返回的是 underfind, 转换为字符串。

(2)Nunber返回的是NaN;

(3)Object返回的值为新的Object实例;该实例的属性如果没有初始化,那么其属性值为underfind,而非null,

因为Object并非动态类。

(4)向类型变量赋予值underfind时,改值转换为该数据类型的默认值。

Tip:null==underfind是true;null===underfind是false;

1.2在程序中使用变量

1.2.1为变量赋值和更改变量值:

1、为变量值赋值,1.1中已经介绍,注意点:

1)在位现有的变量重新赋值时,无需使用var关键字;

2)不用var关键字申明的隐式变量具有全局作用,是全局变量;

2、变量值包含引号:若在变量值中包含引号(双引号或者单引号),就必须用转义符(\);但是如果二者交替出现,则无需使用‘\’;

如:var myName="my name is \"chengmingxiaowu\",thank you!";

var myName="my name is 'chengmingxiaowu',thank you!";

var myName='my name is "chengmingxiaowu",thank you!';

3、更改变量值:只需为该变量重新赋值即可。

var  myName = "chengmingxiaowu";

myName = "xiaowu";

4、数据类型的转换:只需为变量赋一个不同类型的值即可。

5、变量的默认值:如果定义了一个变量,但是没有赋值,则运行环境会为其指定一个默认值,这个默认值为underfind。

1.2.2使用变量和获取变量值

变量的值可以相互传递,也可以作为函数的参数被处理,或者被直接显示在网页上。

1、变量申明的顺序:先申明后使用;不申明就会报错。

2、变量申明的提升:先使用后申明,申明会自动提升到最顶部,但是却不能将赋值语句提到顶部,所以会返回该变量对应数据类型的默认值。(虽合法,但不推荐。)

1.3变量的传值和传址

1.3.1传值变量-按值传递

简单数据类型是按值进行传递的, 这种传递类型被成为传值。当按值传递时,将在计算机内存中分配一块空间并将原复制到其中,是相互独立的实体。

var i=10;

var j=i;

alert(j)//输出15

i=30;

alert(j)//输出15

1.3.2传址变量-按引用传递

复杂数据类型可以包含大量和复杂的信息,所以属于此类型的变量并不包含实际的值,它包含的是对值的引用,这种传递类型称为传址。

(这种引用类似于指向变量名的别名,在一些程序语言中称为指针)

var myArry = ["chengming","xiaowu"];

var newArry = myArry;

alert(newArry[1])//返回xiaowu

myArry[1]="xiaowushi";

alert(newArry[1])//返回xiaowushi

1.4内存使用规则-堆和栈

堆和栈都是运行时内存中分配的一个数据去,因此也被成为堆区和栈区,但二者存储的数据类型和处理速度不同。

(1)堆(heap):用于复杂数据类型的分配空间,例如数组对象,Object对象。它在运行时动态分配内存的,因此存取速度比较慢。

(2)栈(stack):主要存放一些基本类型的变量和对象的引用。优势速度快,数据共享。缺点:栈中数据大小与生存期是确定的,缺乏灵活性。

1.4.1 栈的使用规则:

var a=3 首先会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,没有找到,就将3存放进来,然后指向a,接着处理var b=3,在创建完b的引用变量后,直接查找栈中是否有3这个值,因为存在,所以直接指向b 。这样就出现a和b同时指向3的情况。

此时如果a=4,那么js引擎就会重新搜索栈中是否有4,如果没有,存放起来,并a指向4,如果已经有了,就指向这个地址,因此a值的改变不会影响到b值。

1.4.2堆的使用:

当创建数组时,就会在堆内创建一个数组对象,并且在栈内创建一个对数组的引用。

js堆不需要程序代码来显示的释放,因为堆是由自动的垃圾回收来负责的,各种引擎各不相同,但最基本的原则是,如果占中不存在对堆中某个对象堆的引用,那么就会认为该对象已经不再需要,在垃圾回收时就会清除该对象占用的空间。

因此,在不需要的时候应该对对象的引用释放掉,以利于垃圾回收。这样可以提高性能。最常用的方法就是为其赋值null。

1.4.3易犯的错误

在堆和栈的使用问题上,最易犯错误的就是String的使用,例如:

var str1 = new String("abc"); //存放在堆中

var str2 = "abc";//存放在栈中

下面进行逻辑运算来深入了解以下:

(1)存放在栈中

var str1 = "abc";

var str2 = "abc";

alert(str1==str2);//true

alert(str1===str2);//true

(2)存放在堆中

var str1 = new String("abc");

var str2 = new String("abc");

alert(str1==str2);//false

alert(str1===str2);//false

(3)一个存放在堆中,一个栈中

var str1 = "abc";

var str2 = new String("abc");

alert(str1==str2);//true 在进行逻辑等于运算时,会首先将变量转换成相同的数据类型,然后进行对比。

alert(str1===str2);//false

1.5数据类型的转换

在js中,有时进行数据运算前会对数据类型进行转换,分为两种

(1)强制数据转换。

可以使用全局函数进行数据类型转换,这些函数包括parseFloat()、parseInt()、Number()、String()和Boolean()函数。

(2)隐式数据类型转换,比如赋值的时候。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容