JavaScript 语言精粹(修订版)学习笔记

373 阅读7分钟

第一章

主要介绍的是js的相关背景和介绍(我这里就不做缀述)

第二章

1.空白

通常空白是无意义的,但是有时候必须要用来分隔字符。 /**/ 注释不够安全,建议使用//

2.标识符

由字母开头,具选择性的加入一个或者多个字母下划线。

js中不能使用保留字作为对象的属性名

下划线 --  my_name
驼峰   --  MyName

3.数字

在js中没有分离整数只有一个64位的数字类型,所以在js中完美的避免了短整型溢出的问题。

NaN作为一个不能正常运行的结果,可以使用isNaN(number)来检测,NaN不等于任何值包括它本身。

Infinity表示所有大于1.797693134862316E+308的值

Number 对象

精度:
八进制和十六进制  前缀为0则代表8进制数。前缀为x则是16进制。
转换进制 toSting(8)
a.toSting(8)
a.toSting(16)
无穷大:正无穷大Infinity,负无穷大-Infinity
NaN:非数值的特殊值-isNaN()
方法:
parseFloat()    将字符串转成浮点数

parselnt()      将字符串转成整数
isFinite()      判断传入的参数是否为有限数字
isInteger()     判断传入的参数是否为整数
isNaN()         判断传递的参数是否为NaN
isSafeInteger() 判断传递的参数是否为安全整数 --- 安全整数?
toExponential() 返回一个数字的指数形式的字符串---
const num = 77.445576
num.toExponential()
toFixed()       返回指定小数位数的标识形式
const a = 123;
cosnt b = a.toFixed(2)
// b:'123.00'

const a = 123.7545
cosnt b = a.toFixed(2)
// b:'123.76' //四色五入
toPrecision()    返回一个指定精度的数字

const a = 123
const b = a.toPrecision(2)
// b: '1.2e + 2'

可以使用math.floor(number)把一个数字转换成整数

4.字符串

js的所有字符串都是16位的,被包裹在单引号或者双引号之间。

通过length 获取字符串长度

charAt()     返回指定索引位置的字符
charCodeAt() 返回指定索引位置的Unicode值
split()      把字符串分割成数组
substr()     从起始索引提取字符串中指定数目的字符(区别)
substring()  提取字符串中两个指定的索引号之间的字符
trim()         移除字符串首尾空白
...字符串其他的方法()

转义字符串把一些正常无法插入到字符串中的字符插入到字符串中。

两个包含了相同字符且顺序相同的字符串被认为是同一个字符串如: 'a'+'b'+'c' = 'abc'

5.语句

script提供了一个被编译且立即执行的编译单元,js把它们抛到一个公共的全局名空间中。

执行顺序通常是从上至下的,但是可以通过(if和switch)循环(while,for和do)返回(break,return和throw)来改变顺序

for in 会枚举一个对象的所有属性,在每次循环之后,object的下的一个属性名字符串被赋值给varible 通常需要使用object,hasownproperty(varible)来确定这个属性名是否属于该对象,还是来自原型链

do while至少会执行一次

6.表达式

一个中置运算符和一个表达式,三元表达式,属性提取表达式

typeof

instanceOf

7.字面量

一种方便按指定规格规范创建新对象的表示法

8.函数

可以有一个可选的名字,可递归自己,可以指定参数列表在调用时传递实际参数(argument)

第三章对象

对象是可变的键控集合,在js中数组是对象,函数是对象,正则表达式是对象,对象也是对象

对象是属性的容器,其中每个属性都拥有名字和值,属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值以外的任意值。

对象包含原型链的特性,允许对象继承另一个对象的属性,正确的使用它能减少对象初始化时的消耗和内存。

1.对象字面量

对象字面量提供了一种非常方便的创建新对象的表示法,一个对象字面量就是包围在一对花括号中的零或者多个"名/值"对。对象字面量可以出现在任意表达式出现的地方。

2.检索

要检索对象里面包含的值,可以采用[ ]后缀中括住一个字符串的表达式的方式,如果字符串表达式是一个字符串的字面量,而且它是一个合法的js标识符且不是保留字。那么也可以用.表示法代替。

stooge["frist-name"] 
stooge.frist

当你检索的值不存在的时候,会返回undefined

3.更新

对象里面的值可以通过赋值来更新。如果属性名已经存在于对象中,这个属性值会被替换。如果对象之前没这个属性值,就会扩充到对象中。

4.引用

对象通过引用来传递。它们永远不会被复制。

var x = stooge;
x.nickname = 'Curly'
 // 因为x和stooge是指向同一个对象的引用,所以nick为'Curly'
var nick = stooge.nickname;
 // a,b,c每个都引用一个不同的空对象。
var a = {},b = {},c = {};
 // a,b,c都引用同一个空对象。
a = b = c = {};

5.原型

每个对象都连接一个原型对象,并且可以从中继承属性。所有通过对象字面量创建的对象都连接object.prototype,它是js中的标配对象。

当你创建一个对象的时候,你可以选择某个对象作为它的原型。js提供了实现机制杂乱而复杂。但是可以明显简化。

if(typeof object.beget !== 'function'){
    object.create = function(o);
     var F = function() {};
     F.prototype = o;
     return new F();
}
var another_stooge = object.create(stooge);

原型连接在更新的时候是不起作用的。当我们对某个对象做出改变的时候,不会触及到对象的原型。

原型连接值在索引值的时候才被用到。如果我们尝试去获取对象的某个属性值,但是该对象没有这个属性名,那么js就会试着从原型对象中去获取属性值,如果这个原型对象也没有这个属性。那么它会再从它的原型中新寻找,直到该过程最后达到终点。object.prototype如果想要的属性完全不存在于原型链中,那么结果就是undefined。这个过程称之为委托。

原型关系是一个动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

6.反射

obj.hasOwnProperty()

用来检测一个对象是否含有特定的自身属性
会忽略掉那些从原型链上继承的属性

7.删除

delete运算符

原型链中的任何对象

8.减少全局污染

var引发的全局变量污染

第四章 函数

1.函数对象

函数是对象,对象是名/值的集合并且拥有一个连接到原型对象的隐藏连接,对象隐藏连接到object.prototype。而函数连接到function.prototype中(该原型对象连接object.prototype上。

每个函数在创建时会附加两个隐藏属性:函数上下文和实现函数行为的代码。

每个函数对象在创建时也随配有一个prototype属性,它的值是一个拥有comstructor属性且值即为该函数的对象。函数可以拥有方法,函数与众不同之处它们可以被调用。

2.函数字面量

可以通过嵌套到其他夫函数的参数和变量,通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为闭包。

3.调用

四种调用方式 方法调用模式 函数调用模式 构造器调用模式 apply调用模式

4.方法调用模式