javascrip变量和标识符

0x01

  关于javascript,第一个比较重要的概念是变量,变量的工作机制是javascript的基本特性。实际上,变量是标识符的一种。本文将详细介绍变量和标识符

0x02:定义

  标识符(Identifier)就是一个名字,用来对变量、函数、属性、参数进行命名,或者用做某些循环语句中的跳转位置的标记

//变量
var Identifier = 123;
//属性
(new Object).Identifier = ‘test‘;
//函数及参数
function IdentifierName(Identifier1){};
//跳转标记
Identifier:
for(var i = 0; i < 5; i++){
    if(i == 3){
        break Identifier;
    }
}

  在日常生活中,有些东西是固定不变的,有些东西则会发生变化。例如,人的姓名和生日是固定不变的,但心情和年龄却会随着时间变化而变化。人们把那些会发生变化的东西称为变量

  当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量。变量(variable)是一个用于保存值的占位符,可以通过变量名称来获得对值的引用。

0x02:命名规则

  在词法结构一文中,我们介绍到javascript是一门区分字母大小写的语言,且和其他任何编程语言一样,javascript保留了一些标识符为自己所用,保留字不能用做普通的标识符

  [注意]保留字包括关键字、未来保留字、空字面量和布尔值字面量


保留字
   ReservedWord ::
   Keyword
   FutureReservedWord
   NullLiteral
   BooleanLiteral

  此外,javascript预定义了很多全局变量和函数,应该避免把它们的名字用做标识符名

arguments Array Boolean Date decodeURI decodeURIComponent encodeURI
encodeURIComponent Error eval EvalError Function Infinity isFinite
isNaN JSON Math NaN Number Object parseFloat parseInt RangeError
ReferenceError RegExp String SyntaxError TypeError undefined URIError

  javascript标识符名允许包含字母、数字、美元符号和下划线(但第一个字符不允许是数字)

//错误示范
  6num  //开头不能用数字
  %sum //开头不能用除(_ $)外特殊符号,如(%  + /等)
  sum+num //开头中间不能使用除(_ $)外特殊符号,如(%  + /等)

  javascript允许标识符中出现 Unicode字符全集中的字母和数字(包括中文)。因此,程序员也可以使用非英语语言或数学符号来书写标识符

var 测试文字 = ‘test‘;
[注意]出于可移植性和易于书写的考虑,通常我们不使用扩展的ASCII或Unicode字符

通常驼峰格式是标识符命名的首选格式,第一个字母小写,剩下的每个单词的首字母大写

var myMoodToday = ‘happy‘;
  对于不同的数据类型,javascript有约定俗成的标识符名命名规则

        类型                         前缀                    示例
数组(Array)           a           aItems
布尔值(Boolean)         b           bIsComplete
浮点数(Float)               f           fPrice
函数(Function)      fn           fnHandler
整数(Integer)          i           iItemCount
对象(Object)           o           oDIv1
正则表达式(RegExp)        re           reEmailCheck
字符串(String)              s           sUserName
变量(Variant)           v           vAnything 

上面这种命名方法,叫匈牙利命名法。现在当前主流的编程规范都不推荐这种命名法

  一般来说,变量的命名要使用名词,而函数应该是动词+名称的形式

    var count = 10;
var myName="xiaohuochai";
var found = true;
function getName(){
  return 123;
}

对于变量命名来说,尽量要在变量名中体现出值的数据类型

  比如,命名count、length和size表明数据类型是数字,而命名name、title和message表明数据类型是字符串。用单个字符命名的变量诸如i、j、k通常在循环中使用

  而对于函数和方法命名来说,第一个单词应该是动词,下面是一些使用动词常见的约定

can    函数返回一个布尔值
has    函数返回一个布尔值
is    函数返回一个布尔值
get    函数返回一个非布尔值
set    函数用来保存一个值

0x04:变量声明

声明

  在javascript中,使用一个变量之前应当先声明(declare),变量是使用关键字var(variable的缩写)来声明的

var i;
var sum;

  也可以通过一个var关键字来声明多个变量

var i ,sum;
赋值

  把值存入变量的操作称为赋值(assignment)。一个变量被赋值以后,我们就说该变量包含这个值

  给变量第一次赋值的过程,叫初始化

  我们可以将变量的初始赋值和变量声明合写在一起

var message = ‘hello‘;
var i=0,j=0,k=0;

  如果未在var声明语句中给变量指定初始值,那么虽然声明了这个变量,但在给它存入一个值之前,它的初始值就是undefined

  在for循环和for-in循环中同样可以使用var语句,这样可以更简洁地声明在循环语法内中使用的循环变量

for(var i=0; i<10; i++)console.log(i);
  变量可以在声明时赋值,但不能有其他操作,如+=、-=等

var a = 2;//是正确的
var a += 2;//是错误的
var a = 2++;//是错误的,++只能用于变量,不能用于常量

重复声明

  使用var语句重复声明变量是合法且无害的,如果重复声明且带有赋值操作,相当于重新赋值

