- A+
语法规范
JavaScript严格区分大小写,对空格、换行、缩进不敏感,建议语句结束加‘;’
JavaScript 会忽略多个空格。您可以向脚本添加空格,以增强可读性。
JavaScript 程序员倾向于使用以小写字母开头的驼峰大小写
firstName, lastName, masterCard, interCity
在运算符旁边( = + - * / )添加空格是个好习惯
JavaScript异步加载:
引入js代码时(引入外链/内嵌),页面的下载和渲染都会暂停,等待脚本执行完后才执行,页面加载脚本文件会阻塞其他资源下载。对于外链式,对不需要提前执行的代码,将引入放在< body>标签底部。
HTML5新增两个可选属性:async,defer
async:用于异步加载,先下载文件,不阻塞其他代码执行,下载完成后再执行。
<script src='...' async></script>
defer:用于延后执行,即先下载文件,直到网页加载完成后再执行
<script src='...' defer></script>
eval() 的参数是一个字符串。
如果字符串表示的是表达式,eval() 会对表达式进行求值。如果参数表示一个或多个 JavaScript 语句,那么eval() 就会执行这些语句。不需要用 eval() 来执行一个算术表达式:因为 JavaScript 可以自动为算术表达式求值。返回字符串中代码的返回值。如果返回值为空,则返回 undefined。
如果你以字符串的形式构造了算术表达式,那么可以在后面用 eval()对它求值。例如,假设你有一个变量 x,您可以通过将表达式的字符串值(例如 3 * x + 2)赋值给一个变量,然后在你的代码后面的其他地方调用 eval(),来推迟涉及 x 的表达式的求值。
如果 eval() 的参数不是字符串, eval() 会将参数原封不动地返回。在下面的例子中,String 构造器被指定,而 eval() 返回了 String 对象而不是执行字符串。
eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象
eval("2 + 2"); // returns 4
外部 JavaScript 的优势
在外部文件中放置脚本有如下优势:
分离了 HTML 和代码
使 HTML 和 JavaScript 更易于阅读和维护
已缓存的 JavaScript 文件可加速页面加载
如需向一张页面添加多个外部脚本文件 - 请使用多个 script 标签
JavaScript的位置
<head> 或 <body> 中的 JavaScript 您能够在 HTML 文档中放置任意数量的脚本。
脚本可被放置与 HTML 页面的 <body>
或 <head>
部分中,或兼而有之。
把脚本置于 <body>
元素的底部,可改善显示速度,因为脚本编译会拖慢显示。
HTML路径
路径 | 描述 |
---|---|
<img src="picture.jpg" alt="JavaScript基础复盘补缺"> |
picture.jpg 位于与当前网页相同的文件夹 |
<img src="images/picture.jpg" alt="JavaScript基础复盘补缺"> |
picture.jpg 位于当前文件夹的 images 文件夹中 |
<img src="/images/picture.jpg" alt="JavaScript基础复盘补缺"> |
picture.jpg 当前站点根目录的 images 文件夹中 |
<img src="../picture.jpg" alt="JavaScript基础复盘补缺"> |
picture.jpg 位于当前文件夹的上一级文件夹中 |
文件路径描述了网站文件夹结构中某个文件的位置。文件路径会在链接外部文件时被用到。
绝对文件路径是指向一个因特网文件的完整 URL,相对路径指向了相对于当前页面的文件。
JavaScript 显示方案
JavaScript 能够以不同方式“显示”数据: | 描述 | 补充 |
---|---|---|
使用 document.write() 写入 HTML 输出 | 出于测试目的,使用 document.write() 比较方便。 输出内容位置与script标签插入的位置有关、 document.write() 方法仅用于测试。 |
在 HTML 文档完全加载后使用 document.write() 将删除所有已有的 HTML |
使用 innerHTML 写入 HTML 元素 | innerHTML 属性定义 HTML 内容 | |
使用 console.log() 写入浏览器控制台 | 在浏览器中,您可使用 console.log() 方法来显示数据。 | |
使用 window.alert() 写入警告框 | 用警告框来显示数据,打开页面弹出警告框 |
JavaScript 关键词
语句常常通过某个关键词来标识需要执行的 JavaScript 动作。
下面的表格列出了一部分将在教程中学到的关键词:
关键词 | 描述 |
---|---|
break | 终止 switch 或循环。 |
continue | 跳出循环并在顶端开始。 |
debugger | 停止执行 JavaScript,并调用调试函数(如果可用)。 |
return | 退出函数 |
try ... catch | 对语句块实现错误处理。 |
var | var 关键词告知浏览器创建新的变量 |
JavaScript 值
JavaScript 语句定义两种类型的值:混合值和变量值。
混合值被称为字面量(literal)。变量值被称为变量。
字符串是文本,由双引号或单引号包围,加了引号的就是文本包括数字
使用变量不要加”“
文本:"你好","12", 数字:12
JavaScript 变量
在编程语言中,变量用于存储数据值。
JavaScript 使用 var 关键词来声明变量。
= 号用于为变量赋值
var a = "hello" var b =17
JavaScript 标识符
所有 JavaScript 变量必须以唯一的名称的标识。这些唯一的名称称为标识符。
标识符可以是短名称(比如 x 和 y),或者更具描述性的名称(age、sum、totalVolume)。
构造变量名称(唯一标识符)的通用规则是:
名称可包含字母、数字、下划线和美元符号
名称必须以字母开头
名称也可以 $ 和 _ 开头(但是在本教程中我们不会这么做)
名称对大小写敏感(y 和 Y 是不同的变量)
保留字(比如 JavaScript 的关键词)无法用作变量名称
提示:JavaScript 标识符对大小写敏感
声明变量
var a;//声明变量,不赋值的话,a=undefined a=10;//给变量赋值 /*一条语句,多个变量 您可以在一条语句中声明许多变量。 声明可横跨多行*/ var person = "Bill Gates", carName = "porsche", price = 15000; 以 var 作为语句的开头,并以逗号分隔变量
JavaScript 表达式
表达式是值、变量和运算符的组合,结果为值(数字,字符串),也可以包含变量
12 + 29 a*2 "Allerge" + "Xia"
注释
//单行注释
/* 多行注释 被称为注释块 */
应用:解释代码;阻止代码执行
使用单行注释最为常见。
提示:注释块常用于官方声明。
JavaScript作用域
ES2015前只有全局和函数(局部)
ES2015之后有全局、函数、块级作用域
作用域 | 描述 | 应用 |
---|---|---|
全局作用域 | 全局 (在函数之外)声明的变量拥有 全局作用域 。 | 全局变量可以在 JavaScript 程序中的任何位置访问 |
函数作用域 | 局部 (函数内)声明的变量拥有函数作用域 | 局部变量只能访问函数内部的变量 |
块级作用域 | 在块{} 内声明的变量无法从块外访问 | 函数、循环的{} |
var carName = "porsche"; // 此处的代码可以使用 carName function myFunction() { // 此处的代码也可以使用 carName var busName = "finghter" //此处可以使用busName } //此处不可以使用busName
var | let | const | 补充 |
---|---|---|---|
声明的变量没有块作用域 | 声明拥有块作用域的变量 | 通过 const 定义的变量与 let 变量类似,但不能重新赋值 | |
在块{} 内声明的变量可以从块之外进行访问 | 在块{} 内声明的变量无法从块外访问 | const 变量必须在声明时赋值 | |
使用var关键词在块中重新声明变量 将重新声明块外的变量 |
使用let关键词在块中重新声明变量 不会重新声明块外的变量 |
const定义的不是常数,定义了对值的常量引用 我们不能更改常量原始值, 但我们可以更改常量对象的属性,可以更改常量数组的元素 |
|
通过 var 关键词定义的全局变量属于 window 对象 | 通过 let关键词定义的全局变量不属于 window 对象, 不能通过window.let声明的变量 |
||
允许在程序的任何位置使用 var重新声明 | 在相同的作用域,或在相同的块中, 通过 let 重新声明一个 var 变量是不允许的 在不同的作用域或块中,通过 let 重新声明变量是允许的 |
在同一作用域或块中,不允许将已有的 var 或 let或const 变量 重新声明或重新赋值给 const 在另外的作用域或块中重新声明 const 是允许的 |
在相同的作用域,或在相同的块中,通过 var 重新声明一个 let 变量是不允许的 |
通过 var 声明的变量会提升到顶端, 可以在声明前使用变量 |
通过 let 定义的变量不会被提升到顶端。 在声明 let 变量之前就使用它会导致 ReferenceError。 变量从块的开头一直处于“暂时死区”,直到声明为止 |
通过const定义的变量不会被提升到顶端, const变量不能在声明之前使用 |
通过 const
定义的变量不会被提升到顶端。
const
变量不能在声明之前使用
重新声明变量
使用 var 关键字重新声明变量会带来问题。
使用 let 关键字重新声明变量可以解决这个问题。
在块中重新声明变量不会重新声明块外的变量
var x = 10; // 此处 x 为 10 { let x = 6; // 此处 x 为 6 } // 此处 x 为 10
var x = 10; // 此处 x 为 10 { var x = 6; // 此处 x 为 6 } // 此处 x 为 6
如果在块外声明声明,那么 var 和 let 也很相似。它们都拥有全局作用域
在函数内声明变量时,使用 var 和 let 很相似。它们都有函数作用域
幂运算符
取幂运算符(**)将第一个操作数提升到第二个操作数的幂
var x = 5; var z = x ** 2; // 结果是 25
x ** y 产生的结果与 Math.pow(x,y) 相同:
var x = 5; var z = Math.pow(x,2); // 结果是 25
JavaScript 从左向右计算表达式。不同的次序会产生不同的结果
var x = 911 + 7 + "Porsche";//918Porsche
var x = "Porsche" + 911 + 7;//Porsche9117
Undefined 与 Null 的区别
Undefined
与 null
的值相等,但类型不相等:
typeof undefined // undefined typeof null // object null === undefined // false null == undefined // true
空值
空值与 undefined
不是一回事。
空的字符串变量既有值也有类型。
var car = ""; // 值是 "",类型是 "string"
typeof 运算符
您可使用 JavaScript 的 typeof
来确定 JavaScript 变量的类型:
typeof 运算符返回变量或表达式的类型
原始数据值是一种没有额外属性和方法的单一简单数据值。
typeof
运算符可返回以下原始类型之一:
- string
- number
- boolean
- undefined
复杂数据
typeof
运算符可返回以下两种类型之一:
- function
- object
typeof
运算符把对象、数组或 null
返回 object
。
typeof
运算符不会把函数返回 object
JavaScript 函数
JavaScript 函数是被设计为执行特定任务的代码块。
JavaScript 函数会在某代码调用它时被执行。
函数只要定义一次代码,就可以多次使用,多次向同一函数传递不同参数得到不同的结果
function name(参数 1, 参数 2, 参数 3) { 要执行的代码 }
ECMAScript 的函数Function对象( 类)实际上是功能完整的对象
使用Function对象( 类)可以表示开发者定义的任何函数
var function_name = new Function(arg1, arg2, ..., argN, function_body)
前面是参数,最后是函数逻辑主体
函数名只是指向函数对象的引用值
尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。
函数属于引用类型,所以它们也有属性和方法。
length属性,属性 length 只是为查看默认情况下预期的参数个数提供了一种简便方式。
与所有对象共享的 valueOf() 方法和 toString() 方法,返回的都是函数的源代码
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //输出 "1" alert(sayHi.length);//输出"0" document.write(sayHi.toString());//function sayHi(){alert("Hi");}
函数调用
用( )调用函数,没有()的函数返回的是定义的函数
函数中的代码将在其他代码调用该函数时执行:
- 当事件发生时(当用户点击按钮时)
- 当 JavaScript 代码调用时
- 自动的(自调用)
函数返回
当 JavaScript 到达 return
语句,函数将停止执行。
函数在执行过 return 语句后立即停止代码。因此,return 语句后的代码都不会被执行。
如果函数被某条语句调用,JavaScript 将在调用语句之后“返回”执行代码。
函数通常会计算出 返回值 。这个返回值会返回给调用者:
function myFunction(a, b) { return a * b; // 函数返回 a 和 b 的乘积 } document.getElementById("demo").innerHTML = myFunction; //没有(),function myFunction(a, b) { return a * b; // 函数返回 a 和 b 的乘积 } document.getElementById("de").innerHTML = myFunction(1,2); //有(),2
局部变量
在 JavaScript 函数中声明的变量,会成为函数的 局部变量 。
局部变量只能在函数内访问。
由于局部变量只能被其函数识别,因此可以在不同函数中使用相同名称的变量。
局部变量在函数开始时创建,在函数完成时被删除
arguments 对象
在函数代码中,使用特殊对象 arguments,开发者 无需明确指出参数名 ,就能访问它们。arguments中包含所以参数
应用:
arguments[0],伪数组中索引号为0的元素
arguments.length,检测函数的参数个数
模拟函数重载
用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载,即通过arguments.length判断个数,arguments[?]对不同位置的参数以另种进行重新加载
function doAdd() { if(arguments.length == 1) { alert(arguments[0] + 5); } else if(arguments.length == 2) { alert(arguments[0] + arguments[1]); } } doAdd(10); //输出 "15" doAdd(40, 20); //输出 "60"
闭包
函数可以使用函数之外定义的变量
简单闭包
var sMessage = "hello world"; function sayHelloWorld() { alert(sMessage);//执行函数时使用全局变量 } sayHelloWorld();
复杂闭包
在一个函数中定义另一个函数会使闭包变得更加复杂
var iBaseNum = 10; function addNum(iNum1, iNum2) { //addNum输入两个参数iNum1,iNum2 function doAdd() { //doAdd函数无输入参数 return iNum1 + iNum2 + iBaseNum; } return doAdd(); }
函数 addNum() 包括函数 doAdd() (闭包)。
内部函数是一个闭包,它将获取外部函数的参数 iNum1 和 iNum2 以及全局变量 iBaseNum 的值。
addNum() 的最后一步调用了 doAdd(),把两个参数和全局变量相加,并返回它们的和。
这里要掌握的重要概念是,doAdd() 函数根本不接受参数,它使用的值是从执行环境中获取的。
闭包是 ECMAScript 中非常强大多用的一部分,可用于执行复杂的计算。
对象
对象包含属性和方法,以键值对的形式来书写
var obj ={ name:"xiatian", skill:function(){//方法是作为属性来存储的函数 var rate =18; return rate; } }
访问对象属性的两种方式:
obj.name
obj['name']