《Javascript权威指南》笔记(1)——Javascript语言核心

时间:2022-08-27 08:23:23


写在前面

作为一个工作了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 布尔值

只有两个值:truefalse

任意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 类型转换

【未完待续】