追求JS小姊姊系列 Day22 -- 工具人、姐妹不只身份的差别(中):从识别字开始讲起吧

前情提要

奇怪的事情,姐妹们疑似也有超能力。

方函式:表面上虽然看起来就是所谓的姐妹、工具人关系,但事实上背後,我们还有一套专属的识别方式。


识别身份背後的一切原理

JavaScript内的程序码,都是由Unicode字元集(character set) 来撰写,除此之外,让我们来更近一步探索还有哪些规则。

识别字(identifier)

作为一个名称,被用来为变数、特性、函式与类别命名。

命名规则:

  1. 可为一个单字x
  2. 一个底线符号_
  3. 一个钱币符号$
  4. unicode字母、数字、形意符号(不建议)
  5. 中文字(不建议)
  6. 数学符号(π)

以下分别来测试:

//一个字母
let x = 2;

//一个钱币符号
const $ = 3;

//一个底线符号
let _ = 5;

//中文
let 铁人 = "Andy";

//形意符号 Ideographs
let ? = "竟然也能";

//数学符号 π
let π = "数学符号"

//上面都是所谓的识别字。

console.log(x,$,_,铁人,?,π)

看吧,没有一个有报出错误。

不建议的识别字
在上面部分识别字有标示不建议,是基於:

  1. 易移植性
  2. 易编辑性
  3. 相容性
    以unicode为例,部分电脑无法显示、输入,或正确的处理完整的unicode字元集,即便JavaScript定义了所谓的转义序列来处理这类问题。

基於上述理由,一般识别字命名建议还是以ASII字母与数字为主。


保留字(reserved words)

这些字被JavaScript预留,不能被作为识别字的名称,唯有在特定情形下可以破例,但背後原理复杂,有机会再讲。

不相信的话,我们挑出预留字new 来作为识别字试试看:

let new  = 2;

嗯,报错了。


所以为何需要宣告?

不知道你会不会跟我之前一样(其实是现在),常看到宣告的好处不外乎就是:避免污染全域

我们可以把这句话拆为两个部分来理解:

  1. 全域是什麽?
  2. 污染是指?

1. 全域是什麽?

所谓全域,全名为全域物件(global object) 是一个物件,当JS直译器启动时(或是重整页面时),它就会内建一些初始的特性:

  1. 全域常数:undefined,NaN
  2. 全域函式:isNaN(),eval()等等
  3. 建构器函式:像是前面介绍过的Date(),String()

但这些内容不是保留字。

所以它们的值会被修改吗? 来试试看

window.undefined //undefined
undefined = 5;
window.undefined // undefined

就算识别字名称取名与它们相同,它们不会被修改。

2. 污染是指?

现在我们知道什麽是全域了,那污染指的是?

//最初staff变数作为
staff = 15;

function calculateNumbers(i){
    return staff + i;
}
calculateNumbers(1);

console.log(staff);//16?

function calculateNumbers(i){
    staff = [];
    staff.push(i);
    return i
}
console.log(staff);

这是因为当你的识别字,没有进行宣告时
识别字x1的值会变成属性,被存入global object内。

x1 = 2;
//window查找是否有这个属性
window.x1

所以,不论你是在哪都能取到x1的值,且会互相影响。

-- to be continued --


那今天就到这边搂!
每天的休息,是为了後面的追求,明天见。


reference:

犀牛大全
JavaScript Reserved Words
初学者跪着学JavaScript Day3:变数Variable、宣吿var


<<:  不只懂 Vue 语法:试说明有哪些方式可以全域注册方法?

>>:  【Day 22】Google Apps Script - API Blueprint 篇 - API Blueprint 格式范例

Day26 参加职训(机器学习与资料分析工程师培训班),Tensorflow.keras & Pytorch

上午: Python机器学习套件与资料分析 挑几个不错的片段分享 # 储存每个epoch的weigh...

[Day 06] 特徵图想让人分群 ~模型们的迁移学习战~ 第一季 (迁移学习)

前言 「指月录」卷二十八有道: 「见山是山,见水是水;见山不是山,见水不是水;见山仍是山,见水仍是水...

[Day 17] - 『转职工作的Lessons learned』 - Cube.js / Redis TimeoutError

今天要继续讲转职工作使用到的工具以及遇到的一些问题及处理方式。 公司的专案在制作图表有使用到Cube...

[iT铁人赛Day8]JAVA阵列(中篇)

今天继续说到阵列,来做几个范例 程序码如下: import java.util.*; import ...

Day-11 Set Associative Cache

Set Associative Cache tags: IT铁人 Direct Mapped缺点 上...