0X00: 起因
首先阐述下本人学javascript的初衷,本人目前从事安全行业,目前能挖掘些基础的XSS漏洞,但是想深入理解XSS,需有javascript基础,例如理解DOM型XSS等,于是就有了这么一出,下面就是记录自己的学习笔记。
javascript是一门简单的语言,也是一门复杂的语言。说它简单,是因为学会使用它只需片刻功夫;而说它复杂,是因为要真正掌握它则需要数年时间。实际上,前端工程师很大程度上就是指javascript工程师。前端入门容易精通难,说的是前端,更指的是javascript。本文是javascript基础语法的第一篇——词法结构。词法结构是一套基础性规则,用来描述如何使用javascript来编写程序
0X01: 与java关系
关于javascript有这样一个说法,java和javascript的关系是雷锋和雷锋塔的关系。那到底有没有关系呢
javascript最开始的名字是LiveScript,后来选择javascript作为其正式名称的原因,大概是想让它听起来有系出名门的感觉。除了语法看起来和java类似之外,javascript和java是完全不同的两种编程语言
程序设计语言分为解释型和编译型两大类。java或C++等语言需要一个编译器。编译器是一种程序,能够把用java等高级语言编写出来的源代码翻译为直接在计算机上执行的文件。解释型程序设计语言不需要编译器——它们仅需要解释器,浏览器中的javascript解释器将直接读入源代码并执行
java在理论上几乎可以部署在任何环境,但javascript却倾向于只应用在web浏览器。而且,在javascript语言中,函数是一种独立的数据类型,采用基于原型对象(prototype)的继承链,javascript语法要比Java自由得多
基本上,JavaScript这个名字的原意是“很像Java的脚本语言”
定义
javascript是一门动态的、弱类型的解释型编程语言,非常适合面向对象和函数式的编程风格。javascript的语法源自java,它的一等函数来自scheme,它的基于原型的继承来自self
javascript用来增强页面动态效果,实现页面与用户之间的实时、动态交互
javascript由三部分组成:ECMAScript、DOM和BOM
[1]ECMAScript由ECMA-262定义,提供核心语言功能(ECMA是欧洲计算机制造商协会)
[2]DOM(Document Object Model)文档对象模型,提供访问和操作网页内容的方法和接口
[3]BOM(Browser Object Model)浏览器对象模型,提供与浏览器交互的方法和接口
0x02:大小写敏感
关于javascript这门语言,再怎么强调都不为过的特性是大小写敏感。javascript中的关键字、变量、函数名和所有的标识符都必须采取一致的大小写形式
`//'online'、'Online'、'OnLine'、'ONLINE'是四个不同的变量名`
[注意]HTML并不区分大小写(尽管XHTML区分大小写)。许多客户端javascript对象和属性与它们表示的HTML标签和属性同名。在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中则必须是小写。例如,在HTML中设置事件处理程序时,onclick属性可以写成onClick,但在javascript代码中,必须使用小写的onclick
0x03:保留字(ReservedWord)
和其他任何编程语言一样,javascript保留了一些标识符为自己所用。这些保留字不能用做普通的标识符。由于好多参考书的误导,貌似保留字和关键字是分开的,其实并不是,关键字只是保留字的一部分。保留字包括关键字、未来保留字、空字面量和布尔值字面量
保留字
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral`
**
关键字**
break do instanceof typeof
case else new var
catch finally return void
continue for switch while
debugger function this with
default if throw delete
in try
**未来保留字**
下列词被用作建议扩展关键字,因此保留,以便未来可能采用这些扩展
class enum extends super
const export import
**ECMAScript3版本**
以上是ECMAScript5的保留字,但在ECMAScript3版本中的保留字并不一样,若希望代码能在基于ECMAScript3实现的解释器上运行的话,应该避免使用以下保留字作为标识符
abstract boolean byte char class constdouble enum export extends final float
goto implements import int interfacelong native package private protected
public short static super synchronized throw transient volatile
# 0x04:预定义变量和函数
javascript预定义了很多全局变量和函数,应该避免把它们的名字用做标识符名
`arguments Array Boolean Date decodeURI decodeURIComponent encodeURI
encodeURIComponent Error eval EvalError Function Infinity isFinite
isNaN JSON Math NaN Number Object parseFloat parseInt RangeErro
ReferenceError RegExp String SyntaxError TypeError undefined URIError`
# 0x05:注释(Comment)
不是所有语句都需要javascript解释器去解释并执行。有时需要在脚本中写一些仅供自己参考或提醒自己的信息,并希望javascript解释器能直接忽略掉这些信息,这类信息就是注释
注释能有效帮助了解代码流程,在代码中它们扮演生活中便条的角色,可以帮助我们弄清楚脚本到底干了什么
[注意]注释一定要精确地描述代码,没有用的注释比没有注释还要糟糕
有多种方式可以在javascript脚本中插入注释,包括单行注释、多行注释和HTML风格的注释
【1】单行注释以两个斜杠开头``
//单行注释
【2】多行注释又叫块级注释,以一个斜杠和一个星号/*开头,以一个星号和一个斜杠*/结尾
/这是一个多行注释/
[注意]块级注释/**/可以跨行书写,但不能嵌套,否则会报错
//报错
/注释1
/
注释1.1
//
[注意]块级注释/**/中的那些字符也可能出现在正则表达式字面量里,所以块级注释对于被注释的代码块来说是不安全的
/*
var rm_a = /a*/.match(s);
*/
【3】HTML风格的注释仅仅适用于单行注释,其实javascript解释器对来结束注释
``
但javascript不要求这么做,它会把-->视为注释内容的一部分
[注意]HTML允许上面这样的注释跨越多行,但这种注释的每行都必须在开头加上"