JavaScript基础复盘补缺

  • JavaScript基础复盘补缺已关闭评论
  • 194 次浏览
  • A+
所属分类:Web前端
摘要

JavaScript严格区分大小写,对空格、换行、缩进不敏感,建议语句结束加‘;’
JavaScript 会忽略多个空格。您可以向脚本添加空格,以增强可读性。
JavaScript 程序员倾向于使用以小写字母开头的驼峰大小写
firstName, lastName, masterCard, interCity
在运算符旁边( = + – * / )添加空格是个好习惯


语法规范

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 的区别

Undefinednull 的值相等,但类型不相等:

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']