javascript.info 重新学习 js 的学习笔记。文章对于了解不深或比较重要的知识点进行记录。

简介

JavaScript 简介

JavaScript 在刚诞生的时候,它的名字叫 “LiveScript”。但是因为当时 Java 很流行,所以决定将一种新语言定位为 Java 的“弟弟”会有助于它的流行。

随着 JavaScript 的发展,它已经成为了一门完全独立的语言,并且也拥有了自己的语言规范 ECMAScript。现在,它和 Java 之间没有任何关系。

浏览器引擎

  • V8 —— Chrome、Opera 和 Edge 中的 JavaScript 引擎。
  • SpiderMonkey —— Firefox 中的 JavaScript 引擎。
  • ……还有其他一些代号,像 “Chakra” 用于 IE,“JavaScriptCore”、“Nitro” 和 “SquirrelFish” 用于 Safari,等等。

引擎是如何工作的?

引擎很复杂,但是基本原理很简单。

  1. 引擎(如果是浏览器,则引擎被嵌入在其中)读取(“解析”)脚本。
  2. 然后,引擎将脚本转化(“编译”)为机器语言。
  3. 然后,机器代码快速地执行。

引擎会对流程中的每个阶段都进行优化。它甚至可以在编译的脚本运行时监视它,分析流经该脚本的数据,并根据获得的信息进一步优化机器代码。

手册与规范

JavaScript 基础知识

