权威指南(摘录)
2020-07-15 12:37:23 13 举报
AI智能生成
前端程序员必备的js css html 权威指南 摘录(主观摘录) 针对重要知识点 会提供额外连接
作者其他创作
大纲/内容
JavaScript
JavaScript简介与概述
表达式与语句
实际上,语句和表达式之间有很多共同之处,粗略地讲,表达式仅仅计算出一个值但并不作任何操作,它并不改变程序的运行状态。而语句并不包含一个值(或者说它包含的值我们并不关心
词法结构
定义
编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序。作为语法的基础,它规定了诸如变量名是什么样的、怎么写注释,以及程序语句之间如何分隔等规则。本章用很短的篇幅来介绍JavaScript的词法
字符集
1.JavaScript是区分大小写的语言 HTML并不区分大小写(尽管XHTML区分大小写)
2.Unicode标准为所有字符定义了一个首选的编码格式,并给出了一个标准化的处理方式将文本转换为一种适合比较的标准格式,JavaScript会认为它正在解析的程序代码已经是这种标准格式,不会再对其标识符、字符串或正则表达式作标准化处理
可选分号
省略或自动补充
独占一行 或 程序结尾或右花括号“}”之前的分号
当前语句和随后的非空格字符不能当成一个整体来解析的话 JS会自动补充分号
易错规则
1.一条语句以“(”、“[”、“/”、“+”或“-”开始,那么它极有可能和前一条语句合在一起解析
2.在涉及return、break和continue语句的场景中。如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号
3.如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同时“++”或“--”将会作为下一行代码的前缀操作符并与之一起解析
类型、值和变量
数字
JS中实际的操作(如数组索引)都是基于32位整数
算术运转存在 溢出 下溢 或被零整除时 不会报错 超过js所能表示数字上线(溢出) 结果为 infinity
JavaScript中有一个类似的函数isFinite(),在参数不是NaN、Infinity或-Infinity的时候返回true。
当在JavaScript中使用实数的时候,常常只是真实值的一个近似表示。
avaScript采用了IEEE-754浮点数表示法(几乎所有现代编程语言所采用),这是一种二进制表示法,可以精确地表示分数,比如1/2、1/8和1/1024。遗憾的是,我们常用的分数(特别是在金融计算方面)都是十进制分数1/10、1/100等。二进制浮点数表示法并不能精确表示类似0.1这样简单的数字
由于舍入误差,0.3和0.2之间的近似差值实际上并不等于0.2和0.1之间的近似差值。这个问题并不只在JavaScript中才会出现,理解这一点非常重要:在任何使用二进制浮点数的编程语言中都会有这个问题,x-y的值非常接近彼此和最终的正确值。这种计算结果可以胜任大多数的计算任务:这个问题也只有在比较两个值是否相等的时候才会出现。
文本
字符串(string)是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集,JavaScript定义的各式字符串操作方法均作用于16位值,而非字符,且不会对代理项对做单独处理,同样JavaScript不会对字符串做标准化的加工,甚至不能保证字符串是合法的UTF-16格式。
转义字符
当使用单引号来定界字符串时,需要格外小心英文中的缩写和所有格写法,比如can’t和O’Reilly’s。因为撇号和单引号是同一个字符,所以必须使用反斜线(\\)来转义所有的撇号。
另一个例子是上节中提到的转义字符\\',表示单引号(或撇号)。当需要在一个单引号定界的字符串内使用撇号的时候,它就显得非常有用。现在你就会明白我们为什么把它们叫做转义字符了,因为反斜线可以使我们避免使用常规方式解释单引号,当单引号不是用来标记字符串结尾时,它只是一个撇号
字符串长度
包含16位值的个数
null与undefined
使用建议
你或许认为undefined是表示系统级的、出乎意料的或类似错误的值的空缺,而null是表示程序级的、正常的或在意料之中的值的空缺。如果你想将它们赋值给变量或者属性,或将它们作为参数传入函数,最佳选择是使用null。
包装对象
存取字符串、数字或布尔值的属性时创建的临时对象称做包装对象,它只是偶尔用来区分字符串值和字符串对象、数字和数值对象以及布尔值和布尔对象。
应用
字符串既然不是对象,为什么它会有属性呢?只要引用了字符串s的属性,JavaScript就会将字符串值通过调用new String(s)的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)
类型转换
if语句将undefined转换为false,但“==”运算符从不试图将其操作数转换为布尔值。
toString()
日期
日期类(Date class)定义的toString()方法返回了一个可读的(可被JavaScript解析的)日期和时间字符串
数组
将元素转为一个字符串 并在元素间添加逗号后合成字符串
函数
返回函数的JavaScript源码字符串
JavaScript中的某些运算符会做隐式的类型转换,有时用于类型转换。如果“+”运算符的一个操作数是字符串,它将会把另外一个操作数转换为字符串。一元“+”运算符将其操作数转换为数字。同样,一元“!”运算符将其操作数转换为布尔值并取反
valueof()
如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示为一个原始值,因此默认的valueOf()方法简单地返回对象本身,而不是返回一个原始值。数组、函数和正则表达式简单地继承了这个默认方法,调用这些类型的实例的valueOf()方法只是简单返回对象本身
日期类定义的valueOf()方法会返回它的一个内部表示:1970年1月1日以来的毫秒数。
对象转为原始值
To Boolean
所有的对象(包括数组和函数)都转换为true。对于包装对象亦是如此:new Boolean(false)是一个对象而不是原始值,它将转换为true。
To (string || number)
详解
string
有toString() 调用此方法
结果为原始值 则直接转为字符串
若结果不为原始类型 则使用valueOf()
无toString() 调用valueOf方法
若结果不为原始类型 转为字符串
否则,JavaScript 无法从 toString 或者 valueOf 获得一个原始值,这时它将抛出一个类型错误异常。
number
规则与转为string一样 只是优先调用 valueOf 再根据返回类型 做转换 (若为原始值 再使用toString)
note
如果将对象和一个原始值比较,则转换将会遵照对象到原始值的转换方式进行。
+”和“==”应用的对象到原始值的转换包含日期对象的一种特殊情形。日期类是JavaScript语言核心中唯一的预先定义类型,它定义了有意义的向字符串和数字类型的转换
对于所有非日期的对象来说,对象到原始值的转换基本上是对象到数字的转换(首先调用valueOf()),日期对象则使用对象到字符串的转换模式,然而,这里的转换和上文讲述的并不完全一致:通过valueOf或toString()返回的原始值将被直接使用,而不会被强制转换为数字或字符串
和“==”一样,“<”运算符以及其他关系运算符也会做对象到原始值的转换,但要除去日期对象的特殊情形:任何对象都会首先尝试调用valueOf(),然后调用toString()。不管得到的原始值是否直接使用,它都不会进一步被转换为数字或字符串
变量作用域
作用域链
调用这个函数时,它创建一个新的对象来存储它的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的“链”
对于嵌套函数来讲,事情变得更加有趣,每次调用外部函数时,内部函数又会重新定义一遍。因为每次调用外部函数的时候,作用域链都是不同的。内部函数在每次定义的时候都有微妙的差别——在每次调用外部函数时,内部函数的代码都是相同的,而且关联这段代码的作用域链也不相同。
表达式和运算符
表达式(expression)JavaScript中的一个短语,JavaScript解释器会将其计算(evaluate)出一个结果。程序中的常量是最简单的一类表达式。变量名也是一种简单的表达式,它的值就是赋值给变量的值。复杂表达式是由简单表达式组成的
例如: 数组访问表达式是由一个表示数组的表达式、左方括号、一个整数表达式和右方括号构成。它们所组成的新的表达式的运算结果是该数组的特定位置的元素值。同样的,函数调用表达式由一个表示函数对象的表达式和0个或多个参数表达式构成
对象和数组的表达式初始化
JavaScript对数组初始化表达式进行求值的时候,数组初始化表达式中的元素表达式也都会各自计算一次。也就是说,数组初始化表达式每次计算的值有可能是不同的
对象创建表达式
当计算一个对象创建表达式的值时,和对象初始化表达式通过{}创建对象的做法一样,JavaScript首先创建一个新的空对象,然后,JavaScript通过传入指定的参数并将这个新对象当做this的值来调用一个指定的函数。这个函数可以使用this来初始化这个新创建对象的属性。那些被当成构造函数的函数不会返回一个值,并且这个新创建并被初始化后的对象就是整个对象创建表达式的值。如果一个构造函数确实返回了一个对象值,那么这个对象就作为整个对象创建表达式的值,而新创建的对象就废弃了。
运算符概述
运算符的副作用
有一些表达式则具有很多副作用,前后的表达式运算会相互影响。赋值运算符是最明显的一个例子:如果给一个变量或属性赋值,那么那些使用这个变量或属性的表达式的值都会发生改变。“++”和“--”递增和递减运算符与此类似,因为它们包含隐式的赋值。delete运算符同样有副作用:删除一个属性就像(但不完全一样)给这个属性赋值undefined。其他的JavaScript运算符都没有副作用,但函数调用表达式和对象创建表达式有些特别,在函数体或者构造函数内部运用了这些运算符并产生了副作用的时候,我们说函数调用表达式和对象创建表达式是有副作用的
运算符优先级
子主题
按照运算符的优先级排序的,前面的运算符优先级要高于后面的运算符优先级。被水平分割线分隔开来的运算符具有不同的优先级。标题为A的列表示运算符的结合性,L(从左至右)或R(从右至左),标题为N的列表示操作数的个数。标题为“类型”的列表示期望的操作数类型,以及运算符的结果类型(在“→”符号之后)
0 条评论
回复 删除
下一页