JavaScript 变量
变量是用于存储信息的"容器"。
在 JavaScript 中,变量用于存储数据,并可以在程序执行过程中动态更改。
在 JavaScript 中,变量可以存储各种类型的数据,如数字、字符串、对象、函数等。
变量名是标识符,用于引用存储在变量中的数据。
在 JavaScript 中,可以使用 var、let 和 const 关键字来声明变量。
var:ES5 引入的变量声明方式,具有函数作用域。let:ES6 引入的变量声明方式,具有块级作用域。const:ES6 引入的常量声明方式,具有块级作用域,且值不可变。
就像代数那样
x=5
y=6
z=x+y
在代数中,我们使用字母(比如 x)来保存值(比如 5)。
通过上面的表达式 z=x+y,我们能够计算出 z 的值为 11。
在 JavaScript 中,这些字母被称为变量。
| 您可以把变量看做存储数据的容器。 |
JavaScript 变量
与代数一样,JavaScript 变量可用于存放值(比如 x = 5)和表达式(比如 z = x + y)。
变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的名称(比如 age, sum, totalvolume)。
- 变量必须以字母开头
- 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)
- 变量名称对大小写敏感(y 和 Y 是不同的变量)
| JavaScript 语句和 JavaScript 变量都对大小写敏感。 |
JavaScript 数据类型
JavaScript 变量还能保存其他数据类型,比如文本值 (name="Bill Gates")。
在 JavaScript 中,类似 "Bill Gates" 这样一条文本被称为字符串。
JavaScript 变量有很多种类型,但是现在,我们只关注数字和字符串。
当您向变量分配文本值时,应该用双引号或单引号包围这个值。
当您向变量赋的值是数值时,不要使用引号。如果您用引号包围数值,该值会被作为文本来处理。
实例
尝试一下 »
声明(创建) JavaScript 变量
在 JavaScript 中创建变量通常称为"声明"变量。
我们使用 var 关键词来声明变量:
var carname;
变量声明之后,该变量是空的(它没有值)。
如需向变量赋值,请使用等号:
carname="Volvo";
不过,您也可以在声明变量时对其赋值:
var carname="Volvo";
在下面的例子中,我们创建了名为 carname 的变量,并向其赋值 "Volvo",然后把它放入 id="demo" 的 HTML 段落中:
var 声明特点:
- 变量可以重复声明(覆盖原变量)。
- 变量未赋值时,默认值为 undefined。
- var 声明的变量会提升(Hoisting),但不会初始化。
| 一个好的编程习惯是,在代码开始处,统一对需要的变量进行声明。 |
一条语句,多个变量
您可以在一条语句中声明很多变量。该语句以 var 开头,并使用逗号分隔变量即可:
var lastname="Doe", age=30, job="carpenter";
声明也可横跨多行:
var lastname="Doe", age=30, job="carpenter";
一条语句中声明的多个变量不可以同时赋同一个值:
var x, y, z = 1;
x, y 为 undefined, z 为 1。
Value = undefined
在计算机程序中,经常会声明无值的变量。未使用值来声明的变量,其值实际上是 undefined。
在执行过以下语句后,变量 carname 的值将是 undefined:
var carname;
重新声明 JavaScript 变量
如果重新声明 JavaScript 变量,该变量的值不会丢失:
在以下两条语句执行后,变量 carname 的值依然是 "Volvo":
var carname="Volvo"; var carname;
JavaScript 算数
您可以通过 JavaScript 变量来做算数,使用的是 = 和 + 这类运算符:
使用 let 和 const (ES6)
在 2015 年以前,我们使用 var 关键字来声明 JavaScript 变量。
在 2015 后的 JavaScript 版本 (ES6) 允许我们使用 const 关键字来定义一个常量,使用 let 关键字定义的限定范围内作用域的变量。
let
let 是 ES6 引入的新变量声明方式,推荐使用。
let 语法:
let variableName = value;
实例
let age = 30;
console.log(city, age); // 输出: 北京 30
const
const 用于定义常量,即一旦赋值后,变量的值不能再被修改。
const 语法:
const variableName = value;
实例
// z = 20; // 报错,常量不可重新赋值
if (true) {
const z = 20; // 不同的常量
console.log(z); // 输出 20
}
console.log(z); // 输出 10
更多 const 和 let 内容可以参阅:JavaScript let 和 const。
Safari 10 和 Edge 14 是第一批支持 ES6 所有特性的浏览器:
| Chrome 58 | Edge 14 | Firefox 54 | Safari 10 | Opera 55 |
| Jan 2017 | Aug 2016 | Mar 2017 | Jul 2016 | Aug 2018 |
您将在本教程稍后的章节学到更多有关 JavaScript 运算符的知识。
zhangxv
zha***v95@163.com
参考地址
介绍JS中的let变量:
let允许你声明一个作用域被限制在块级中的变量、语句或者表达式。在Function中局部变量推荐使用let变量,避免变量名冲突。
作用域规则
let 声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数。
function varTest() { var x = 1; if (true) { var x = 2; // 同样的变量! console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // 不同的变量 console.log(x); // 2 } console.log(x); // 1 }zhangxv
zha***v95@163.com
参考地址
麦田里的蓝天
cbi***21@163.com
参考地址
Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。
// num1为全局变量,num2为window的一个属性 var num1 = 1; num2 = 2; // delete num1; 无法删除 // delete num2; 删除 function model(){ var num1 = 1; // 本地变量 num2 = 2; // window的属性 // 匿名函数 (function(){ var num = 1; // 本地变量 num1 = 2; // 继承作用域(闭包) num3 = 3; // window的属性 }()) }麦田里的蓝天
cbi***21@163.com
参考地址
nougat
571***699@qq.com
const 关键字用来声明 JavaScript中的常量(与变量相对,不可修改,但同样是用于存储信息的"容器"。),常量的值不能通过重新赋值来改变,并且不能重新声明。
代码:
//定义常量a并赋值为0 const a = 0; //报错(不能重新赋值) a = 1; //报错(不能重新声明) const a = 2; //输出0 console.log("a is: " + a);nougat
571***699@qq.com
aYanOk
155***1363@qq.com
看书的时候会有一个“字面量”的概念,初学不是很好理解。
字面量(literal)用于表达源代码中一个固定值的表示法(notation),整数、浮点数以及字符串等等都是字面量。
示例:
又如:
var stooge = { // stooge 是一个对象 "frist-name" = "Julie", // 等号左为属性名,右侧为属性值 last_name = "beck" // 属性名如果是合法的标识符,可省略引号 }; // "frist-name", last_name, "Julie", "beck" 都是对象字面量总之,字面量就是没有用标识符封装起来的量,是“值”的原始状态。
与常量的区别如下:
aYanOk
155***1363@qq.com
TheArrow
191***030@qq.com
参考地址
JavaScript 允许重复声明变量,后声明的覆盖之前的
JavaScript 允许重复定义函数
JavaScript 没有重载这个概念,它仅依据函数名来区分函数。
后定义的同名函数覆盖之前的,与参数无关。
function test() { console.log("test"); } test(); //输出 "test arg0 + undefined" function test(arg1) { console.log("test arg" + arguments.length + " + " + arg1); } test(1,2); //输出 "test arg2 + 1"实参个数如果比形参少,那么剩下的默认赋值为 undefined,如果实参传的比形参数量多,那么是全部都会被传进去的,只不过没有对应的形参可以引用(但可以用 arguments 来获取剩下的参数)。
function test(arg1) { for(var i=0; i<arguments.length; i++) { console.log(arguments[i]); } } test(1,2); //输出 1 2变量与函数重名的时候,变量生效
这涉及到了变量和函数的预解析:
var a = 100; function a() { return "function"; } console.log(a); //输出 100 console.log(a()); /* 报错 Uncaught TypeError: a is not a function (anonymous function) @test.html:9 */JS 中有两种函数,一种是普通函数,一种是函数对象。下面的这种就是“函数对象”,它实际上是声明一个匿名函数,然后将该函数的 init 方法赋值给该变量。
var a = 100; var a = function() { return "function"; } console.log(a); /* 输出 function() { return "function"; } */ console.log(a()); //输出 "function"函数与内部变量重名
定义普通函数,即在 window 变量下,定义一个 key,它的名字为该函数名,值为该函数的地址。函数内部的 this 指向 window 对象。
function a() { console.log(this); //输出 window{...} this.a = 1; //即 window.a = 1,此时window下的function a已经被该变量覆盖了。 var a = 5; //下面的这几个变量都是局部变量,仅在花括号范围内有效。 a = 10; var v = "value" return "function"; } console.log(a); //输出 function a {...} console.log(a()); //输出 "function" console.log(a); //输出 1 console.log(v); /* 输出 Uncaught ReferenceError: v is not defined (anonymous function) @ mycolor.html:15 */TheArrow
191***030@qq.com
参考地址
独孤尚良
yut***hanlin@qq.com
参考地址
楼上有句话是觉得欠妥当的 —— “JavaScript 允许重复声明变量,后声明的覆盖之前的”。
JavaScript 允许变量被重复声明,在声明变量时 JavaScript 会自行判断这个变量是否已经被声明了,如果已经被声明(即已经存在),那么重复声明(即除了变量的非首次声明)会被跳过,不再执行声明的操作。
JavaScript 变量的值是可以被重复赋值的,最后的赋值是这个变量最后的结果。
这个笔记所说的覆盖,其实是赋值的覆盖。如果说后声明的会覆盖已声明的,那么后声明的应该是 undefined 而不是第一次声明时候的赋值,也就是说如果是声明覆盖的话,相当于没有 var a=1 那么一个只有声明没有赋值的变量,它的值就是 undefined。
我们如何验证这个覆盖是声明的覆盖还是赋值的覆盖呢?看下面的代码:
我们再输出a的值,验证下是 undefined 还是 1 就知道了。
独孤尚良
yut***hanlin@qq.com
参考地址
杨大帅
204***1624@qq.com
-----------------------------------------------------------------
同名声明赋值的变量:逐条进行-后者覆盖前者。(同级别覆盖)
同名声明赋值的-函数和变量:逐条进行-后者覆盖前者。(同级别覆盖)
var a = 1; var a = function () { } console.log(a); //输出结果: a 函数-----------------------------------------------------------------
注:var f = function () {} 和 function f () {} 的区别(有var就有内存)
var f = function () {console.log("有var")} // 声明函数 function f () {} // 未声明函数 console.log(f); // 输出结果: 有var的f函数-----------------------------------------------------------------
同名声明的变量:赋值的级别高。(同名声明未赋值)
-----------------------------------------------------------------
声明和未声明的同名变量:后者是重新赋值。(同名未声明赋值)
var a = 1; // 声明赋值 a =2 ; // 未声明变量 console.log(a); // 输出结果: 2 var f = function () {} // 声明赋值 f = function () {console.log("赋值")} // 未声明变量 console.log(f); // 输出结果:function () {console.log("赋值")}杨大帅
204***1624@qq.com