ECMAScript 的各种字

206 阅读10分钟

各种字

  • 常量
  • 变量
  • 关键字和保留字 (Keywords & Reserved word)
  • 标识符 (Identifier)
  • 注释

常量

能用常量就别用变量, 省心

  1. 什么是常量? 常量表示一些固定不变的数据 现实生活中人的性别其实就可以看做是常量, 生下来是男孩一辈子都是男孩, 生下来是女孩一辈子都是女孩
  2. JavaScript中常量的分类
    1. 整型常量 整型常量其实就是正数, 在JavaScript中随便写一个整数都是整型常量 1 / 666 / 99
    2. 实型常量 实型常量其实就是小数, 在JavaScript中随便写一个小数都是实型常量 3.14 6.66
    3. 字符串常量 字符串常量其实就是用单引号或者双引号括起来的内容, 我们就称之为字符串常量 (这点和 java 蛮不一样) 'a' 'abc' "1" "知播渔教育"
      • 注意点: 无论用单引号或者双引号括起来了多少个字符, 在JavaScript中都是字符串常量
    4. 布尔常量 布尔常量其实就是真或者假, 在JavaScript中通过true和false来表达 在JavaScript中布尔常量只有两个取值, 真(true)或者假(false)
    5. 自定义常量 在ES6中新增的 const 常量名称 = 常量取值;

补充:

每个常量必定有其数据类型

变量

简介

  1. 什么是变量? 变量表示一些可以被修改的数据 在现实生活中超市的储物格就是变量, 在不同的时间段里面, 储物格中存储的数据也不一样
  2. 如何定义一个变量 在JavaScript中可以通过定义变量的方式来生成储物格, 也就是告诉浏览器, 我们需要一块内存空间 var 变量名称;
  3. 如何使用变量 使用变量就是往申请的那块内存空间中存储数据, 和获取存储的数据
    1. 如何存储数据 变量名称 = 需要存储的数据; 可以将等号右边需要存储的数据放到等号左边变量申请的那块存储空间中
    2. 如何获取存储在变量中的数据 变量名称

补充

  • 在JavaScript中第一次给变量赋值, 我们称之为"变量的初始化"
  • 在JavaScript中如果定义了一个变量,但是没有进行初始化, 那么变量中存储的是 undefined
  • 给变量初始化有很多种形式
    1. 定义变量, 对变量进行初始化 var num, value; num = 123; value = 666;
    2. 可以在定义变量的同时对变量进行初始化 var num =123;
  • 同时定义多个变量: var 变量名称1, 变量名称2, .... ;
  • 同时初始化多个变量: 变量名称1 = 变量名称2 = 变量名称... = 初始化值;

变量注意点

(2 和 3 是 ES6 以前的垃圾特性)

  1. 在JavaScript中变量之间是可以相互赋值
  2. 在JavaScript中如果定义了同名的变量, 后定义的变量会覆盖先定义的变量 var num = 666; num = 888; // 如果num前面没有var, 那么就是修改变量中存储的值 var num = 888;// 如果num前面有var, 那么就不是修改变量中存储的值, 而是重新定义一个新的变量
  3. 老版本的标准的(ES6之前)JavaScript中可以先使用变量, 再定义变量, 并不会报错 由于JavaScript是一门解释型的语言, 会边解析边执行, 浏览器在解析JavaScript代码之前还会进行一个操作"预解析(预处理)" 预解析(预处理)步骤: 将当前JavaScript代码中所有变量的定义和函数的定义放到所有代码的最前面

ES6 对变量的补救

为了解决老板标准的的注意点的 2 和 3 在ES6中就推出了一种新的定义变量的方式 格式:

  • ES6之前: var 变量名称;
  • ES6开始: let 变量名称;

// 定义一个变量

​ let num;

// 给变量初始化

​ num = 666;

var num = 123;
var num = 888; // 老版本中这么写没问题
let num = 123;
let num = 888; //会明确的报错

字面量

Literals represent values in JavaScript. These are fixed values—not variables—that you literally provide in your script.

  • Array literals
  • Boolean literals
  • Floating-point literals
  • Numeric literals
  • Object literals
  • RegExp literals
  • String literals

数据类型

javascript 的七种基本数据类型

六种基本数据类型

  • undefined | 只有一个取值 undefined, 未初始化的变量中保存的是 undefined
  • null | 空类型 (空类型与对象类型是关联在一起的)
  • string | 在JavaScript中无论是通过引号还是通过引号括起来的内容都是属于字符串类型的
  • boolean | 只有两个取值true/false
  • number | 在JavaScript中无论是整数还是小数都是属于数值类型的
  • symbol(ES6) | ES6 新增

一种引用类型

  • Object | 对象类型

typeof 操作符

利用 typeof 检测123 这个常量是属于哪一种数据类型的, 并且将检测的结果保存到res这个变量中

​ // let res = typeof 123;

​ // let res = typeof 3.14;

注意点:

  • 对 null 做 typeof 运算会得到 object

    let a = null;
    let b = typeof a;
    console.log(b); // object
    
  • undefined 的特殊之处在于 undefined 这个类型只有一个取值, 这唯一的取值就是 undefined

  • 对象的属性键名类型为且仅为字符串

    let obj = {
      a: "大兄弟",
      b: "big bro",
      c: "她好漂亮",
    };
    
    for (let property in obj) {
      console.log(property);
      console.log(typeof property);
    }
    
    /*
    a
    string
    b
    string
    c
    string
    */
    

数据类型转换

转为字符串类型

可以将 number 类型, boolean 类型, undefined 类型, null 类型转换为字符串类型

转为字符串类型的三种方式

  1. 对于 number 类型和 boolean 类型来说, 可以通过 变量名称 .toString(); 的方式来转换
  2. 通过 String (常量or变量); 转换为字符串
  3. 通过变量or常量 + ''or""转换为字符串 // 底层就是调用了 String();

