第1章 JavaScript概述
可以通过F12键或者Ctrl+Shift+J快捷键来唤醒控制台
初始化表达式(initializer expression)【第4章】
eg1:初始化表达式[数组]
var primes = [2,3,5,7];
eg2:初始化表达式{对象}
var book = {
topic:"JavaScript",
fat:true
};
通过“.”和“[]”来引用对象属性或数组元素的值
book.topic //=> JavaScript
book["fat"] //=> true
以分号结束的行,改变程序的运行状态【第5章】 -> 语句 statement
函数和对象合写在一起 -> 方法 method
第一部分JavaScript语言核心
第2章 词法结构
JavaScript区分大小写
HTML不区分大小写
XHTML区分大小写
2.4标识符和保留字
标识符
标识符就是一个名字,在JS中标识符用来对变量和函数进行命名,必须以字母、数字、下划线或美元符开始。
2.5可选的分号
在JS中,如果语句各自独占一行,通常可以省略语句之间的分号(程序结尾或右花括号之前的分号也可以省略)
注意:JS并不是在所有换行处填补分号,只有缺少分号无法解析才填补
【例】
var y=x+f
(a+b).toString()
=> var y=x+f(a+b).toString()
因此有些保守的程序员会这样写(即使上一行分号误删了也不必担心)
【例】
var x=0
;[x,x+1,x+2].forEach(console.log)
注:JavaScript forEach() 方法
https://www.runoob.com/jsref/jsref-foreach.html
另外的两个例子
【例】
1.涉及return,break,continue
return
true;
=>
return;true
2.涉及++和--
x
++
y
=>
x;++y
最好还是加上~加上分号便万事大吉~~
第3章 类型、值和变量
JS数据类型三种分类
1.原始类型(primitive type, /'prɪmətɪv/)和对象类型(object type)
原始类型包括数字、字符串和布尔值。JS中有两个特殊的原始值:null(空)和undefined(未定义)
除了上面五种,就是对象了。对象是属性(property)的集合,每个属性都由“名/值对”构成。特殊:全局对象(global object)
1)数组(array)是对象,表示带有编号的值得有序集合。普通JS对象是“命名值”的无序 集合。
2)函数是对象。如果函数用来初始化(使用new运算符)一个新建的对象,我们称之为构造函数(constructor)。每个构造函数定义了一类(class)对象。
3)日期(Date)类定义了代表日期的对象
4)正则(RegExp)类定义了表示正则表达式的对象
5)错误(ERROR)类定义了那些表示JS程序中运行时错误和语法错误的对象
垃圾回收(garbage collection)
2.可以拥有方法的类型和不能拥有方法的类型
在JS中,只有null和undefined是无法拥有方法的值(3.6会解释原因)
3.可变类型(mutable,/ˈmjuːtəbl/)和不可变类型(immutable,/ɪˈmjuːtəbl/)
可变类型的值是可以修改的,如对象、数组…
原始类型是不可变类型,如字符串(一些方法是返回新字符串),null,undefined…
JS变量是无类型的(untyped),使用var关键字来声明(declare)变量。
JS采用词法作用域(lexical scoping),不在任何函数内声明的变量称做全局变量,任何地方可见。
在函数内声明的变量具有函数作用域(function scope),并且只在函数内可见。
3.1数字
JS不区分整数值和浮点数值。JS中的左右数字均用浮点数值表示。
3.1.3 JS中的算术运算
Math对象的属性定义的函数可以进行一些复杂运算
【例】
Math.random() //生成一个[0,1)的伪随机数
Math.pow(3,1/3) //3的立方根
Math.log(10) //10的自然对数
Math.log(100)/Math.LN10 //以10为底100的对数
Math.exp(3) //e的三次幂
JS中的算术运算在溢出(overflow)、下溢(underflow)或被零整除时不会报错
溢出:Infinity,-Infinity
下溢:0,负零
非数字:【例】0/0 为not-a-number(NAN),JS中的非数字值和任何值都不相等,包括自身,所以应该通过x!=x来判断(只有x为NaN时才为true),函数isNaN()作用类似。
两个函数
isNaN()
isFinte():在参数不是NaN、Infinity或-Infinity的时候返回true
负零和正零值是相等的,这两个值几乎一样,除了做除数
3.2 文本
字符串(string)是一组由16位值组成的不可变的有序序列。
空字符串长度为0,JS中没有表示单个字符的“字符型”
如何查看浏览器编码模式?
浏览器调试页面输入document.charset或者document.characterset就会返回编码类型
【例】
document.charset
"UTF-8"
在ECMAScript 5中,字符串直接量可以拆分成数行,每行必须以反斜线(\)结束
【例】
"one
\long
\line"
字符串连接使用“+”
JS中的字符串固定不变,类似toUpperCase()的方法都返回新字符串,原字符串本身并没有发生改变。
可以把字符串当做只读数组,访问字符串的字符可以使用“[]”或方法charAt()
3.3 布尔值
任意JS的值都可以转为布尔值,下面这些值会被换成false(除此之外其它值转为true):
undefined
null
0
-0
NaN
"" //空字符串
3.4 null和undefined
null常用来描述“空值”,特殊的对象值,含义是“非对象”
【例】
>typeof(null)
"object"
undefined表示变量没有初始化,说明这个属性或元素不存在
【例】
>typeof(undefined)
"undefined"
以上两个值要使用严格相等运算符(“===”)区分
以上两个值不包含任何属性和方法,使用“.”和“[]”来存成员和方法会产生一个类型错误。
【例】
>null.length
VM77:1 Uncaught TypeError: Cannot read property 'length' of null
at <anonymous>:1:6
(anonymous) @ VM77:1
>undefined.length
VM98:1 Uncaught TypeError: Cannot read property 'length' of undefined
at <anonymous>:1:11
3.5 全局对象
当JavaScript解释器启动时(或者任何Web浏览器加载新页面的时候),她它将创建一个新的全局对象,并给它一组定义的初始属性。
在代码的最顶级——不在任何函数内的JS代码——可以使用JS关键字this来引用全局对象。
在客户端JS中,在其表示的浏览器窗口中的所有JS代码中,Window对象充当了全局对象。这个全局Window对象有一个属性window引用其自身,它可以代替this来引用全局对象。
3.6 包装对象
字符串既然不是对象,为什么它会有属性?
只要引用了字符串s的属性,JS就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法(6.2.2节),并被用来处理属性的引用。一旦属性的引用结束,这个新建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)。
数字和布尔值也有类似地方法,分别是Number()和Boolean()
以上三者的属性是只读的,不能给它们定义新属性。通过typeof运算符可以看到原始值和其包装对象的不同。
3.7 不可变的原始值和可变的对象引用
对象的比较并非值的比较。
【例】
var o==={x:1},o==={x:1}; //具有相同属性的两个对象
o===p //=> false
var a=[],b=[]; //两个空数组
a===b //=> false
对象也称为引用类型(reference type),与JS的基本类型区分(对象比较引用,基本类型比较值)。对象值都是引用(reference),当且仅当它们引用同一个基对象时,它们才相等。
【例】
var a=[];
var b=a;
b[0]=1;
a[0] //=> 1
a===b //=> true
如上,将对象(或数组)赋值给一个变量,仅仅是赋值的引用值;对象本身并没有复制一次。
【例】生成数组副本
var a = ['a','b','c'];
var b = [];
for (var i=0;i<a.length;i++){
b[i] = a[i];
}
3.8类型转换
Bollean([]) //=> true
String(false) //等价于 false.toString()
Object函数转换null或undefined不会抛出异常,仅简单地返回一个新建的空对象。
【例】
>Object(null)
{}
>Object(undefined)
{}
通过运算符做隐式类型转换
【例】
x + "" //等价于String(x)
+x //等价于Number(x),也可写成x-0
!!x //等价于Boolean(x)
以下都可以跳过前导空格
Number() 只能基于十进制转换,并且不能有非法尾随字符
parseInt() 只解析整数,第二个可选参数指明基数2~36,可以忽略后面内容
parseFloat() 整数+浮点数,可以忽略后面内容
3.9 变量声明
如果未在var声明语句中给变量指定初始值,在它存入一个值前,它的初始值是undefined
3.10 变量作用域
在全局作用域编写代码时可以不写var语句,但声明局部变量时则必须使用var语句。
3.10.1 函数作用域和声明提前
JS中没有块级作用域。JS使用函数作用域(function scope):变量在声明它们的函数体以及这个函数嵌套的任意函数体内都是有定义的。
var scope="gloal";
function f(){
console.log(scope); //=>输出"undefined"
var scope = "local";
console.log(scope); //=>输出"local"
}
3.10.2 作为属性的变量
当声明一个JS全局变量时,实际上是定义了全局对象的一个属性。当使用var声明一个变量时,创建的这个属性是不可配置的,无法通过delete运算符删除。
3.10.3 作用域链
每一段JS代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。这个作用域链是一个对象列表或链表,当JS需要查找x时(变量解析,variable resolution),会一级一级找。如果作用域链上没有任何一个对象含有属性x,会抛引用错误(Reference ERROR)异常。
相关重点:
with语句(5.7.1节)
闭包(8.6节)