遗漏声明

  如果试图读取一个没有声明的变量的值,javascript会报错

  javascript允许遗漏声明,即直接对变量赋值而无需事先声明,赋值操作将自动声明该变量

  但是,在ECMAScript5严格模式中,给一个没有声明的变量赋值会报错

<script>
‘use strict‘;
a = 5;
console.log(a);
</script>

0x05:变量特性

  javascript变量是弱类型(也叫松散类型)的,所谓松散类型就是可以用来保存任何类型的数据

  编程语言分为动态类型语言和静态类型语言两种。 动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。javascript就是动态类型语言的代表

  在javascript中,可以在修改变量值的同时修改值的类型

var message = ‘hi‘;
message = 100;//有效,但不推荐

  变量松散类型的特性总结起来有两点:一是声明时不用给变量指定数据类型;二是赋值时可以修改数据类型

0x06:变量作用域

  变量的作用域(scope)是程序源代码中定义这个变量的区域

  作用域分为全局作用域和函数作用域(又叫局部作用域)两种

  全局作用域是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象。所有全局变量和函数都是作为window对象的属性和方法创建的。全局变量拥有全局作用域,在javascript代码中的任何地方都是有定义的。全局作用域直到应用程序退出例如关闭网页或浏览器时才会被销毁

  在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域是局部性的。函数参数也是局部变量,它们只在函数体内有定义。函数作用域中的所有代码执行完毕后,该作用域被销毁,保存在其中的所有变量和函数定义也随之销毁

function test(){
    var message  = ‘hi‘;
}
test();
alert(message);//错误
  如果省略var操作符,则会创建一个全局变量

function test(){
    message  = ‘hi‘;
}
test();
alert(message);//‘hi‘

  虽然省略var操作符可以定义全局变量,但并不推荐。在局部作用域中定义的全局变量很难维护,而且如果有意地忽略了var操作符,也会由于相应变量不会马上就有定义而导致不必要的混乱,给未经声明的变量赋值在严格模式下会导致抛出ReferenceError错误

  在函数体内,局部变量的优先级高于同名的全局变量,如果在函数内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量遮盖


var scope = ‘global‘;
function checkscope(){
    var scope = ‘local‘;
    return scope;
};
checkscope();//‘local‘

声明提升(hoisting)
块级作用域

  块级作用域是指花括号内的每一段代码都具有各自的作用域,而javascript没有块级作用域。javascript只有函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的

  这意味着,变量在声明之前甚至已经可用。javascript这个特性被非正式地称为声明提升(hoisting),javascript函数里声明的所有变量(不涉及赋值)都被提前到函数体的顶部

  [注意]其实除了变量提升,函数也被提升,到函数部分会有详细介绍

var scope = ‘global‘;
function f(){
    console.log(scope);//undefined
    var scope = ‘local‘;
    console.log(scope);//‘local‘
}

//变量声明提升之后,相当于下面代码
var scope = ‘global‘;
function f(){
    var scope;
    console.log(scope);//undefined
    scope = ‘local‘;
    console.log(scope);//‘local‘
}

  javascript中没有块级作用域,所以一些程序员特意将变量声明放在函数体顶部,这种源代码非常清晰地反映了真实的变量作用域

属性变量
  当声明一个javascript全局变量时,实际上是定义了全局对象window的一个属性

  当使用var声明一个变量时,创建的这个变量是不可配置的,也就是说这个变量无法通过delete运算符删除

var truevar = 1;
console.log(truevar,window.truevar);//1 1
delete truevar;//false
console.log(truevar,window.truevar);//1 1

  如果没有使用严格模式并给一个未声明的变量赋值的话,javascript会自动创建一个全局变量,以这种方式创建的变量是全局对象的正常的可配置属性,并可以删除它们

  [注意]IE8-浏览器下,如果删除window属性时,不论该属性是如何创建的,都会报错

window.fakevar1 = 10;
this.fakevar2 = 20;
var fakevar3 = 30;
fakevar4 = 40;

console.log(delete fakevar1);//IE8-浏览器报错,其他浏览器返回true
console.log(delete fakevar2);//IE8-浏览器报错,其他浏览器返回true
console.log(delete fakevar3);//所有浏览器都返回false
console.log(delete fakevar4);//所有浏览器都返回true

  javascript全局变量是全局对象的属性,这是在ECMAScript中强制规定的。局部变量当做跟函数调用相关的某个对象的属性。ECMAScript3称为调用对象(call object),ECMAScript5称为声明上下文对象(declarative environment record)。javascript允许使用this关键字来引用全局对象,却没有办法可以引用局部变量中存放的对象。这种存放局部变量对象的特有性质,是一种对我们不可见的内部实现

参考资料

