文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!
作者|慕课网精英讲师 然冬
变量就是存放一些内容的容器。
对于初学者,理解变量是重要的一环。
从分析变量这个名词,可以知道他是一个可以改变的量,这里的量就是代表某一种值。
在 JavaScript 中,变量就是一个用来存放值的容器,并且可以对容器中的值做修改。
每个变量都有唯一的变量名,使用变量名来区分变量。
在 JavaScript 中使用var关键字来声明变量。
var 存放数字用的变量 = 996;
console.log(存放数字用的变量); // 输出:996
代码块123
上述这段代码就是申明了一个名为存放数字用的变量的变量,并且将它的值设为996。
使用 console.log,括号内放置变量名,即可将变量的值输出在控制台。
其中 // 后面的内容为注释,代码执行过程中会被忽略。
虽然使用中文作为变量名在 chrome 浏览器下没有报错,但是还是不建议使用。
常规场景中不会有使用中文名作为变量的情况。
所以上述例子中的变量名不可取。
var number = 996;
console.log(number); // 输出:996
代码块123
将存放数字用的变量修改成 number ,执行结果是一样的。
给变量设置值的操作称为赋值操作。
var result = 0;
console.log(result); // 输出:0
代码块123
这是一个最简单的赋值操作,直接将值赋给变量。
通常只有一个等号出现的情况下就存在赋值操作。
var result = 2 + 3;
console.log(result); // 输出:5
代码块123
这也是一个赋值操作,只不过等号右边的 2 + 3 会被计算出结果(计算的方式和小学开始学习的自然数学一样),再赋给变量 result。
将上面这个例子做一个简单的改写:
var number1 = 2;
var number2 = 3;
var result = number1 + number2; // 2 + 3
console.log(result); // 输出:5
代码块123456
原本 2 + 3 这部分也可以被变量所代替,参与计算的就是变量中的值。
var string = '今天加班?';
console.log(string); // 输出:今天加班?
string = '福报!';
console.log(string); // 输出:福报!
代码块1234567
注意:
这里赋给变量的值和之前有点不一样,是中文文字。
当需要用变量存放一些“字”的时候,就需要用单引号'或者双引号"将需要存放的字包裹。
通常单个字会称之为字符,多个字的时候称为字符串。
这里做个了解,具体的会在后续数据类型章节详细展开讨论。
这段代码运行后可以在控制台观察到有两个输出,分别对应变量的值。
代码很简单,先声明了一个叫 string 的变量,并赋值字符串今天加班?并输出,随后修改了他的值,重新赋值了字符串福报!。
这是变量最重要的一个特性:可变。
在 JavaScript 中变量名存在一定规范,所有变量名必须符合这些规范,否则程序无法执行。
尽管之前的例子有用到中文作为变量名,但是是不推荐的。
// 不会报错但是不推荐
var 数字 = 1;
// 错误
var 1number = 1;
// 错误
var number@a = 1;
// 错误
var num+aa = 2;
//下面是正确的方式
var number1 = 1;
var _number = 1;
var $number = 1;
代码块12345678910111213
以上是一些简单的示例,可以根据规则自己在控制台尝试寻找规则。
// 这是两个不同的变量
var firstName = 'Hello';
var firstname = 'hello';
代码块123
以上是两个不同的变量,在 JavaScript 中变量是对大小写敏感的。
两个变量名即便字母是相同的,但是大小写不同,就不能算做一个变量。
关键字就是指一些已经被 JavaScript 预定义或者保留下来的内容,如声明变量用的关键字 var 就不能作为变量名。
var var = 1; // Uncaught SyntaxError: Unexpected token 'var'
代码块1
上面这段代码尝试着将 var 作为变量,到控制台运行是会报错的。
刚开始学习的读者,现在去深究如何命名一个变量还有些尚早,因为结合了具体的需求场景才能体会到一个好的变量名的重要性。可以先在此做个了解。
对于变量名,除了上面提到的变量命名的规范,最需要注意的就是给变量起一个有意义的名字。
如求和:
var num1 = 1;
var num2 = 2;
var num3 = 3;
var num4 = 4;
var count = num1 + num2 + num3 + num4;
代码块123456
其中num是number的缩写,是很常用的一种缩写。
count则是总数,表示求和的结果。
如果将上述例子做如下修改:
var a = 1;
var b = 2;
var c = 3;
var d = 4;
var e = a + b + c + d;
代码块123456
缺少了有意义的变量名就比较难看出代码具体在做什么。当然这段代码本身意义就不大,场景太过简单。
刚才提到的缩写,其实也是要注意的一点,缩写上一定要使用通用的缩写,如含有fn表示一个功能或者函数,avg 表示平均值,pwd 表示密码,i18n 为国际化。
这些缩写比较通用,大部分开发者都可以看得懂。随着编码经验的增加,会在他人代码里见到大量的缩写,从而累积到自己的大脑的缩写库中。
最后需要注意的一点是业务中尽量不要含有中文拼音或中文拼音的缩写,排开鄙视链的原因,最大的问题是会让变量名变得冗长难懂。
以上内容在写 demo 或者测试功能的时候可以不需要考虑,写 demo 等大部分情况是为了验证自己的猜想。
// 不合理的变量名
var ln = 'World'; // last name
var zs = 0; // 总数
var jinNianDeNianShouRu = 1999999999; // 今年的年收入
代码块1234
以上是针对变量名的意义展开的讨论。
还有需要注意的是变量命名的格式,大部分前端程序员会使用驼峰命名法,也就是第一个字母小写,后续如果有新的单词来进行构成,单词的第一个字符都大写。
如:
var firstName = 'Hello';
var lastName = 'world';
var createAt = 1577895179196;
var userInfo = '用户信息'; // Info => Information
var isPaidUser = '是否付费用户';
代码块123456789
可以见到上面的变量,从构成变量名的第二个单词开始,首字母都是大写,这就是驼峰命名的格式,本 Wiki 所有变量名使用的就是这种格式。
当然还有大驼峰,就是第一个字母也大写。
除此之外最常用的还有使用下划线分隔变量,如 user_info,还有按功能来划分的变量名,如使用匈牙利命名法,这里不再做展开。
变量在声明的时候,如果没有赋值,则变量就会有一个默认值 undefined。
var total;
console.log(total); // 输出:undefined
代码块123
undefined 是一种是数据类型,具体内容可以参考数据类型章节。
使用一个 var 关键字就可以直接声明多个变量。
var num1 = 0, num2 = 1;
// 通常会换行,方便阅读代码
var num3 = 2,
num4 = 3,
num5 = 4,
num6,
num7 = 6;
代码块12345678
在一个变量声明后,使用逗号分隔,紧接着声明下一个变量即可。
通常使用一个 var 声明多个变量的时候也会换行,方便后续阅读,并保持代码格式上的整洁清晰,防止一行过长。
在最外层声明的变量(不包括 ES6 模块的情况),实际上是变成了 window 对象的一个属性。
var number = 996;
console.log(number); // 输出:996
console.log(window.number); // 输出:996
代码块1234
上述代码执行后输出的两个内容是一样的,都为 996。有关 window 对象的内容可以参考 BOM 章节。
细心的读者应该会注意到最外层这个条件,因为变量还有可能声明在函数之中,函数有自己独立的作用域,通常在函数中使用 var 关键字声明的变量,只在函数中有效。
至于为什么可以省略 window 直接访问到变量,可以参考作用域链章节。
假如不使用 var 关键字,直接创建变量并赋值:
total = 10;
console.log(total); // 输出:10
代码块123
在控制台运行后会发现其实并没有报错,输出的结果也正常。
在非ES6模块中,这样创建的变量和使用 var 创建的变量除了不能提前使用之外,没有其他大的区别,会被直接作为 window 对象的属性,成为全局变量。
即便是在函数或者其他存在块级作用域的环境中,这样声明的变量也会作为全局变量。
var a = b = 1;
代码块1
假如把上面这行代码拆开来可以理解成是这样的:
b = 1;
var a = b;
代码块12
看似没什么问题,许多开发者也会用这种方式同时声明多个变量,但如果在函数或者独立的作用域中,b 就会成为全局变量,造成全局命名空间的污染。
按照之前说的,变量在声明的时候如果没有赋值,则会是 undefined,这个规则在重复声明的情况下不适用。
var num = 1;
var num;
console.log(num); // 输出:1
代码块1234
观察上面这个例子输出的结果,可以发现变量 num 的值并没有改变。
但是如果重新声明的同时做赋值操作,值就会改变。
var num = 1;
var num = 3;
console.log(num); // 输出:3
代码块1234
这个例子输出的结果,就是再次声明并赋值后的值。
console.log(number); // 输出:undefined
var number = 1;
代码块123
这个例子先输出了 number 的值,再声明并对其进行赋值。
代码并没有报错,但如果没有第二行声明,只输出 number:
console.log(number); // Uncaught ReferenceError: number is not defined
代码块1
这样子会爆出变量未定义的错误,说明变量是可以被提前使用,只是没有值,或者说是 undefined 默认值。
具体原因可以参考执行上下文章节。
这里简单的解释可以理解成,在浏览器执行的时候,会把代码调整成如下样子:
var number;
console.log(number); // 这个时候 number 还没有被赋值,所以输出 undefined
number = 1;
代码块12345
常量就是定义并赋值后再也不能修改的量,通常一些不会改变的量,如配置、物理值等会声明为常量,在 ES6 之前是没有提供常量这一特性的。
但是根据常量自身的特性,定义赋值后不能被修改,就可以通过一些方式来模拟常量。
第一种就是采用约定的形式,通常常量都是大写,不同单词之间用下划线分隔。
var PI = 3.1415926535;
var DB_ACCOUNT = 'root';
var DB_PASSWORD = 'root';
代码块1234
这种方式定义的常量本质上还是变量,值还是可以修改的,但因为命名格式采用国际惯例,一眼就能看出是常量,不会对其修改。
这种方式是最简单的方式,但不安全。
第二种方式就是利用对象下属性的描述来控制可写性,将对象的属性设置为只读。
var CONFIG = {};
Object.defineProperty(CONFIG, 'DB_ACCOUNT', {
value: 'root',
writable: false,
});
console.log(CONFIG.DB_ACCOUNT); // 输出:root
CONFIG.DB_ACCOUNT = 'guest';
console.log(CONFIG.DB_ACCOUNT); // 因为不可被改写,所以输出:root
代码块123456789101112
这种方式将常量都放在一个对象下,通过Object.defineProperty定义属性,设定其writable为false,就可以防止被改写。
但有一个问题,CONFIG自身这个对象可能被修改。
换一个思路,既然在最外层声明的变量是放在window上的,那可以用这个方式往 window上挂不可改写的属性。
Object.defineProperty(window, 'DB_ACCOUNT', {
value: 'root',
writable: false,
});
console.log(DB_ACCOUNT); // 输出:root
DB_ACCOUNT = 'guest';
console.log(DB_ACCOUNT); // 因为不可被改写,所以输出:root
代码块12345678910
通常情况下 window 对象是不可被修改的,这样常量的安全系数就变得非常高,但缺点是可能性较差,通过一点修改可以提升可读性。
var define = function(name, value) {
Object.defineProperty(window, name, {
value: value,
writable: false,
});
};
define('DB_ACCOUNT', 'root');
define('DB_PASSWORD', 'root');
代码块123456789
只要约定好使用 define 函数定义的都为常量即可。
还有两种方式,就是结合Object.seal与Object.freeze的特性来声明常量。
前者可以使对象不能再被扩充,但是所有属性还需要再手动设置不可写,后者可以让对象不能扩充,属性也不能修改。
这里对这两个原生方法不再做过多描述,有兴趣可以查阅相关 API 资料。
变量就是存放值的容器。
变量名存在一些命名规则:
同时起变量名的时候需要有意义,靠近上下文场景。
欢迎关注「慕课网」,发现更多IT圈优质内容,分享干货知识,帮助你成为更好的程序员!
avaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。
预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义。
代码执行: 从上到下执行JS语句。
预解析只会发生在通过 var 定义的变量和 function 上。学习预解析能够让我们知道为什么在变量声明之前访问变量的值是 undefined,为什么在函数声明之前就可以调用函数。
预解析也叫做变量、函数提升。变量提升变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。
console.log(num); // 结果是多少?
var num = 10; // ?
函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。
fn();
function fn() {
console.log('打印');
}
解决函数表达式声明调用问题,参考以下代码。
复杂的网站都会有大量的CSS代码,通常也会有许多重复的值。
举个例子,同样一个颜色值可能在成千上百个地方被使用到,如果这个值发生了变化,需要全局搜索并且一个一个替换,效率不高且容易出错。
自定义属性在某个地方存储一个值,然后在其他许多地方引用它。另一个好处是语义化的标识。比如,--main-text-color 会比 #00ff00 更易理解,尤其是这个颜色值在其他上下文中也被使用到。
自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的,它包含的值可以在整个文档中重复使用。
由自定义属性标记设定值(比如: --main-color: black;),由 var() 函数来获取值(比如: color: **var(--main-color)**;)。
在构建大型站点时,作者通常会面对可维护性的挑战。在这些网页中,所使用的CSS 的数量是非常庞大的,并且在许多场合大量的信息会重复使用。
例如,在网页中维护一个配色方案,意味着一些颜色在 CSS 文件中多次出现,并被重复使用。当你修改配色方案时,不论是调整某个颜色或完全修改整个配色,都会成为一个复杂的问题,不容出错,而单纯查找替换是远远不够的。
如果使用了CSS 框架,这种情况会变得尤其糟糕,此时如果要修改颜色,则需要对框架本身进行修改。
在这些场合使用 LESS 或 Sass 类似的预处理器是非常有帮助的,但是这种通过添加额外步骤的方式,可能会增加系统的复杂性。
CSS变量为我们带来一些预处理器的便利,并且不需要额外的编译。
这些变量的第二个优势就是名称本身就包含了语义的信息。CSS 文件变得易读和理解。main-text-color比文档中的#00ff00更容易理解,特别是同样的颜色出现在不同的文件中的时候。
下面是 CSS 变量的使用方法和步骤。
我们都知道,在 JS 中要使用一个变量前,必须声明这个表变量。在 CSS 中也是一样的道理。
声明一个自定义属性,属性名需要以两个减号(--)开始,属性值则可以是任何有效的CSS值。和其他属性一样,自定义属性也是写在规则集之内的,如下:
body {
--bg-color: #7F583F;
--color: #F7EFD2;
}
上面代码中,body选择器里面声明了两个变量:--bg-color和--color。
它们与color、font-size等正式属性没有什么不同,只是没有默认含义。所以 CSS 变量(CSS variable)又叫做**"CSS 自定义属性"**(CSS custom properties)。
规则集所指定的选择器定义了自定义属性的可见作用域。通常的最佳实践是定义在根伪类 :root下,这样就可以在HTML文档的任何地方访问到它了:
:root {
--main-bg-color: #eee;
}
自定义属性名是大小写敏感的,--my-color 和 --My-color 会被认为是两个不同的自定义属性。
通过var()函数来读取变量。语法如下:
var(custom-property-name, value)
变量名称必须以两个破折号(--)开头,且区分大小写!
使用方法:
element {
background-color: var(--main-bg-color);
}
变量也可以使用在变量声明中:
:root {
--primary-color: #eee;
--primary-bg-color: var(--main-bg-color);
}
变量值只能用作属性值,不能用作属性名。
在 JS 代码中,我们可能需要读取 CSS 变量的值,其方法如下:
const root = document.querySelector(":root");
// 设置 CSS 变量
root.style.setProperty("--main-bg-color", "red");
// 读取 CSS 变量
const computedStyle = getComputedStyle(root);
const mainBgColor = computedStyle.getPropertyValue("--main-bg-color");
console.log(mainBgColor);
// 删除 CSS 变量
root.style.removeProperty("--main-bg-color");
以上就是关于 CSS 变量的一些基本概念及使用方法,更多详情待后续!
灵活使用 CSS 变量,不仅可以提高生产力,也能够提高代码的可阅读性和维护性。
~
~
~ 本文完
学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!
大家好!我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!
知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!
*请认真填写需求信息,我们会在24小时内与您取得联系。