hello word

  • 我们可以使用一个 <script> 标签将 JavaScript 代码添加到页面中。
  • typelanguage 特性(attribute)不是必需的。
  • 外部的脚本可以通过 <script src="path/to/script.js"></script> 的方式插入。
  • 关于分号是否省略的问题,这个看个人喜好,但是某些情况必须添加分号
    • ([/+-等字符开头的语句,其前一句语句必须加分号
  • 多行注释不支持嵌套

“use strict”

长久以来,JavaScript 不断向前发展且并未带来任何兼容性问题。新的特性被加入,旧的功能也没有改变。这么做有利于兼容旧代码,但缺点是 JavaScript 创造者的任何错误或不完善的决定也将永远被保留在 JavaScript 语言中。

这种情况一直持续到 2009 年 ECMAScript 5 (ES5) 的出现。ES5 规范增加了新的语言特性并且修改了一些已经存在的特性。为了保证旧的功能能够使用,大部分的修改是默认不生效的。你需要一个特殊的指令 —— “use strict” 来明确地激活这些特性。

  • 确保 use strict 出现在最顶部
  • 没有办法取消 use strict
  • 现代 JavaScript 支持 classmodule,它们会自动启用 use strict。因此,如果我们使用它们,则无需添加 use strict 指令

变量

  • 变量名称必须仅包含字母数字、符号 $_
  • 首字符必须非数字
  • 区分大小写
  • 允许非英文字母,但不推荐
  • 不能使用保留字
  • use strict下,必须声明才可使用变量(let、var、const)

数据类型

在 JavaScript 中有 8 种基本的数据类型(译注:7 种原始类型和 1 种引用类型)。
Number,BigInt,String,Boolean,Null,Undefined,Object,Symbol

  • Number
    除了常规的数字,还包括所谓的“特殊数值(“special numeric values”)”也属于这种类型:Infinity、-Infinity 和 NaN。
  • BigInt
    表示任意长度的整数,兼容性列表
    1
    2
    // 尾部的 "n" 表示这是一个 BigInt 类型
    const bigInt = 1234567890123456789012345678901234567890n;
  • String
    在 JavaScript 中,有三种包含字符串的方式,双引号、单引号、反引号。
  • Boolean
    boolean 类型仅包含两个值:true 和 false。
  • null
    特殊的 null 值不属于上述任何一种类型。它构成了一个独立的类型,只包含 null 值。相比较于其他编程语言,JavaScript 中的null 不是一个“对不存在的 object 的引用”或者 “null 指针”。JavaScript 中的 null 仅仅是一个代表“无”、“空”或“值未知”的特殊值。
  • undefined
    特殊值 undefined 和 null 一样自成类型。undefined 的含义是 未被赋值。如果一个变量已被声明,但未被赋值,那么它的值就是 undefined
  • Symbol
    symbol 类型用于创建对象的唯一标识符。
  • Object
    其他所有的数据类型都被称为“原始类型”,因为它们的值只包含一个单独的内容(字符串、数字或者其他)。相反,object 则用于储存数据集合和更复杂的实体。

typeof null 的结果为 “object”。这是官方承认的 typeof 的错误,这个问题来自于 JavaScript 语言的早期阶段,并为了兼容性而保留了下来。null 绝对不是一个 object。null 有自己的类型,它是一个特殊值。typeof 的行为在这里是错误的。

typeof alert 的结果是 “function”,因为 alert 在 JavaScript 语言中是一个函数。函数隶属于 object 类型。但是 typeof 会对函数区分对待,并返回 “function”。这也是来自于 JavaScript 语言早期的问题。从技术上讲,这种行为是不正确的,但在实际编程中却非常方便。

typeof(x) 和 typeof x 没有区别,但后者更常见

交互

  • alert

    1
    alert("Hello");
  • prompt

    1
    2
    let age = prompt('How old are you?', 100);
    alert(`You are ${age} years old!`); // You are 100 years old!

    在 prompt() 函数之前添加 + 符号将会把该函数返回的值转换为数字类型。这个操作也被称为“显式类型转换”。
    let age = +prompt(" How old are you ?","")
    如果用户输入的内容为非数字,则会返回 NaN

  • confirm

    1
    2
    let isBoss = confirm("Are you the boss?");
    alert( isBoss ); // 如果“确定”按钮被按下,则显示 true

类型转换

  • String(value) 转换为 字符串
  • Number(value) 转换为数字,如果 value 不是一个有效的数字,转换的结果会是 NaN
    转变为
    undefined NaN
    null 0
    true 和 false 1 and 0
    string 去掉首尾空白字符(空格、换行符 \n、制表符 \t 等)后的纯数字字符串中含有的数字。如果剩余字符串为空,则转换结果为 0。否则,将会从剩余字符串中“读取”数字。当类型转换出现 error 时返回 NaN
  • Boolean(value) 转换为布尔值
    • 直观上为“空”的值(如 数字0、空字符串、null、undefined 和 NaN)将变为 false。
    • 其他值变成 true。
    • 请注意:包含 数字0 的字符串 “0”(零) 是 true
    • 请注意:含有 空格 字符串(属于非空字符串)也是 true

基础运算符,数学运算

术语: “一元运算符”,“二元运算符”,“运算元”

  • 运算元 —— 运算符应用的对象。
    比如说乘法运算 5 * 2,有两个运算元:左运算元 5 和右运算元 2。有时候人们也称其为“参数”而不是“运算元”。
  • 一元运算符。
    如果一个运算符对应的只有一个运算元,那么它是 一元运算符。比如说一元负号运算符(unary negation)-,它的作用是对数字进行正负转换:let x = 1; x = -x; alert( x );
  • 二元运算符。
    如果一个运算符拥有两个运算元,那么它是 二元运算符。减号还存在二元运算符形式:let x = 1, y = 3;alert( y - x ); // 2,二元运算符减号做减运算

运算符优先级

相关知识点
取余%求幂**二元运算符+ 连接字符串一元运算符+ 数字转化链式赋值自增\自减

位运算符

位运算符把运算元当做 32 位整数,并在它们的二进制表现形式上操作。MDN 位运算符

逗号运算符

逗号运算符 , 是最少见最不常使用的运算符之一。逗号运算符能让我们处理多个表达式,使用 , 将它们分开。每个表达式都运行了,但是只有最后一个的结果会被返回。

1
2
let a = (1 + 2, 3 + 4);
alert( a ); // 7(3 + 4 的结果)
1
2
// 一行上有三个运算符
for (a = 1, b = 3, c = a * b; a < 10; a++) {}