注意:

  • 数字类型的数字在浏览器控制台输出是蓝色的,字符串类型的数字在浏览器控制台输出是灰色的, 二者不是同一类型 即使在 powershell 中输出结果看上去一毛一样, 其不改变二者不是同一类型的事实
  • 常量类型不可改变, 形如 123.toString(); 是错的
  • null 和 undefined 类型不能通过 .toString 拿到对应(转为)字符串
  • null 和 undefined 类型可以通过被 String() 包裹来拿到对应(转为)字符串
  • String (常量or变量); 的好处在于常量变量都能转

转为数值类型

可以将 string 类型, boolean 类型, undefined 类型, null 类型转为字符串

转为数值类型的三种方式

  1. 通过 Number(常量or变量); 方式来转换 // 底层是调用了 Number(常量or变量);
  2. 通过数学运算中的 +号 和 -号 来转换
  3. 通过 parseInt(需要转换的字符串)/parseFloat(需要转换的字符串) // 好处在于能从非纯数字中提取出数字

注意:

  • string 类型如果字符串中都是数值, 那么就正常转换

    • 如果字符串是一个空串(零个以上的空格且无其他), 那么转换之后是0
    • 如果字符串中不仅仅是数字, 那么转换之后是NaN
  • boolean 类型

    • true转换之后是 1
    • false转换之后是 0
  • undefined 类型

    • 转换之后是 NaN
  • null 类型

    • 转换之后是 0

      // 但这儿有个反直觉的点
      let res = null == 0;
      console.log(res); // false
      // 这说明可转不代表本质相同
      
      // 还有这个
      let res = undefined == null;
      console.log(res); // true
      // 这俩不是同一基本类型, 转为数值也不同, 但双等运算却返回 true
      
    • 总的来说双等挺坑的, 推荐用全等或比较函数比如 isNaN(变量或常量);

  • parseInt/parseFloat 都会从左至右的提取数值, 一旦遇到非数值就会立即停止 停止的时候如何还没有提取到数值, 那么就返回 NaN (字符串里有数字但不在最前也会返 NaN)

    • parseInt/parseFloat 都会将传入的数据当做字符串来处理

      let value = true;
      let num = parseInt(value);
      console.log(num); // NaN
      
  • 小结:

    • 空字符串/false/null 转换之后都是 0
    • 字符串中不仅仅是数字/undefined 转换之后是 NaN
    • 其它的正常转换
    • 反复接触发现这些规则还是很有道理的

转为布尔类型

可以将 string 类型, number 类型, undefined 类型, null 类型转为字符串

转为布尔类型的唯一一种方式: 通过 Boolean(常量or变量)

注意:

  • string 类型 只要字符串中有内容都会转换为 true, 只有字符串中没有内容才会转换为 false 空格也算内容
  • number 类型 只有数值是 0 或 NaN 才会转换为 false, 其它的都会转换为 true
  • undefined 类型 转为 false
  • null 类型 转为 false
  • 小结: 空字符串/0/NaN/undefined/null 会转换成false, 其它的都是true

关键字与保留字

关键字

什么是关键字?

  • 被 JavaScript 语言赋予了特殊含义的单词
  • 关键字在开发工具中会显示特殊颜色
  • 关键字不能用作变量名、函数名等
  • 关键字严格区分大小写, var和Var前者是关键字, 后者不是
  • 只需要记住一点: 在 JavaScript 中**所有的关键字都是小写**的
关键字
breakdoinstanceoftypeofcase
elsenewvarcatchfinally
returnvoidcontinueforswitch
whiledefaultifthrowdelete
intryfunctionthiswith
debuggerfalsetruenull
const (ES6 之前是保留字)import (ES6 之前是保留字)export(ES6 之前是保留字)let(ES6 之前是保留字)
class (ES6 之前是保留字)extends (ES6 之前是保留字)super (ES6 之前是保留字)static (ES6 之前是保留字)

保留字

保留字就是 JavaScript 预留的关键字, 它们暂未被实现, 但以后的升级版本中有可能作为关键字

保留字
enumimplements
privatepublicyieldinterfacepackage
protected

标识符

标识符命名规则 (必须遵守)

  • 只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_、美元符号$组成 (其实有中文也不报错 )
  • 不能以数字开头
  • 严格区分大小写,比如 test 和 Test 是2个不同的标识符
  • 不可以使用关键字、保留字作为标识符

标识符命名规范 (建议遵守)

  • 见名知意: 变量的名称要有意义 (名义明确, 有利于提高阅读性)
  • 驼峰命名: 首字母小写, 第二个单词起每个单词的首字母大写 (有利于提高阅读性)

注释

  1. 什么是JS的注释? 和 HTML/CSS 的注释一样, 都是用来注解解释某一段程序的含义, 用来提升代码的阅读性的, 方便程序员之间沟通
  2. JS注释的格式
    1. 单行注释: // 被注释的内容 注意点: 单行注释的有效范围是从第二个斜杠开始一直直到这一行的末尾, 也就是被注释的内容不能换行
    2. 多行注释: /* 被注释的内容 */ 注意点: 多行注释的有效范围是从第一颗星开始直到第二颗星结束, 也就是说被注释的内容可以换行
    3. JS中注释的嵌套规则 (只有面试才会问这个)
      1. 单行注释可以嵌套单行注释, 但是必须在一行
      2. 单行注释可以嵌套多行注释, 但是必须在一行
      3. 多行注释可以嵌套单行注释
      4. 多行注释不可以嵌套多行注释
// 被注释的内容                                          被注释的内容

/*
被注释的内容
被注释的内容
被注释的内容
*/