本文系统梳理JavaScript基础知识,涵盖延迟与异步脚本加载、变量命名规范及作用域、基本与引用数据类型区别、类型强制转换机制,以及for...in循环与函数定义等核心概念,帮助初学者建立完整的语言认知框架。
JavaScript基础概述
基本概念
javascript是一门解释型的语言,浏览器充当解释器。
js执行引擎并不是一行一行的执行,而是一段一段的分析执行。
脚本加载机制:延迟与异步
延迟脚本
HTML4.0.1规范中引入了defer属性,旨在说明脚本执行时不应阻塞页面构建。这意味着脚本会被推迟到整个文档解析完成后才执行。在<script>标签中设置defer属性,指示浏览器立即下载脚本,但推迟执行时机。在XHTML文档中,需将defer属性设置为defer=“defer"。
异步脚本
html5标准中为<script>标签定义了async属性。该属性与defer类似,均用于调整脚本处理行为。与defer一样,async仅适用于外部脚本文件,并指示浏览器立即下载文件。然而,与defer不同,标记为async的脚本不保证按照声明顺序执行。
设置async属性的目的是避免页面等待脚本下载和执行,从而异步加载页面其他内容。因此,建议在异步脚本加载期间不要操作DOM。
语言基础:大小写敏感性与变量声明
区分大小写
在ECMASCript中,所有元素(包括变量、函数名和操作符)均严格区分大小写。
1. JScript 的变量
变量在首次使用时被存入内存,以便后续在脚本中引用。使用变量前必须先进行声明,可通过var关键字完成变量声明。
var count, amount, level; // 用单个 var 关键字声明的多个声明。
变量命名
变量名涵盖全局变量、局部变量、类变量及函数参数等类别,均属于此类范畴。
变量命名通常由类型前缀加有意义单词组成,采用驼峰式命名法以提升变量和函数的可读性。例如:sUserName,nCount。
前缀规范: 每个局部变量均需包含类型前缀,按类型分类如下:
s:表示字符串。例如:sName,sHtml;
n:表示数字。例如:nPage,nTotal;
b:表示逻辑。例如:bChecked,bHasLogin;
a:表示数组。例如:aList,aGroup;
r:表示正则表达式。例如:rDomain,rEmail;
f:表示函数。例如:fGetHtml,fInit;
o:表示以上未涉及到的其他对象,例如:oButton,oDate;
g:表示全局变量,例如:gUserName,gLoginTime;
JScript 是一种区分大小写的语言。创建合法变量名称需遵循以下规则:
注意第一个字符不能是数字。 后续字符可以是任意字母、数字或下划线,但不能包含空格。 变量名称绝不能是保留字。
javascript是一种弱类型语言,JavaScript 解释器会忽略多余的空格。您可以向脚本中添加空格以提高其可读性。
var是javascript的保留字,用于表明接下来是变量说明。变量名由用户自定义标识符构成,多个变量之间用逗号分隔。
如果声明了变量但未赋值,该变量存在,其值为Jscript中的undefined。
数据类型与类型转换
强制类型转换
在 Jscript 中,可以对不同类型的值执行运算,无需担心 JScript 解释器抛出异常。相反,JScript 解释器会自动将一种数据类型强制转换为另一种数据类型,然后执行运算。例如:
运算 结果
数值与字符串相加 将数值强制转换为字符串。
布尔值与字符串相加 将布尔值强制转换为字符串。
数值与布尔值相加 将布尔值强制转换为数值。
若要显式将字符串转换为整数,请使用 parseInt 方法。若要显式将字符串转换为数字,请使用 parseFloat 方法。
JavaScript 变量的生存期:当您在函数内部声明变量后,仅能在该函数中访问它。退出函数后,该变量将被撤销。此类变量称为本地变量。您可以在不同函数中使用名称相同的本地变量,因为仅声明过变量的函数能识别其中的每个变量。
如果您在函数外部声明变量,则页面上的所有函数均可访问该变量。这些变量的生存期从声明后开始,至页面关闭时结束。
js变量思维导图

