1910 字
10 分钟
JavaScript指南1——Js学习笔记02

JavaScript 指南#

JavaScript 和 Java#

JavaScript 的对象模型是基于原型的,而不是基于更常见的类。基于原型的模型提供了动态继承;也就是说,每个对象继承的内容可以不同。JavaScript 支持不需要特殊声明要求的函数。函数也可以作为对象的属性被当做松散类型的方法执行。 Java 是基于类的编程语言,设计的初衷就是为了确保快速执行和类型安全。类型安全,举个例子,你不能将一个 Java 整数变量转化为一个对象引用,或者通过破坏 Java 字节码访问私有内存。Java 基于类的模型,意味着程序包含专有的类及其方法。Java 的类继承和强类型通常要求紧耦合的对象层级。这些要求使得 Java 编程比 JavaScript 编程要复杂的多。 相比之下,JavaScript 传承了 HyperTalk 和 dBASE 语句精简、动态类型等精髓。这些脚本语言由于其更简单的语法、专门的内置功能以及对象创建的最小要求,为更广泛的受众提供了编程工具。

JavaScriptJava
面向对象。不区分对象类型。继承通过原型机制实现,可以向对象动态地添加属性和方法。基于类。对象分为类和实例,所有的继承通过类层级实现。不能向类和实例动态地添加属性或方法。
不需要声明变量数据类型(动态类型,松散类型)。必须声明变量数据类型(静态类型,强类型)。
不能自动写入硬盘可以自动写入硬盘

严格模式#

ECMAScript 5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,从而使代码隐式地脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。严格模式不仅仅是一个子集:它的产生是为了形成与正常代码不同的语义。不支持严格模式与支持严格模式的浏览器在执行严格模式代码时会采用不同行为。所以在没有对运行环境展开特性测试来验证对于严格模式相关方面支持的情况下,就算采用了严格模式也不一定会取得预期效果。严格模式代码和非严格模式代码可以共存,因此项目脚本可以渐进式地采用严格模式。严格模式对正常的 JavaScript 语义做了一些更改。

严格模式中的变化#

严格模式同时改变了语法及运行时行为。变化通常分为这几类:将问题直接转化为错误(如语法错误或运行时错误),简化了如何为给定名称的特定变量计算,简化了 eval 以及 arguments,将写“安全”JavaScript 的步骤变得更简单,以及改变了预测未来 ECMAScript 行为的方式。

将过失错误转成异常#

在严格模式下,某些先前被接受的过失错误将会被认为是异常。JavaScript 被设计为能使新人开发者更易于上手,所以有时候会给本来错误操作赋予新的不报错误的语义(non-error semantics)。有时候这可以解决当前的问题,但有时候却会给以后留下更大的问题。严格模式则把这些失误当成错误,以便可以发现并立即将其改正。

给未声明的变量赋值#

严格模式下无法再意外创建全局变量。在非严格模式下,在赋值中错误拼写的变量会在全局对象上创建一个新属性并继续“工作”。在严格模式下,意外创建全局变量的赋值会抛出错误

给对象属性赋值会失败#

第二,严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操作抛出异常。例如,NaN 是一个不可写的全局变量。在正常模式下,给 NaN 赋值不会产生任何作用; 开发者也不会受到任何错误反馈。但在严格模式下,给 NaN 赋值会抛出一个异常。任何在正常模式下引起静默失败的赋值操作(给不可写属性赋值,给只读属性(getter-only)赋值,给不可扩展对象的新属性赋值)都会抛出异常:

第三,在严格模式下,试图删除不可删除的属性时会抛出异常(之前这种操作不会产生任何效果)

第四,在 Gecko 版本 34 之前,严格模式要求一个对象内的所有属性名在对象内必须唯一。正常模式下重名属性是允许的,最后一个重名的属性决定其属性值。因为只有最后一个属性起作用,当代码要去改变属性值而不是修改最后一个重名属性的时候,复制这个对象就产生一连串的 bug。在严格模式下,重名属性被认为是语法错误

第五,严格模式要求函数的参数名唯一。在正常模式下,最后一个重名参数名会掩盖之前的重名参数。之前的参数仍然可以通过 arguments[i] 来访问,还不是完全无法访问。然而,这种隐藏毫无意义而且可能是意料之外的(比如它可能本来是打错了),所以在严格模式下重名参数被认为是语法错误

第六,严格模式禁止八进制数字语法。ECMAScript 并不包含八进制语法,但所有的浏览器都支持这种以零(0)开头的八进制语法:0644 === 420 还有 “\045” === ”%“。在 ECMAScript 6 中支持为一个数字加 0o 的前缀来表示八进制数。

第七,严格模式禁止设置原始值的属性。不采用严格模式,设置属性将会简单忽略(no-op),采用严格模式,将抛出 TypeError 错误

简化变量的使用#

严格模式简化了代码中变量名字映射到变量定义的方式。很多编译器的优化是依赖存储变量 X 位置的能力:这对全面优化 JavaScript 代码至关重要。JavaScript 有些情况会使得代码中名字到变量定义的基本映射只在运行时才产生。严格模式移除了大多数这种情况的发生,所以编译器可以更好的优化严格模式的代码。

第一,严格模式禁用 with。with 所引起的问题是块内的任何名称可以映射(map)到 with 传进来的对象的属性,也可以映射到包围这个块的作用域内的变量(甚至是全局变量),这一切都是在运行时决定的:在代码运行之前是无法得知的。严格模式下,使用 with 会引起语法错误,所以就不会存在 with 块内的变量在运行时才决定引用到哪里的情况了:

"use strict";
var x = 17;
with (obj) {
// !!! 语法错误
// 如果没有开启严格模式,with 中的这个 x 会指向 with 上面的那个 x,还是 obj.x?
// 如果不运行代码,我们无法知道,因此,这种代码让引擎无法进行优化,速度也就会变慢。
x;
}
JavaScript指南1——Js学习笔记02
https://mizuki.mysqil.com/posts/interview-javacript-02/
作者
FATFATHAO
发布于
2026-01-10
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00