Js 简介
什么是 Js?
Js 最初被创建的目的是“使网页更生动”。
Js 写出来的程序被称为 脚本,Js 是一门脚本语言。
- 被直接写在网页的 HTML 中,在页面加载的时候自动执行
- 脚本被以纯文本的形式提供和执行,不需要特殊的准备或编译即可运行(JIN compiler)
Js 不仅可以在浏览器中执行,也可以在服务端执行,本质上是它可以在任意搭载了Js 引擎的设备中执行。
浏览器中嵌入了 Js 引擎,有时也称作“JavaScript 虚拟机”,不同的引擎有不同的“代号”,例如:
- V8 —— Chrome、Opera 和 Edge 中的 Js 引擎。
- SpiderMonkey —— Firefox 中的 Js 引擎。
- Chakra —— IE
- JavaScriptCore、Nitro 、 SquirrelFish —— Safari
eg:如果 “V8 支持某个功能” ,那么我们可以认为这个功能大概能在 Chrome、Opera 和 Edge 中正常运行。
引擎是如何工作的?
引擎很复杂,但是基本原理很简单。
- 引擎(如果是浏览器,则引擎被嵌入在其中)读取(“解析”)脚本。
- 然后,引擎将脚本转化(“编译”)为机器语言。
- 然后,机器代码快速地执行。
引擎会对流程中的每个阶段都进行优化。它甚至可以在编译的脚本运行时监视它,分析流经该脚本的数据,并根据获得的信息进一步优化机器代码。
浏览器中的 Js
能做什么?
现代的 Js 是一种“安全的”编程语言。它不提供对内存或 CPU 的底层访问,因为它最初是为浏览器创建的,不需要这些功能。
Js 的能力很大程度上取决于它运行的环境。例如,Node.js 支持允许 Js 读取/写入任意文件,执行网络请求等。
浏览器中的 Js 可以做下面这些事:
- 在网页中添加新的 HTML,修改网页已有内容和网页的样式。
- 响应用户的行为,响应鼠标的点击,按键的按动。
- 向远程服务器发送网络请求,下载和上传文件(所谓的 AJAX 和 COMET 技术)。
- 获取或设置 cookie,向访问者提出问题或发送消息。
- 记住客户端的数据(“本地存储”)。
不能做什么?
为了用户的(信息)安全,在浏览器中的 Js 的能力是受限的。
目的是防止恶意网页获取用户私人信息或损害用户数据。
此类限制的例子包括:
-
网页中的 Js 不能读、写、复制和执行硬盘上的任意文件。它没有直接访问操作系统的功能。
现代浏览器允许 Js 做一些文件相关的操作,但是这个操作是受到限制的。
仅当用户做出特定的行为,Js 才能操作这个文件。eg:用户把文件“拖放”到浏览器中,或者通过
<input type='file'>
标签选择了文件。有很多与相机/麦克风和其它设备进行交互的方式,但是这些都需要获得用户的明确许可。
-
不同的标签页/窗口之间通常互不了解。
有时候,也会有一些联系,例如一个标签页通过 Js 打开的另外一个标签页。
但即使在这种情况下,如果两个标签页打开的不是同一个网站(域名、协议或者端口任一不相同的网站),它们都不能相互通信。这就是所谓的“同源策略”。
为了解决“同源策略”问题,两个标签页必须都包含一些处理这个问题的特定的 Js 代码,并均允许数据交换。
-
Js 可以轻松地通过互联网与当前页面所在的服务器进行通信。但是从其他网站/域的服务器中接收数据的能力被削弱了。尽管可以,但是需要来自远程服务器的明确协议(在 HTTP header 中)。这也是为了用户的信息安全。
数据类型
在 Js 中有 8 种基本的数据类型(7 种原始类型和 1 种引用类型)
Number 类型
代表整数和浮点数,可以有很多操作,eg:乘法 *
、除法 /
、加法 +
、减法 -
等等。
除了常规的数字,还包括所谓的“特殊数值”:Infinity
、-Infinity
和 NaN
。
科学计数法
- 将
"e"
和 0 的数量附加到数字后。就像:123e6
与123
后面接 6 个 0 相同。 "e"
后面的负数将使数字除以 1 后面接着给定数量的零的数字。例如123e-6
表示0.000123
(123
的百万分之一)。
多种进制
-
可以直接在十六进制(
0x
),八进制(0o
or00
)和二进制(0b
or0B
)系统中写入数字。 -
使用
Number()
方法将含有对应前缀的字符串数值转为十进制Number('0b111') // 7 Number('0o10') // 8
-
parseInt(str, base)
将字符串str
解析为在给定的base
数字系统中的整数,2 ≤ base ≤ 36
。 -
num.toString(base)
将数字转换为在给定的base
数字系统中的字符串。
常规数字检测
全局方法
isNaN(value)
—— 将其参数转换为数字,然后检测它是否为NaN
isFinite(value)
—— 将其参数转换为数字,如果它是常规数字,则返回true
(NaN/Infinity/-Infinity
返回false)
定义在Number上的方法 (ES6)
-
Number.isNaN()
——检查一个值是否为NaN
。如果参数类型不是NaN
,Number.isNaN
一律返回false
-
Number.isFinite()
—— 检查一个数值是否为有限的。如果参数类型不是数值,Number.isFinite
一律返回false
。
区别
传统的全局方法isFinite()
和isNaN()
先调用Number()
将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()
对于非数值一律返回false
, Number.isNaN()
只有对于NaN
才返回true
,非NaN
一律返回false
。
isFinite(25) // true
isFinite("25") // true
Number.isFinite(25) // true
Number.isFinite("25") // false
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false
不规则字符串转换为数字
任务:将 12pt
和 100px
之类的值转换为数字
全局方法
- 使用
parseInt/parseFloat
进行“软”转换,它从字符串中读取数字,然后返回在发生 error 前可以读取到的值。
定义在Number上的方法 (ES6)
- ES6 将全局方法
parseInt()
和parseFloat()
,移植到Number
对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。
Math 对象的扩展
-
使用
Math.floor
,Math.ceil
,Math.trunc
,Math.round
或num.toFixed(precision)
进行舍入。其中Math.trunc() —— 用于去除一个数的小数部分,返回整数部分(内部使用Number
方法将其先转为数值) -
Math.sign() —— 用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
- 参数为正数,返回
+1
; - 参数为负数,返回
-1
; - 参数为 0,返回
0
; - 参数为-0,返回
-0
; - 其他值,返回
NaN
。
- 参数为正数,返回
-
Math.cbrt() —— 计算一个数的立方根
-
Math.clz32() —— 将参数转为 32 位无符号整数的形式,然后返回这个 32 位值里面有多少个前导 0
-
Math.imul() —— 返回两个数以 32 位带符号整数形式相乘的结果,返回的也是一个 32 位的带符号整数。
-
Math.fround() —— 返回一个数的32位单精度浮点数形式
-
Math.hypot() —— 返回所有参数的平方和的平方根
使用两个点来调用一个方法
请注意 123456..toString(36)
中的两个点不是打错了。如果我们想直接在一个数字上调用一个方法,比如上面例子中的 toString
,那么我们需要在它后面放置两个点 ..
。
如果我们放置一个点:123456.toString(36)
,那么就会出现一个 error,因为 Js 语法隐含了第一个点之后的部分为小数部分。如果我们再放一个点,那么 JavaScript 就知道小数部分为空,现在使用该方法。
也可以写成 (123456).toString(36)
。
如果是小数:可以直接写为0.13.toFixed(1)
数值分隔符
ES2021,允许 Js 的数值(所有进制)使用下划线(_
)作为分隔符,这个数值分隔符没有指定间隔的位数。
使用注意点:
- 不能放在数值的最前面或最后面。
- 不能两个或两个以上的分隔符连在一起。
- 小数点的前后不能有分隔符。
- 科学计数法里面,表示指数的
e
或E
前后不能有分隔符。 - 分隔符不能紧跟着进制的前缀
0b
、0B
、0o
、0O
、0x
、0X
(eg:0_b1100,0b_0100)
下面三个将字符串转成数值的函数,不支持数值分隔符:
- Number()
- parseInt()
- parseFloat()
BigInt 类型
number 类型无法安全地表示大于 (253-1),或小于 - (253-1)的整数。
更准确的说:
“number” 类型可以存储更大的整数,但超出安全整数范围 ±(253-1)会出现精度问题,因为并非所有数字都适合固定的 64 位存储。因此,可能存储的是“近似值”。
// 尾部的 "n" 表示这是一个 BigInt 类型
const bigInt = 1234567890123456789012345678901234567890n;
String 类型
三种包含字符串的方式:
-
双引号:"Hello"
-
单引号:'Hello'
-
反引号:`Hello`
反引号是 功能扩展 引号,称为模板字符串。
它允许我们通过将变量和表达式包装在
${…}
中,来将它们嵌入到字符串中,并且可以在里面直接换行。
-
Js 中的字符串使用的是 UTF-16 编码。
-
Js 中字符串不可以被改变
-
length
属性表示字符串长度 -
可以使用像
\n
这样的特殊字符或通过使用\u...
来操作它们的 Unicode 进行字符插入。其中
\uxxxx
是字符的Unicode表示法,这种表示法只限于码点在\u0000
~\uFFFF
之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。"\uD842\uDFB7" // " 标签:ES6,01,函数,JavaScript,alert,调用,let,字符串,属性 From: https://www.cnblogs.com/Kiiakia/p/17566927.html