2.js的数据类型
jscript 包含三种主要数据类型、两种复合数据类型和两种特殊数据类型。
主要(基本)数据类型
字符串数值布尔
复合(引用)数据类型
对象数组
特殊数据类型
Null`Undefined`
字符串数据类型:字符串数据类型用于表示 JScript 中的文本。在js中,虽然双引号("")和单引号('')均可表示字符串,且两者几乎无区别,但仅使用双引号("")表示字符串被视为最佳实践。
一个字符串值是由零个或多个 Unicode 字符(字母、数字和标点符号)排列组成的序列。
什么是Unicode?
Unicode为每个字符提供唯一的数值,无论平台、程序或语言如何。开发unicode旨在为处理全球所有字符提供统一编码标准。
数值数据类型
我们需要明确一点,JScript 内部将所有数值表示为浮点值,因此在 Jscript 中整数和浮点值没有区别。
Boolean数据类型
布尔(逻辑)类型仅有两个值:true 或 false。
js数组和对象
详情看我这篇文章->javascript学习总结— —数组和对象部分
Null 数据类型:可以通过给一个变量赋 null 值来清除变量的内容。
Jscript中 typeof 运算符将报告 null 值为 Object 类型,而非类型 null。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
<script type="text/javascript">
alert(typeof null);
</script>
</head>
<body>
</body>
</html>
null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。
Undefined 数据类型:
如下情况将返回 undefined 值:
对象属性不存在,声明了变量但从未赋值。
null和undefined的区别
alert(typeof undefined); //output "undefined"
alert(typeof null); //output "object"
alert(null == undefined); //output "true"
ECMAScript认为undefined是从null派生出来的,所以将它们定义为相等。
alert(null === undefined); //output "false"
alert(typeof null == typeof undefined); //output "false"
null与undefined的类型是不一样的,所以输出"false"。而===代表绝对等于,在这里null === undefined输出false

引用数据类型与内存管理
另外,这里介绍一种比较重要的数据类型——引用数据类型
引用数据类型
javascript引用数据类型是保存在堆内存中的对象,JavaScript不允许直接访问堆内存空间中的位置和操作堆内存空间,只能通过操作对象在栈内存中的引用地址。所以引用类型的数据,在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存在堆内存中的对象。
下面我们来演示这个引用数据类型赋值过程

自然,给obj2添加name属性,实际上是给堆内存中的对象添加了name属性,obj2和obj1在栈内存中保存的只是堆内存对象的引用地址,虽然也是拷贝了一份,但指向的对象却是同一个。故而改变obj2引起了obj1的改变。
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而引用类型值则是指那些保存在堆内存中的对象,即变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。
简而言之,堆内存存放引用值,栈内存存放固定类型值。

在 ECMAScript 中,变量可以存在两种类型的值,即原始值和引用值。
原始值存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。引用值存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
<script type="text/javascript”>
var box = new Object(); //创建一个引用类型
var box = "lee"; //基本类型值是字符串
box.age = 23; //基本类型值添加属性很怪异,因为只有对象才可以添加属性。
alert(box.age); //不是引用类型,无法输出;
</script>
运算符与流程控制
3.JScript 的运算符
优先级:指运算符的运算顺序,通俗地说就是先计算哪一部分。 结合性:同一优先级运算符的计算顺序,通俗地说就是从哪个方向算起,是左到右还是右到左。
数据类型转换
String() 转换为字符串类型 Number() 转换为数字类型 Boolean() 转换为布尔类型
parseInt:将字符串转换为整数。从字符串的开头开始解析,在第一个非整数的位置停止解析,并返回前面读到所有的整数。如果字符串不是以整数开头的,将返回NaN。如:parseInt(“150 hi”)返回的值是:150,parseInt("hi")返回的值是:NaN。
parseFloat:将字符串转换为浮点数。 从字符串的开头开始解析,在第一个非整数的位置停止解析,并返回前面读到所有的整数。如果字符串不是以整数开头的,将返回NaN。如:parseFloat("15.5 hi") 返回的值是:15.5,parseFloat("hi 15.5")返回的值是:NaN。
eval:将字符串作为javascript表达式进行计算,并返回执行结果,如果没有结果则返回undefined。

4.js流程控制
对于js流程控制语句,这里只讲几个比较难懂的。其他不赘述。等下附上一张思维导图。 1.for...in 语句对应于一个对象的每个,或一个数组的每个元素,执行一个或多个语句。
for (variable in [object | array])
statements
参数:
variable:必选项。一个变量,它可以是 object 的任一属性或 array 的任一元素。
object, array:可选项。要在其上遍历的对象或数组。
statement:可选项。相对于 object 的每个属性或 array 的每个元素,都要被执行的一个或多个语句。可以是复合语句。
虽然条件控制语句(如if语句)只在执行多条语句的情况下才要求使用代码块(左花括号"{"开头,右花括号"}"结尾),但最佳实践是始终使用代码块。
if(args)
alert(args);//容易出错
if(args){
alert(args);//推荐使用
}
js流程控制语句思维导图
函数定义与对象组成
5.js函数
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。
Jscript 支持两种函数:一类是语言内部的函数,另一类是自己创建的。
JavaScript 函数允许没有参数(但包含参数的小括号不能省略),也可以向函数传递参数供函数使用。
更多关于函数的知识请访问我的另一篇文章:javascript学习大总结(四)function函数部分
对象的组成
方法——函数:过程、动态的
属性——变量:状态、静态的
最后,再附上一张前辈总结的思维导图:
