《JavaScript权威指南》学习笔记(一)

article/2025/10/5 11:20:52

跟着《JavaScript权威指南》整理的一些知识点和自己的小拓展。有不足之处请指正。

1、try catch

防止程序异常直接报错退出,而是能对异常进行一些处理,具体处理就在catch中。最好是在最外层函数使用。

 

2、HTML不区分大小写、XHTML区分大小写、JavaScript区分大小写。

许多客户端JavaScript对象和属性与它们所表示的HTML标签和属性同名。在HTML中这些标签和属性可以小写或者大写,但是在JavaScript中只能小写。比如onclick属性在HTML中可以携程onclick或onClick,但是在JavaScript中只能写成onclick。

 

3、JavaScript标识符

开头必须是字母/下划线/美元符开头。

 

4、JavaScript的类:

数组类(Array)、函数类(Function)、日期类(Date)、正则类(RegExp)、错误类(Error)。

 

5、JavaScript的数据类型:

原始类型(数字、字符串、布尔值)、对象类型、null、undefined。

 

6、JavaScript的类型也可分为:

可拥有方法的类型和不能拥有方法的类型。或者可变(mutable)类型和不可变(immutable)类型。

可变类型的值可以修改——对象、数组。

不可变类型的值不能修改——数字、布尔值、null和undefined。(字符串也是不可变的。可以访问字符串任意位置的文本,但是并未提供修改已知字符串文本内容的方法。)

变量是无类型(untyped)。

 

7、从技术上讲,只有JavaScript对象才能拥有方法。然而数字、字符串、布尔值也可以拥有自己的方法。只有null和undefined无法拥有方法值。

 

8、JavaScript不区分浮点数和整数。所有数字均为浮点数。整数范围是-2^{^{52}} \leqslant x^{^{}}\leqslant 2^{^{52}}。(9007199254740992)

 

9、十进制/二进制/十六进制转换

 

10、3.06e23 = 3.06^{^{23 }}

 

11、Math对象

Math.sqrt(2)           // 2的平方

Math.pow(2,52)     // 2的52次方

Math.round(0.6)    // 1.0,四舍五入

Math.ceil(0.6)       //1.0,向上求整

Math.floor(0.6)     //0.0,向下求整

Math.abs(-1)        //1,绝对值

Math.max(x,y,z)   //最大值

Math.min(x,y,z)    //最小值

Math.random()    //生成0≤x≤1.0的伪随机数

Math.PI               //π

Math.E               //e,自然对数的底数

Math.sin(0)        //三角函数 Math.cos Math.atan

Math.log(10)     //10的自然对数 以e为底

Math.log(100)/Math.LN10  //以10为底的100的对数  Math.LN10=Math.log(10)

Math.log(512)/Math.LN2   //以2为底的513的对数  Math.LN2=Math.log(2) 只有LN2 LN10 其他不行

Math.exp(3)                      //e的3次方

 

12、特殊的数值

比能表示的正数大用 Infinity表示,比能表示的负数小用- Infinity表示。

underflow下溢:无限接近于0,但是比可表示范围小的数,返回0;负数下溢,返回负零(-0)。负零几乎与0没啥区别。

被零整除(x➗0):不报错,返回无穷大 Infinity或者负无穷大 -Infinity。但是0/0无意义,结果返回一个非数字值NaN(NOT-A-NUMBER),无穷大/无穷大、给负数开平方,或者运算符和不能转换为数字的操作数一起使用都返回NaN。

Number.MAX_VALUE + 1 //Infinity

Number.NEGATIVE_INFINITY //-Infinity

Number.NaN //只读 NaN是可读写(ECMAScript5中也是只读)

Number.MIN_VALUE/2 //下溢结果为0

-Number.MIN_VALUE/2 //下溢结果为-0

 

* NaN和任何数值都不相等,包括他自己。所以无法通过x==NaN来判断。而应该用x!=x来判断是否为NaN。isNaN()这个函数也可以,是非数字值就返回true。

isFinity()在参数不是NaN、Infinity、-Infinity的时候返回true。

* 负零和零数值是相等的。除了作为除数的时候。

 

13、二进制浮点数和四舍五入错误

因为是二进制,可以精确表示分数 1/2 1/8 1/1024但是不能精确表示1/10 1/100。

所以计算时尽量用大整数代替分数小数。比如计算时使用整数“分”而不是小数“元”来进行货币运算。

 

14、日期和时间

getYear()和getFullYear():获取年份的正确方法是getFullYear()

使用getYear()函数的本意是获取年份,以2010年为例,如:

  1. var nowd = new Date();  
  2. var yf = nowd.getYear();   

在IE中是可以正确获取年份:2010,但是在FF等浏览器下则为:110。

原因则是 在 FF等浏览器内 getYear 返回的是 "当前年份-1900" 的值(即年份基数是1900)

而IE则是当today的年份大于等于2000的时,直接将1900加上了,返回的 2010。

使用getFullYear()在IE和FF中都可以正确获取年份:2010

 

getMonth()是从0开始计数的,所以0是1月。

getData()是从1开始计数的,所以1是1日。

getDay()代表星期几,0是星期日,1是星期一。

getHours()代表几点。

getUTCHours()代表使用UTC表示小时的时间,基于时区。

 

15、文本

字符串string是一组由16位值组成的不可变的有序序列。字符串(和其数组)的索引从0开始。JavaScript没有char字符类型,单个字符也是长度为1的字符串string。

JavaScript采用UTF-16编码的Unicode字符集,字符串是由一组无符号的16位值组成的序列。最常用的Unicode字符都是通过16位的内码表示,并代表字符串的单个字符。那些不能用16位Unicode字符表示的字符则遵循UTF-16编码规则——用两个16位值组成的一个序列(代理项对)表示。所以长度为2的JavaScript字符串可能只表示一个Unicode字符。

这个案例是可行的。

书上的这个案例:

测试结果不同:

 

16、字符串直接量

单引号或者双引号括起来的字符序列,叫做字符串直接量。ECMAScript5中字符串可拆分成几行来写,每行以 \ 结束。

反斜线和行结束符都不算字符串直接量内容。

使用斜杠分开输入的话,显示结果还是一行。

使用转义字符\n可在输出结果中换行。

用单引号来界定字符串,中间出现的单引号也要 \ 来转义。

在JavaScript和HTML混用时最好统一使用不同的引号。比如HTML使用双引号,JavaScript使用单引号。

 

17、转义符号

如果 \ 单独出现会被忽略。如果接特殊字符的话就是转义的作用。

\o                      NUL字符                 实测未转义

\b                      退格符

\t                      水平制表符

\n                      换行符

\v                      垂直制表符

\f                      换页符

\r                      回车符

\"                      双引号

\'                      撇号或单引号

\\                      反斜杠

\xXX                由两位十六进制数XX指定的Laint-1字符

\uXXXX           由4位十六进制数XXXX指定的Unicode字符

 

18、字符串使用

var s = "hello,world"

s.length                         //字符串长度

s.charAt(0)                    //字符串第一个字符

s.charAt(s.length-1)      //字符串最后一个字符

s.substring(1,4)            //ell  字符串第2个字符到第4-1个字符 不可负数

s.slice(1,4)                   //ell  同上

s.slice(-3)                     //rld  最后3个字符

s.indexOf("l")               //2 字符"l"首次出现的位置

s.lastIndexOf("l")         //10 字符"l"最后一次出现的位置

s.indexOf("l", 3)           //3 在位置3及之后,字符"l"首次出现的位置

s.split(",")                    //以","为分割把字符串分成字串

s.repalce("h", "H")      //把"h"全替换成"H" 返回新串

s.toUpperCase()        //全部变成大写 返回新串

 

*slice()、substring()、substr()

slice(start,end)该方法并不会修改数组,而是返回一个startend-1的所有字符,其长度为 end减 start。可使用负值从数组的尾部选取元素。如果想删除数组中的一段元素,应该使用方法 splice()。end没被规定,会直接从start到结束。

substring(start,end)返回 start 处到 end-1 处的所有字符,其长度为 end减 start。不可使用负值从数组的尾部选取元素。如果参数 start 与 end 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。如果 start 比 end 大,那么该方法在提取子串之前会先交换这两个参数,如果输入3,1 ,还是会换成1,3,slice()不行。end没被规定,会直接从start到结束。

substr(start,length)一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。ECMAscript 没有对该方法进行标准化,因此反对使用它。.

 

19、模式匹配RegExp()

用来创建表示文本匹配模式的对象。利用正则表达式进行模式匹配和查找与替换对象。

/^HTML/             匹配以HTML开始的字符串

/[1-9][0-9]*          匹配一个非零数字后面接任意个数字

/\bjavascript\b/i   匹配单词"javascript"忽略大小写

后面会详解。

 

20、布尔值

任意JavaScript值都可转换成布尔值,下面的值会被转换成false:

undefined

null

0

-0

NaN

""        //空字符串

其他所有值都会转换成true

 

21、null和undefined     null==undefined是true      null===undefined是false

https://blog.csdn.net/qq_35630674/article/details/83089711

这篇博客里讲了null和undefined具体怎么不一样。

Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。如果要查询对象属性或数组元素的值时返回undefined说明这个属性或者元素不存在。

Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

null和undefined的区别:

null: Null类型,含义是“非对象”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。null是一个表示"无"的对象,转为数值时为0;

undefined:他的值就是“未定义”,Undefined类型,使用typeof运算得到 “undefined”,当一个声明了一个变量未初始化时,得到的就是undefined。undefined是一个表示"无"的原始值,转为数值时为NaN。

*没有返回值的函数返回为undefined,没有实参的形参也是undefined。

 

犀牛书原文:你或许认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的,正常的,在意料之内的值的空缺,如果你想将他们赋值给变量或者属性,或将他们作为参数传入函数,最佳选择是使用null。

 

22、全局对象global object

全局属性:undefined、Infinity、NaN

全局函数:isNaN()、parseInt()、eval()

构造函数:Date()、RegExp()、String()、Object()、Array()

全局对象:Math和JSON

可以通过 var global=this;//定义一个引用全局对象的全局变量。

 

23、包装对象

字符串、数字、布尔值都可以通过"."来引用属性值,当属性值是一个函数时,就称之为方法。只要引用了属性值,JavaScript就会通过调用new String(s)的方式转换为对象,这个对象继承了字符串的方法。一旦属性引用结束,新创建的对象就被销毁。(实际未必会有创建销毁的过程,但是整个过程看起来是这样的)

null和undefined没有包装对象,访问他们的属性会造成类型错误。

此处s.len=4,这个对象,赋值结束以后就会被销毁了。所以,再用t去读取的时候又生成了新的临时对象,新的len属性,读取不到之前的4了。

包装对象只是实现细节,不用特地关注。而且他们是只读的,给他们生成新的属性也无法保存下来。他们和真正的对象是有区别的。

JavaScript在必要时会将包装对象装换成原始值。通过typeof运算符可以看到原始值和其包装对象的不同。

 

24、不可变的原始值和可变的对象引用

原始值都不可改变。字符串也一样,就算看起来像是改了那也是生成了一个新的,原来的没有变。

原始值的比较是值的比较:只有在他们值相等的时候他们才相等。对字符串,只有当长度相等、且每个索引的字符都相等时他们才相等。

对象不同原始值,他们是可变可修改的。

对象的比较并非值的比较,即使两个对象包含同样的属性和相同的值,他们也是不相等的。各个索引元素完全相同的两个数组也不相等。(两个单独的对象/数组,永远不相等)

对象是引用类型,区别于基本类型。对象值都是引用,对象的比较均是引用的比较,当且仅当他们引用同一个基对象他们才相等。

把数组赋值给对象仅仅是赋值的引用值,对象本身并没有复制一次。如果想得到副本只能循环复制每个元素。

所以想单纯比较两个数组元素是否相等,只能写个函数先比较长度再循环比较里面的元素。

 

25、类型转换

NaN(not-a-number)

 

26、转换和相等性

“==”运算符在执行之前JavaScript也自动进行类型转换,所以只要值相等就基本可以true。

但是一个值转换成另外一个值不代表两个值相等。 比如undefined在期望使用布尔值的地方会转化成false 但不代表他俩值相等。

 

27、显式类型转换

String(x)和x.toString()效果相同,除了null和undefined都有toString()方法。

Boolean() Number() String() Object()不通过new调用的时候会根据上面提到的类型转换规律作为类型转换函数来使用。

如果试图把null和undefined转换成对象,会抛出TypeError错误。Object()函数在这种情况下不会抛出异常,只是简单返回一个空的新创建的对象。

某些运算符可以进行隐式类型转换。

比如

x+"" //等价于 String(x)

+x //等价于 Number(x) 等价于 x-0

!!x //等价于 Boolean(x) 注意是双感叹号

 

*数字转字符串 x.toString(n) //n表示几进制

 

自己控制输出的小数点位置和有效数字位数或决定是否需要指数计数法。

toFixed() 根据小数点后的指定位数将数字转换成字符串,不用指数计数法

toExponenatial()使用指数计数法将数字转换成指数类型的字符串,小数点前只有一位。小数点后的位数则由参数指定。(有效数字位数比指定位数多一位)

toPrecision()根据指定的有效数字位数将数字转换成字符串。如果有效数字的位数少于数字整数部分的位数,则转换成指数形式。

以上方法都会适当四舍五入和填充0。

 

*字符串转换为数字

Number()会试图把字符串转换为整数或浮点数直接量,只用于十进制且不可尾随非法字符。

parseInt()只解析整数,前缀是0x 0X会自动解释为16进制数,返回的是十进制。parseFloat()可以解析整数和浮点数。这俩都会跳过任意数量的前导空格,并忽略后面的内容。如果第一个非空格字符是非法的数字直接量,将最终返回NaN。

parseInt()可以接受第二个参数,这个参数指定数字转换的基数,取值是2~36(包括2和36)。

3 = 1*2 + 1

f=15   255 = 15*16 + 15

z=26+9=35  1295 = 35*36 + 35

三位数不适用

 

28、对象转换为原始值

对象→布尔值:对象全是true

对象→字符串/对象→数字:调用带转换对象的一个方法,只适用于本地对象(Native Object),宿主对象(例如由web浏览器定义的对象)根据各自的算法转换成字符串和数字。

一个方法是toString(),对象:结果是[object Object]

数组:

函数:

时间:

正则表达式:

 

方法二:valueOf()

如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,就返回对象本身。

内部表示:1970年1月1日以来的毫秒数。

 

对象到字符串:先toString()没有就valueOf(),再没就抛出类型错误异常。

对象到数字:先valueOf()没有就toString(),再没就抛出类型错误异常。

 

+表示了字符串串联,-却是做了数字运算。

 

 

29、变量作用域

声明一个全局变量可以不用var,但是局部必须用var。局部变量优先级高于同名全局变量。

JavaScript没有块级作用域,而是函数作用域。变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。

函数作用域就是指在函数内声明的所有变量再函数体内是始终可见的。JavaScript函数里声明的所有变量(但不涉及赋值)都被提升至函数体的顶部。声明提前,但是初始化(赋值)还是在原来的位置。

scope被局部变量覆盖了,但是再赋值之前还没有值,所以是初始的undefined而不是global。

 

30、作用域链

作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量。当想要查找某个变量x的值,就从第一个对象中的属性开始查找是否存在x,以此类推,到最后没找到就抛出引用错误(ReferenceError)异常。

在最顶层的代码中(不包含在任何函数定义内的代码),作用域链由一个全局对象组成。在不包含嵌套的函数体内,作用域链上有两个对象,第一个是定义函数参数和局部变量的对象,第二个是全局对象。在一个嵌套的函数体内,作用域链至少有三个对象。


http://chatgpt.dhexx.cn/article/HJEmr3Ua.shtml

相关文章

《javascript权威指南》精读笔记-持续更新

《javascript权威指南》 作用域链 表达式 原始表达式 对象和数组的初始化表达式 函数定义表达式 函数直接量 属性访问表达式 调用表达式 对象创建表达式 运算符 表达式计算 var function for in with debugger use strict 对象 创建对象 属性的查询和设置 作为关联数组的对象 继…

JavaScript权威指南(第6版)

JavaScript权威指南(第6版) JavaScript权威指南 第6版(影印版)上册 Beginning iOS Programming, 2014年 Gradle for Android (2016年3月 Finished)

JavaScript权威指南 第11章JavaScript标准库

JavaScript权威指南 第11章JavaScript标准库 第11章 JavaScript标准库11.1 集合与映射11.1.1 Set类11.1.2 Map类11.1.3 WeakMap和WeakSet 11.2 定型数组与二进制数据11.2.1 定型数组的类型11.2.2 创建定型数组11.2.3 使用定型数组11.2.4 定型数组的方法与属性11.2.5 DateView与…

JavaScript 权威指南-学习笔记(一)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!JavaScript 权威指南-学习笔记 JavaScript是一门高级、动态、解释型变成语言,非常适合面向对象和函数式编…

JavaScript权威指南笔记-masaikk

JavaScript权威指南笔记-马赛柯柯 源代码位于masaikk/interviewAccess - Gitee.com 前五章笔记略 第六章 对象 防止某个对象被第三方库意外修改,建议使用Object.create()方法 ★ \bigstar ★ let o {foo: bar}; library.func(Object.create(o))解释Object.crea…

【JavaScript权威指南(第七版)】之阅读学习总结

写在前面 最近借着空闲时间断断续续两个月看完了《JavaScript权威指南(第七版)》,《JavaScript权威指南》一直以来被称为“犀牛书”,前面的第六版我大概略过一遍,由于书的厚度实在有点“厚重”,将近1000多页左右,有一些…

JavaScript权威指南(原书第7版) 犀牛书

第3章 语法结构 3.10.1 使用let和const声明 ES6后,变量通过let关键字声明 let i let sum可以使用一条let语句声明多个变量 let i, sum声明变量的同时,(如果可能)也为其赋予一个初始值 let message hello let i 0, j 1let …

JavaScript权威指南-总结

章2 词法结构 1.什么是字面量,标识符,保留字? 字面量即程序中的数据的值;标识符指数据的名字(字母、下划线_或美元符号$开头,为了和数值区分开,标识符不能用数字开头,)…

javascript 权威指南笔记

1.如果没有用var语句给一个变量指初始值,那么虽然这个变量被声明了,但是在给它存一个值之前,它的初始值就是 undefined 2.使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误。如果重复的声明有一个初始值&#xf…

【WCF】使用WCF测试客户端

【是什么】 WCF测试客户端(WCF Test Client)是一个用来测试WCF服务程序的调试工具,能够使开发WCF服务更加方便。 【打开方法】 有四种打开方式 1、找到Vs的安装路径,找到Common7\IDE\WcfTestClient.exe,双击打开。如…

WCF 介绍(一)

前言:WCF是微软基于SOA(Service Oriented Architecture)推出的.Net平台下的框架产品,它代表了软件架构设计与开发的一种发展方向,在微软的战略计划中也占有非常重要的地位。了解和掌握WCF,对于程序员特别是…

C#中如何使用WCF

一、什么是WCF Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分。由 .NET Framework 3.0 开始引入。 从我现在获得的知识,我理解的WCF重点是分布式&a…

WCF Debug 调试

关于WCF的调试,MSDN给出如下说明,可能是由于我的水平问题,个人无法完全看懂,所以自己总结了一点WCF的调试技巧。仅供参考。 如何开始调试 WCF 服务:  通常WCF可以部署成Windows service 和Web service。 1.对于WebService通常…

WebService,WCF,WebApi区别与特点

WebService,WCF,WebApi区别与特点 于 2019-06-10 10:11:00 发布7872 收藏 32 文章标签: c# 测试 操作系统 版权 在.NET平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API。在.NET平台…

WCF入门讲解

一、简单WCF服务TCP和HTTP传输协议 二、实例管理 1、实例管理-单调服务 介绍:单调服务的一个实例创建于每个方法调用之前,调用完成后会立即销毁该服务实例。 2、实例管理-会话 介绍:一个配置了私有会话的服务通常无法支持多达几十个&#x…

关于WCF服务的使用(非常详细的步骤)

(附上一篇对WCF基础讲解挺详细的一篇文章http://www.cnblogs.com/wayfarer/archive/2008/04/15/1153775.html) WCF是.NET提供的一种服务,可以将自己写的程序(完成特定功能,比如从数据库中读取数据操作等&#xff09…

WebService、WCF、WebAPI之间的区别

Web Service 1、它是基于SOAP协议的,数据格式是XML 2、只支持HTTP协议 3、它不是开源的,但可以被任意一个了解XML的人使用 4、它只能部署在IIS上 WCF 1、它是基于SOAP协议的,数据格式是XML 2、这个是Web Service(ASMX&#xff09…

WCF 简介

一、WCF概述 1) 什么是WCF? Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架。借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点。服务终结点可以是由 IIS 承载的持续可用的服务的一部分…

网络编程之WCF编程:WCF服务和客户端的建立,回调

1.概念 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口。它是.NET框架的一部分,由 .NET Framework 3.0 开始引入。 WCF的终结点有三个要素组成,分别是地址(Add…

WCF 学习总结2 -- 配置WCF

前面一篇文章《WCF 学习总结1 -- 简单实例》一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫。现在回过头来看看IDE提供的Wcf Service Library项目模板中的默认服务端配置文件——App.config里面…