JavaScript 基础入门
JavaScript 基础入门
JavaScript 的组成
JS 由三部分组成,它们分别是:ECMAScript、DOM、BOM.
ECMAScript
因为网景开发了JavaScript,一年后微软又模仿JavaScript开发了JScript,为了让JavaScript成为全球标准,几个公司联合ECMA(European Computer Manufacturers Association)组织定制了JavaScript语言的标准,被称为ECMAScript标准。
DOM
文档对象模型(Document Object Model)。DOM把整个页面映射成一个多层节点结构。HTML 页面组成都是某种类型的节点,这些及节点又包含着不同类型的数据。
BOM
浏览器对象模型(Browser Object Model)。可以访问浏览器窗口的 BOM,对浏览器窗口进行操作。
ECMAScript、DOM、BOM 之间的关系
ECMAScript 是用来操作平台或者运行平台上页面的工具,它构成了 JS 核心的语法基础。
DOM 是运行在平台上的页面,用来操作网页中的元素。
BOM 是运行平台,BOM 的规则(语法)是建立在 ECMAScript 的规则之上,用来操作浏览器上的对象。
JavaScript 和 ECMAScript 规范
JavaScript 的标准化组织是 ECMA ——这个欧洲信息与通信系统标准化协会提供基于 Javascript 的标准化方案(ECMA 原先是欧洲计算机制造商协会的首字母缩写)。这种标准化版本的 JavaScript 被称作 ECMAScript,在所有支持该标准的应用中以相同的方式工作。公司可以使用开放标准语言来开发他们自己的 JavaScript 实现版本。ECMAScript 标准在ECMA-262规范中进行文档化。
ECMA-262 标准也通过了 国际标准化组织(ISO)的 ISO-16262。你可以在这里找到该规范文件。 ECMAScript 规范并没有描述文档对象模型(DOM),该模型由 万维网联盟(W3C) 制定。DOM 定义了HTML文件对象被脚本操作的方法。
JavaScript 文献 和 ECMAScript 规范
ECMAScript 规范是实现 ECMAScript 的一组需求;如果你想在 ECMAScript 实现或引擎(如Firefox 中的 SpiderMonkey 或 Chrome 中的 V8)中实现符合标准的语言特性,那么它是非常有用的。
ECMAScript 文档不是用来帮助脚本程序员的;使用 JavaScript 文档获取关于编写脚本的信息。
ECMAScript 规范使用了 JavaScript 程序员可能不熟悉的术语和语法。尽管 ECMAScript 中对语言的描述可能有所不同,但语言本身保持不变。JavaScript 支持 ECMAScript 规范中列出的所有功能。
JavaScript 文档描述了适合 JavaScript 程序员的语言方面。
JavaScript 代码位置
内部 JavaScript
1 <script> 2 // 在此编写 JavaScript 代码 3 </script>
内部 JavaScript 通常写在 </body> 后面;或者<body></body>里面;再或者写在<head></head>中,比如:
1 <head> 2 window.onload = function () { 3 // 在此编写 JavaScript 代码 4 } 5 </head>
推荐将 JS 代码写在</body>后面或者<head>标签中。因为如果将 JS 代码写在<body>中,那么当浏览器加载时,会按照从上到下的顺序解析代码,加载完 JS 代码时,HTML 还没有载入,会破坏页面的渲染效果,JS 代码无法实现与 HTML 的交互行为。
外部 JavaScript
将外部的 JS 文件引入当前页面,类似于引入外部 CSS 文件,代码如下:
1 <script src="script.js"></script>
这种方式是最好的,优点如下:
1. 可维护性:遍及不同 HTML 页面的 JavaScript 会造成维护问题,但把所有 JS 文件都放在一个文件夹中维护起来就轻松多了。而且开发人员因为也能够在不触及 HTML 标记的情况下集中精力编写 JS 代码
2. 可缓存:浏览器能够根据具体的设置缓存链接的所有外部 JS 文件,也就是说,如果有2个页面都使用同一个文件,那么这个文件只需下载一次。因此,最终结果就是能够加快页面加载速度。
3. 适应未来:通过外部文件包含 JS 无需使用 XHTML 或 hack 注释。HTML 和 XHTML 包含外部文件的语法是相同的。
内联 JavaScript 处理器
示例:
1 <button onclick="createParagraph()">点我呀</button>
强烈不推荐这样编写 JS 代码,这将使 JavaScript 污染到 HTML,而且效率低下。
这三者中,一般在练习中使用内部 JavaScript,实际开发中使用 外部 JavaScript,几乎不使用 内联 JavaScript 处理器。
JavaScript 中的大小写
JS 是区分大小写的,并使用 Unicode 字符集。如:
var a = 10; var A = 11; console.log(a); console.log(A); /* 结果为 10 11 由此可见,a 和 A 并不是同一个变量 */
JavaScript 中的注释
就像 HTML 和 CSS,JavaScript 代码中也可以添加注释,浏览器会忽略它们,注释只是为你的同事(还有你,如果半年后再看自己写的代码你会说,这是什么垃圾玩意。)提供关于代码如何工作的指引。注释非常有用,而且应该经常使用,尤其在大型应用中。注释分为两类:
在双斜杠后添加单行注释,比如:
// 啦啦啦,我是注释~~~
在 /* 和 */ 之间添加多行注释,比如:
/* 多行注释1 多行注释2 多行注释3 */
JavaScript 代码执行顺序
当浏览器执行到一段 JS 代码时,通常会按照 从上到下,从左往右 的顺序执行代码。比如:
1 var a = 10; 2 var b = 11; 3 console.log(a); 4 console.log(b); 5 console.log(a + b); 7 /* 8 控制台显示的结果为: 9 10 10 11 11 21 12 */
JavaScript 语句
JS 当中的语句表示 JS 向宿主环境发送的命令。
例如下面的语句是向控制台中输出计算 10 + 2 的结果。
console.log(10 + 2); // 在每一条语句的后面都带有一个分号,表示语句结束
当然 JS 允许我们将分号省掉,但是无论是从代码的维护成本还是其他因素考虑,都不建议将每条语句后面的分号省略掉。
需要注意的是,如果分号前面的语句为空,则没有意义。
JavaScript 的输出方式
两种输出方式
// 第一种 console.log(); // 第二种 document.write();
console.log(); 是将数据输出到浏览器的控制台中,一般用来调试 JS 代码
document.write(): 是将数据输出到网页的页面中,此方式可以直接解析标签。如:
document.write(<strong>内容</strong>);
我们通常将 console.log(); 这种输出代码的形式称之为 代码打印
并且,我们一般使用 console.log(); 来打印数据 而不是 document.write(); ,因为后者会影响页面布局,某些情况下,后者甚至会覆盖页面。
JavaScript 中的表达式
一般情况下,表达式需要得到一个结果
例如 11 + 3 就是一个表达式,我们在创建这个表达式的时候,就希望得到 11 + 3 的结果
console.log(11 + 3); // 将 11 + 3 的结果 打印到浏览器的控制台中
JavaScript 的弹窗
JS 中的弹窗有三种方式,它们分别是:
// 第一种,警告对话框,只有确认键 alert(); // 没有返回值,返回 undefined; 不同的浏览器,显示不同 // 第二种,模态对话框(确认框),有确认件和取消键 confirm(); // 返回 Boolean 类型:true、false 表示选择确定还是取消 // 第三种,对话框,对话框中包含一条文字信息,用来提示用户输入文字,有确认键和取消键以及输入框 prompt(); // 如果文本输入框中为空,则返回一个空字符串,如果用户点击"取消"按钮,则返回null
注意事项:
alert 对话框使用在无需用户确认的情况下,否则应该使用其他类型的对话框
confirm 对话框是弹出式,直到这个对话框被点击后, 后面的脚本才会运行. 请勿滥用此功能
prompt 和 alert 以及类似的对话框都是模态窗口,它们会阻止用户激活程序其他部分的界面,直到该对话框关闭。因此,你不应该过度使用该方法。
查找并解决 JavaScript 代码的错误
错误类型
一般来说,代码错误主要分为两种:
语法错误:代码中存在拼写错误,将导致程序完全或部分不能运行,通常你会收到一些出错信息。只要熟悉语言并了解出错信息的含义,你就能够顺利修复它们。
逻辑错误:有些代码语法虽正确,但执行结果和预期相悖,这里便存在着逻辑错误。这意味着程序虽能运行,但会给出错误的结果。由于一般你不会收到来自这些错误的提示,它们通常比语法错误更难修复。
解决 BUG 的方法
以下是几种常见的 bug 形式
有报错
当在控制台中看到报错信息时,我们要观看它报的什么错,一般来说,我们可以很直观的看到报错信息。如:
Cannot set property \'onclick\' of null // 不是onc1ick为nu11,是onclick不能加给nu1l xxx is not defined // xxx 未定义
有报错但是代码没有问题
解决方法:反向查找
发生这种情况时,我们要观看报错信息,如果在报错信息中没有找到来源,我们要根据报错的变量,向上逐步查找来源,如果没有找到,那就继续向上查找。
没有报错,没有结果
解决方法:反向查找
解决方法:
解决 bug 的通用方式
使用 console.log(“1”);
将 console.log(“1”); 逐行使用,哪行代码打印不出来,哪行就出现了问题(最好的方式是,将 “1” 换位当前测试行的变量名,同时,变量名不要手写,而是将当前变量名 copy 一下)
定位 bug 信息的工具(工具帮助找到定位 bug 的信息)
打断点:让浏览器逐行执行代码
1. 使用 JS 提供的关键字:debugger (debugger要配合控制台使用)
2. 使用浏览器提供的控制台 sources,在 sources 选项中找到要需要断点的文件,点击要进行断点的行号,之后一步步执行。
以下有几种常见的错误类型
SyntaxError: missing ; before statement (语法错误:语句缺少分号)
这个错误通常意味着你漏写了一行代码最后的分号,但是此类错误有时候会更加隐蔽。例如如果我们把 checkGuess() 函数中的这一行 :
let userGuess = Number(guessField.value); // 改成 let userGuess === Number(guessField.value);
将抛出一个错误。因为系统认为你在做其他事情。请不要把赋值运算符(=
,为一个变量赋值)和严格等于运算符(===
,比较两个值是否相等,返回 true/false)弄混淆。
SyntaxError: missing) after argument list (语法错误:参数表末尾缺少括号)
顾名思义:此错误通常意味着 函数 or 方法 调用或的结束括号忘写了。
SyntaxError: missing: after property id (语法错误:属性 ID 后缺少冒号)
JS 对象的形式有错时通常会导致此类错误,如:
function checkGuess() { //写成了 function checkGuess( {
浏览器会认为我们试图将函数的内容当作参数传回函数。写圆括号时要小心!
SyntaxError: missing} after function body (语法错误:函数末尾缺少花括号)
通常意味着函数或条件结构中丢失了一个花括号。如果我们将 checkGuess() 函数末尾的花括号删除,就会得到这个错误。
SyntaxError: expected expression, got\’string\’ (语法错误:得到一个 \’string\’ 而非表达式)
↑↑↑↑↑↑ 或者 ↓↓↓↓↓↓
SyntaxError: unterminated string literal (语法错误:字符串字面量未正常结束)
这个错误通常意味着字符串两端的引号漏写了一个。如果你漏写了字符串开始的引号,将得到第一条出错信息,这里的 \’string\’ 将被替换为浏览器发现的意外字符。如果漏写了末尾的引号将得到第二条。
Notes: 错误出现时,转到错误所在的行观察是否能发现问题所在。记住,错误不一定在那一行,甚至可能是由某个不相关的问题造成的!