要点
前言和基础语法
脚本语言:不具备编写操作系统的能力
JavaScript 也是一种嵌入式(embedded)语言。
变量就是给值起名
JavaScript引擎的工作方式是:先解释代码.在一行行执行.
var a; console.log(a); a = 1; // 结果是显示undefined 表示变量a 已声明但还未赋值标识符, JavaScript引擎遇到非法标识符就会报错
标识符命名规则如下。
第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号(
$)和下划线(_)。第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字
0-9。中文是合法的标识符,可以作为变量名
JavaScript 有一些保留字,不能用作标识符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
注释: 源码中被 JavaScript 引擎忽略的部分就叫做注释
- 单行注释:
// - 多行注释放到:
/*和*/之间
- 单行注释:
由于历史上 JavaScript 可以兼容 HTML 代码的注释,所以
<!--和-->也被视为合法的单行注释。需要注意的是,
-->只有在行首,才会被当成单行注释,否则会当作正常的运算。n --> 0`实际上会当作`n-- > 0
对于
var命令来说,JavaScript 的区块{}不构成单独的作用域(scope)。- 区块往往用来构成其他更复杂的语法结构,比如
for、if、while、function等。
- 区块往往用来构成其他更复杂的语法结构,比如
if 结构 是根据一个布尔值执行不同的语句, “布尔值”往往由一个条件表达式产生, 必须放在圆括号中,表示对表达式求值.
三元运算符:
(条件)? {表达式1}:{表达式2}条件为true ,执行表达式1 ,否则执行表达式2var msg = '数字' + n + '是' + (n % 2 === 0 ? '偶数' : '奇数');
for循环
for语句后面的括号里面,有三个表达式。- 初始化表达式(initialize):确定循环变量的初始值,只在循环开始时执行一次。
- 条件表达式(test):每轮循环开始时,都要执行这个条件表达式,只有值为真,才继续进行循环。
- 递增表达式(increment):每轮循环的最后一个操作,通常用来递增循环变量。
do…while需要注意
do...while循环至少运行一次,这是这种结构最大的特点while语句后面的分号注意不要省略
break语句用于跳出代码块或循环。continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。break和continue注意: 如果存在多重循环,不带参数的
break语句和continue语句都只针对最内层循环。标签(label)JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。:
label: 语句- 标签通常与
break语句和continue语句配合使用,跳出特定的循环 - 示例 : 阮一峰JavaScript-基础语法
- 标签通常与
数据类型
JavaScript有7中数据类型: number(数值), string(字符串), boolean(布尔值), null, undefined, object(对象), Symbol
数值和字符串和布尔值 合成为 原始类型,他们最基本,无法再细分了.
对象称为合成类型的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
undefined和null可以看成是两个特殊值对象分为三个子类:
- 狭义的对象(object)
- 数组(array)
- 函数(function)
函数其实是处理数据的方法,JavaScript 把它当成一种数据类型,可以赋值给变量,这为编程带来了很大的灵活性,也为 JavaScript 的“函数式编程”奠定了基础。
typeof运算符可以返回一个值的数据类型。数值、字符串、布尔值分别返回
number、string、boolean。函数返回
functionundefined返回undefinedNaN返回number利用这一点,
typeof可以用来检查一个没有声明的变量,而不报错。v // ReferenceError: v is not defined typeof v // "undefined" // 错误的写法 if (v) { // ... } // ReferenceError: v is not defined // 正确的写法 if (typeof v === "undefined") { // ... }对象返回
objectnull返回objecttypeof window // "object" typeof {} // "object" typeof [] // "object"数组也是
object是一种特殊的对象.instanceof可以判断是否是数组var o = {}; var a = []; o instanceof Array // false a instanceof Array // true
null-undefined-boolean
null是一个表示“空”的对象,转为数值时为0;undefined是一个表示”此处无定义”的原始值,转为数值时为NaN。- 函数无返回值时, 默认返回
undefined - 下列运算符会返回布尔值:
- 前置逻辑运算符:
!(Not) - 相等运算符:
===,!==,==,!= - 比较运算符:
>,>=,<,<=
- 前置逻辑运算符:
- 以下6个值会被JavaScript引擎自动转化为布尔值时,转为false,其他的都是true
undefinednullfalse0' '或" "(空字符串)NaN
- 空数组
[]和空对象{}都是true
数值
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
十进制: 没有前导0的数值
八进制:有前缀
0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。十六进制:有前缀
0x或0X的数值。二进制:有前缀
0b或0B的数值。默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。
NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。5 - 'x' // NaN0除以0也会得到NaN。Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。
与数值相关的全局方法
parseInt方法用于将字符串转为整数如果字符串头部有空格,空格会被自动去除
字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
如果
parseInt的参数不是字符串,则会先转为字符串再转换。如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回
NaN。
parseInt还接受第二个参数(默认是十进制), 表示被解析的值得进制parseFloat方法用于将一个字符串转为浮点数parseFloat会将空字符串转为NaN- 如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分。
isFinite方法返回一个布尔值,表示某个值是否为正常的数值。- 除了
Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。
- 除了
字符串
由于 HTML 语言的属性值使用双引号,所以很多项目约定 JavaScript 语言的字符串只使用单引号.当然,只使用双引号也完全可以。重要的是坚持使用一种风格,不要一会使用单引号表示字符串,一会又使用双引号表示。
字符串如果想要输入多行, 可以在每一行尾部使用 反斜杠
\,但是输出还是单行的如果想输出多行字符串,有一种利用多行注释的变通方法。
(function () { /* line 1 line 2 line 3 */}).toString().split('\n').slice(1, -1).join('\n') // "line 1 // line 2 // line 3"反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
需要用反斜杠转义的特殊字符,主要有下面这些。
\0:null(\u0000)\b:后退键(\u0008)\f:换页符(\u000C)\n:换行符(\u000A)\r:回车键(\u000D)\t:制表符(\u0009)\v:垂直制表符(\u000B)\':单引号(\u0027)\":双引号(\u0022)\\:反斜杠(\u005C)
反斜杠还有三种特殊用法。
(1)
\HHH反斜杠后面紧跟三个八进制数(
000到377),代表一个字符。HHH对应该字符的 Unicode 码点,比如\251表示版权符号。显然,这种方法只能输出256种字符。(2)
\xHH\x后面紧跟两个十六进制数(00到FF),代表一个字符。HH对应该字符的 Unicode 码点,比如\xA9表示版权符号。这种方法也只能输出256种字符。(3)
\uXXXX\u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。XXXX对应该字符的 Unicode 码点,比如\u00A9表示版权符号。如果在非特殊字符前面使用反斜杠,则反斜杠会被省略
转义符转义自身
\\输出\字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(位置编号从0开始)。超出返回
undefined
base64 转码
所谓 Base64 就是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、
+和/这64个字符组成的可打印字符。使用它的主要目的,不是为了加密,而是为了不出现特殊字符,简化程序的处理。
JavaScript 原生提供两个 Base64 相关的方法。
btoa():任意值转为 Base64 编码atob():Base64 编码转为原来的值
注意,这两个方法不适合非 ASCII 码的字符,会报错。
btoa('你好') // 报错
要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法。
function b64Encode(str) {
return btoa(encodeURIComponent(str));
}
function b64Decode(str) {
return decodeURIComponent(atob(str));
}
b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
对象
什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
对象的属性之间用逗号分隔, 最后一个属性后面可加可不加.
对象的属性值如果引用的是对象,则是不同对象的属性引用同一个对象,是同一块内存地址,改一个,影响另一个,
如果引用是原始类型的值, 则是值的拷贝, 互不影响
行首是大括号开头的 是表达式还是语句?
{ foo: 123 }为了避免歧义, V8引擎规定, 如果行首是大括号, 一律解释为对象. 为了避免歧义, 最好在大括号前加上圆括号.
这种差异在
eval语句(作用是对字符串求值) 中体现明显:eval('{foo: 123}') // 123 eval('({foo: 123})') // {foo: 123}上面代码中, 如果没有圆括号,
eval将其理解为代码块, 加上括号后理解成一个对象.
属性的读取
读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。
使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理。
- 方括号例外: 数字键可以不加引号, 因为会自动转化为字符串
- 数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。
JavaScript 允许属性的“后绑定”,也就是说,你可以在任意时刻新增属性,没必要在定义对象的时候,就定义好属性。
查看一个对象的所有属性, 用
Object.keys属性的删除用
delete, 成功删除返回true在没有被删除属性时也会返回true`delete object.name // true`delete只有一种情况会返回false: 属性存在, 但不得删除delete命令只能删除对象本身的属性,无法删除继承的属性
用
in查看属性是否从存在 (键名)'name' in object- 继承的也会返回
true - 这时,可以使用对象的
hasOwnProperty方法判断一下,是否为对象自身的属性。
- 继承的也会返回
属性的遍历
for infor (var i in obj) { console.log('键名:', i); console.log('键值:', obj[i]); }- 它遍历的是对象所有可遍历(enumerable)的属性,会跳过不可遍历的属性。
- 它不仅遍历对象自身的属性,还遍历继承的属性(必须是可遍历的)。
- with操作同一个对象的多个属性时,提供一些书写的方便。
函数
函数是一段可以反复调用的代码块
函数声明
有三种
- function命令
- 函数表达式
- Function构造函数