写在前面
作为一个工作了6年的前端,犀牛书没有完整读过一遍,似乎很不合格。最近也被别人问到一些问题,心里总不太有把握。
现如今框架层出,但是永远最重要的还是基础。于是决定,将这本书读完并整理出一份精简版的笔记,给我自己以及需要提高javascript基础的小伙伴们。
词法结构
2.1 字符集
Javascript是区分大小写的语言。online
,Online
,onLine
,OnLine
是四个不同的变量名。
HMTL 不区分大小写。
2.2 注释
Javascript支持两种注释,单行//
和多行/**/
//这里是单行注释
/* *这个是多行注释 *下一行 */
2.3 直接量
直接量(literal)是程序中直接使用的数据值。下面是一些直接量的例子:
12 //数字
1.2 //小数
"hello" //字符串
true //布尔值
null //空
/javascript/gi //正则表达式直接量
2.4 标识符和保留字
标识符
标识符用来对变量和函数进行命名。命名规则:
~ | 字母 | 数字 | _ |
$ |
---|---|---|---|---|
开头 | √ | × | √ | √ |
后续 | √ | √ | √ | √ |
允许标识符中出现Unicode字符全集中的字母和数字。
保留字
Javascript把一些标识符拿出来做关键字。因此这些不能再作为标识符(这里不详细列出保留字)。
2.5 可选的分号
使用;
将语句分开。
类型、值和变量
3.1 数字
Javascript不区分整数值和浮点数值,所有数字均用浮点数值表示。
3.1.3 算数运算
算数运算在溢出(overflow)、下溢(underflow)或被0整除都不会报错。会显示Infinity
和-Infinity
来表示无穷大和负无穷大。如果像0/0没有意义,结果是非数字(not-a-number),显示NaN
。
1/0 //=> Infinity
-1/0 //=> -Infinity
0/0 //=> NaN
1/Infinity //=> 0
非数字值(NaN)有一点特殊:它和任何值都不相等,包括自身。
var x=0/0 //=> NaN
x==NaN //=> false
两个函数isNaN()
和isFinite()
判断是否非数字和有限数。
var x=0/0;
isNaN(x); //=> true
var y=1/0 //=> Infinite
isFinite(y) //=> false;
isFinite(5) //=> true;
正零和负零相等,正无穷大和负无穷大不等:
var x=0,y=-0;
x==y //=> true
1/x==1/y //=> false;
3.1.4 二进制浮点数和四舍五入错误
上面提到Javascript中所有数字均用浮点数值表示,而实数有无数个,但通过浮点数的形式只能表示有限个数。即,使用实数时,常常只是真实值的一个近似表示。
Javascript采用IEEE-754浮点数表示法,是一种二进制表示法,不能精确表示类似0.1这种十进制分数。
var x = .3 - .2; //=> 0.09999999999999998
var y = .2 - .1; //=> 0.1
x==y //=> false
为避免该问题,在进行重要的金融计算时,使用大整数计算。用整数“分”,而非小数“元”进行基于货币单位的运算。
var x = 3 - 2; //=> 1
var y = 2 - 1; //=> 1
x==y //=> true
3.2 文本
3.2.1 字符串直接量
字符串直接量是由''
或""
括起来的字符序列。
ECMAScript 5中,字符串直接量可以拆分成数行,必须以反斜线\
结束。
var myString1="<div>\ <a>link</a>\ </div>";
3.2.2 转义字符
常用的转义字符:
转义字符 | 含义 |
---|---|
\n |
换行符 |
\" |
双引号 |
\' |
单引号 |
\\ |
反斜线 |
var str='Two\nLines';
//=> "Two
// Lines"
3.2.3 字符串的使用
使用+
进行字符串连接。
字符串的length属性和方法(indexOf, split等等)以及正则表达式后面再介绍。
3.3 布尔值
只有两个值:true
和false
。
任意Javascript的值都可以转换为布尔值,下列会转换成false
:
undefined
null
0
-0
NaN
""//空字符串
3.4 null和undefined
~ | 描述 | 类型(typeof) |
---|---|---|
null |
关键字,表示空值 | object |
undefined |
值空缺,变量没有初始化 | undefined |
如何区分这两个值?使用严格相等运算符===
null == undefined //=> true
null === undefined //=> false
如果需要将“空”赋值给变量或属性或作为参数传入参数,使用null
。
3.6 包装对象
引例:
var str="hello";
str.length //=> 5
问:字符串不是对象,为什么会有属性?
答:将字符串值通过调用new String(str)的方式转换成对象,并继承了字符串的属性。
字符串、数字和布尔型的属性都是只读的,不能给他们定义新属性,是有别于对象的。
var s="test";
s.len=4;
var t = s.len; //=> undefined
可通过String(), Number()或Boolean()构造函数显式创建包装对象。他们和原始值不严格相等。
var s='test', n=1, b=true;
var S = new String(s);
var N = new Number(n);
var B = new Boolean(b);
S==s //=> true
S===s //=> false
3.7 不可变的原始值和可变的对象引用
~ | 类型 | 描述 | 比较 |
---|---|---|---|
原始值 | undefined、null、布尔值、数字、字符串 | 不会更改:任何方法都无法更改 | 值相等则相等 |
对象 | 数组、函数 | 值可修改 | 引用同一个基对象时,才相等;两个对象包含同样属性及值并不相等 |
原始值不会更改示例:
var str="hello";
str.toUpperCase(); //=> "HELLO"
str //=> "hello"
对象比较示例:
var x={a:1},y={a:1};
x==y //=> false: 两个单独的对象永不相等
var x=[],y=[];
x==y //=> false: 两个单独数组永不相等
var x={},y=x;
x==y //=> true: 引用相同
那么如何判断两个对象是否含有同样的属性呢?遍历。
function equalArrays(a,b){
if(a.length != b.length){
return false;
}
for(var i=0;i< a.length;i++){
if(a[i] !=b[i]){
return false;
}
}
return true;
}
var x={a:1},y={a:1};
equalArrays(x,y); //=> true: 属性值都相等
3.8 类型转换
【未完待续】