【1】 ES5/语法 https://www.w3.org/html/ig/zh/wiki/ES5/lexical
【2】 阮一峰Javascript标准参考教程——语法概述 http://javascript.ruanyifeng.com/grammar/basic.html
【3】 W3School-Javascript高级教程——ECMAScript变量 http://www.w3school.com.cn/js/pro_js_variables.asp
【4】《javascript权威指南(第6版)》第3章 类型、值和变量
【5】《javascript高级程序设计(第3版)》第3章 基本概念 第4章 变量、作用域和内存问题
【6】《javascript语言精粹(修订版)》第2章 语法
【7】《javascript DOM编程艺术(第2版)》第2章 Javascript语法

原文地址:http://blog.51cto.com/wt7315/2061684

时间: 2024-10-24 12:12:22

javascrip变量和标识符的相关文章

javascript基础语法——变量和标识符

显示目录 目录 [1]定义 [2]命名规则 [3]声明[4]特性[5]作用域[6]声明提升[7]属性变量 前面的话 关于javascript,第一个比较重要的概念是变量,变量的工作机制是javascript的基本特性.实际上,变量是标识符的一种.本文将详细介绍变量和标识符 定义 标识符(Identifier)就是一个名字,用来对变量.函数.属性.参数进行命名,或者用做某些循环语句中的跳转位置的标记 //变量 var Identifier = 123; //属性 (new Object).Iden

变量与标识符的概念

1.变量:使用一个名称表示一个数值,可以发生变化的量对应的值 且变量要先声明,才可以赋值,才可以参与运算 2.数据类型. 基本数据类型 整型&浮点型 byte short int long &float单精度 double双精度 字符型 char 布尔型 boolean 取值为true or false 复合数据类型 类,接口,数组 3.常量 使用一个名称表示一个值,该量的值一经确定就不允许改变 for example: final doubl j=10; 4.标识符的命名 记忆通用法 不

学习javascript——变量与标识符

目录 [1]变量 变量特性 变量命名 变量声明 变量赋值 [2]标识符 标识符命名 标识符解析 变量 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储数据的容器 变量特性 javascript中的变量是松散类型的,可以保存任何类型的数据.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变 变量命名 变量可以任意取名,但必须遵循命名规则: [1]第一个字符必须是字母.下划线或美元符号.其他字符可以是字母.下划线.美元符号或数字 //错误示范

java中变量和标识符名命名规范

变量存放的是内存地址,当定义一个变量后,我们可以通过变量名找到该内存地址,可以修改该内存区间的值. 标识符的命名规范:首字母:字母,下划线,$符号:其余部分:数字,字母,下划线,$. 标识符应该避开java里面的关键字 变量名若为多个英文单词组成,则需要像驼峰法规则来命名.首字母应该小写. java关键字,java语言有51个关键字,不能使用这些关键字来命名类,变量和方法名.java关键字如下: 数组类型:int long short byte boolean float double char

变量、标识符

---恢复内容开始--- 变量:用于装数据的,相当于一个容器 JAVA是强类型语言: 所有的变量必须先声明.后使用 指定类型的变量.只能装对应的数据 声明变量 类型 变量名 [= 初始值] 标识符:可以用字母.下划线.数字.美元符号($)组成: 不能以数字开头,不可以使用关键字.不能单独使用下划线:关键字:JAVA语言中一些有特殊意义的单词保留字:goto.const直接量:Ptrue.false.null. ---恢复内容结束--- 原文地址:https://www.cnblogs.com/D

Python变量、标识符

一.变量 Python中的变量不需要声明,变量赋值的过程就是变量声明和定义的过程 变量在内存中创建,包括变量的标识.变量名和数据 每个变量在使用前都必须赋值,变量赋值后该变量才会被创建 格式:变量名 = 值  注意:等号两边必须要有空格 等号(=)左边是变量名 等号(=)右边是存储在变量中的值 等号(=)用来赋值 例如: number1 = 1 number2 = 0.99 name = “大侠” 多个变量赋值: 变量1 = 变量2 = 变量3 = 值 变量1, 变量2, 变量3 = 值1, 值

Java基础学习笔记 -- 3(变量、标识符、关键字)

1. 变量 变量就是指代在内存中开辟的存储空间,用于存放运算过程中需要使用到的数据. 比如: int a = 5; int b = 10; 其中 a 和 b 就是变量(具体来说是局部变量).    变量的声明: 使用Java语法声明一个变量,让运行环境为其分配空间: int num; int a,b,c; 变量的命名: 变量命名需要符合Java的语言规则,同时变量的取名尽量有意义(name.address等): 变量的初始化: 声明变量后,需要为其赋一个初始值后才能使用: 1)声明同时初始化 :

【Java学习笔记之三】java中的变量和常量

变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据数据在程序运行中是否发生改变,来选择应该是使用变量代表还是常量代表. 变量 变量代表程序的状态.程序通过改变变量的值来改变整个程序的状态,或者说得更大一些,也就是实现程序的功能逻辑.     为了方便的引用变量的值,在程序中需要为变量设定一个名称,这就是变量名.     由于Java语言是一种强类型

javascript的变量,传值和传址,参数之间关系

先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值. 书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样.基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制