在 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,等等。
引擎是如何工作的?
引擎很复杂,但是基本原理很简单。
- 引擎(如果是浏览器,则引擎被嵌入在其中)读取(“解析”)脚本。
- 然后,引擎将脚本转化(“编译”)为机器语言。
- 然后,机器代码快速地执行。
引擎会对流程中的每个阶段都进行优化。它甚至可以在编译的脚本运行时监视它,分析流经该脚本的数据,并根据获得的信息进一步优化机器代码。
手册与规范
- 最新的规范草案请见 https://tc39.es/ecma262/
- 想了解最新最前沿的功能,包括“即将纳入规范的”(所谓的 “stage 3”),请看这里的提案 https://github.com/tc39/proposals
- MDN(Mozilla)JavaScript 索引 是一个带有用例和其他信息的主要的手册。 https://developer.mozilla.org/
- 查看兼容性的网站
- https://caniuse.com 每个功能的支持表
- https://kangax.github.io/compat-table 一份列有语言功能以及引擎是否支持这些功能的表格。
JavaScript 基础知识
hello word
- 我们可以使用一个
<script>
标签将 JavaScript 代码添加到页面中。 type
和language
特性(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 支持
class
和module
,它们会自动启用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
2let 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
2let 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 | let a = (1 + 2, 3 + 4); |
1 | // 一行上有三个运算符 |