天天看点

JS基础-变量和标识符

定义

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

// 变量
var Identifier = 1;

// 属性
(new Object).Identifier = 1;

// 函数、参数
function Identifier1 (Identifier2) {}

// 跳转标记
Identifier:
for(var i = 0; i <= 3; i++) {
  if(i == 2) {
    break Indentifer;
  }
}
           

变量是一个用于保存值的占位符,可以通过变量的名字取得对该值的引用。

命名规则

JavaScript对标识符的命名是区分大小写的,标识符允许包含字母、数字(第一个字符不能是数字)、美元符号、下划线。

// 正确示范
var _foo = 1;
var $foo = 1;
var foo2 = 1;
           

JavaScript允许标识符中出现Unicode字符集中字母和数字(中文亦可),但考虑到代码的可移植性通常不会这么做。标识符的命名首选驼峰命名法,驼峰命名即第一个字母小写,单词首字母大写。

示例:

var myName = 'wmui'

通常变量的命名使用名词,函数的命名使用动词加名称形式

// 变量
var count = 10;
var message = 'hello';

// 函数
function canChoose() {} // 返回一个布尔值
function hasName() {} // 返回一个布尔值
function isShow() {} // 返回一个布尔值
function getData() {} // 获取一些数据
function setData() {} // 保存一些数据
           

变量声明

要想使用一个变量,首先要声明一个变量,声明变量使用关键字

var

var foo = 1;
var bar = 2;

// 同时声明多个变量
var foo = 1, bar = 2;
           

赋值

把值存入变量的过程称为赋值,第一次为变量赋值的过程叫初始化。变量声明后如果未初始化,那么它的值是

undefined

// 声明一个变量
var foo;

// 声明并赋值
var foo = 1;
           

重复声明

使用var关键字重复声明一个变量是合法的,如果声明带有赋值操作,则相当于对变量重新赋值。

var foo = 1;
var foo;

// foo: 1
           

遗漏声明

JavaScript允许遗漏声明,即直接对变量赋值而不事先声明,赋值的同时将自动声明该变量。在严格模式下这么做浏览器会报错。

foo = 1;
// foo: 1;

<script>
  'use strict';
  foo = 1;

// foo: foo is not defined
</script>
           

变量的特性

JavaScript中的变量是弱类型的,也叫松散类型的,它可以用来保存任何数据类型。JavaScript是一种动态语言,在运行期间才做数据类型的检查,所以编程时可以不指定数据类型,它会在第一次赋值时在内部将数据类型记录下来,并且可以在修改变量值的同时自动修改数据类型,但不推荐这么做。

松散类型的特征有两点:

  1. 变量声明时无需指定数据类型
  2. 赋值操作可以自动修改数据类型

变量的作用域

变量的作用域就是定义它在程序中的作用区域,作用域分为全局作用域和函数作用域。全局作用域是最外层的执行环境,在浏览器中就是window对象,所有全局变量和全局函数都是window对象的属性和方法,它们直到程序退出时才会被销毁。

在函数内使用var关键字声明的变量叫做局部变量,函数参数也是局部变量,作用域也是局部的。函数作用域中的代码执行结束后作用域立即被销毁。

function foo() {
  // 局部变量
  var bar = 1;

  // 全局变量
  bar2 = 2;
}

// 全局变量
var bar = 1;
           

不使用var关键字定义的变量都是全局变量,在函数内部使用var关键字定义的变量是局部变量。

在函数内部,局部变量的优先级高于同名的全局变量,所以它会覆盖同名的全局变量。

var foo = 1;

function bar() {
  var foo;
  return foo;
}

bar() // undefined


           

变量声明提升

function foo() {
  console.log(bar); // undefined
  var bar = 1;
  console.log(bar); // 1
}

// 相当于
function foo() {
  var bar;
  console.log(bar); // undefined
  bar = 1;
  console.log(bar); // 1
}
           

声明提升简单说就是指全局作用域或函数作用域里声明的所有变量都被提前到函数体顶部,这种特性被非正式的命名为变量声明提升

如果没有声明提升,在第一次打印bar变量时应该会显示

bar is not defined

,但是由于声明提升,在作用域内部会把所有声明的变量提升到顶部,于是相当于声明了变量但未赋值,所以结果就是

undefined

。由于JavaScript没有块级作用域,所以在编码过程通常把要用到的变量统一放在函数体顶部,这样能清晰的反映出变量的作用域。

全局变量

var bar = 'good'
function foo() {
  var bar2 = 'hello';
  return this.bar2;
}

console.log(window.bar)  // good
console.log(this.bar) // good
foo() // undefined
           
window.bar1 = 1;
this.bar2 = 1;
bar3 = 1;
var bar4 = 1;

delete bar1; // true
delete bar2; // true
delete bar3; // true 
delete bar4; // false
           

博客: https://blog.86886.wang

GitHub: https://github.com/wmui

继续阅读