JS -- 高程 -- chapter2、chapter3

一. 在HTML中使用JavaScript


1.1 <script>元素

HTML 4 为script标签定义了 6 个属性:

  1. async可选,表示应该立即下载脚本,但不应该影响页面其他操作,比如下载其他资源或等待加载脚本,只适用外部脚本
  2. charset : 可选,脚本的字符集,很少使用
  3. defer : 可选,标识脚本可以等到页面完全被解析和显示后才执行只适用外部脚本
  4. language : 已废弃
  5. src : 可选,指定外部脚本的地址
  6. type : 可选,指定脚本语言的内容类型,默认 text/javascript

在解释器将 script 标签内的内容执行完毕之前,页面中其它内容不会被浏览器加载或显示
 
解析外部 JavaScript 文件(包括下载该文件)时,页面的处理也会停止
 
具有 src 属性的 script 标签中的内嵌代码会被忽略,不会执行
 
 
script 标签的 src 属性可以跨域(JSONP),能够请求其它域的 js 文件
 
只要 script 标签不包含 deferasync 属性,则会按照 HTML 文档中的顺序依次解析

 
defer 属性相当于告诉浏览器,立即下载,但是延迟到页面解析完毕后执行(浏览器遇到 </html> 后,延迟脚本不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行)

async 属性的目的是不让页面等待 js 文件的下载和执行,不保证脚本会按顺序执行,脚本一定会在页面的 load 事件之前执行,但不一定在 DOMContentLoaded 之前执行

二. 基本概念


2.1 语法

ECMAScript 中的一切 变量、函数名、操作符 都区分大小写

 

2.2 数据类型

ECMAScript 中有 5 中基本数据类型: numberbooleanstringnullundefined,和一种复杂数据类型: object

  1. undefined : 声明了变量没有赋值则变量值为 undefined,typeof 未声明的变量也会返回 undefined 字符串
  2. null : 表示一个空指针对象,typeof 操作符返回 object
  3. boolean : 只有 true、false 两个字面值(True、False是普通变量名),可以对任何变量使用 Boolean() 将其转换为 boolean 值
  4. number : 整数可以以十进制、八进制、十六进制的字面值来表示,八进制第一位必须是 0,如果数值超出了范围(0~7),则按照十进制处理;十六进制需以 0x 开头,后跟的十六进制数字可以大写或者小写,进行算术运算时,所有八进制和十六进制都会被转换成十进制
  5. stringtoString 可以指定转换基数
  6. object : 所有对象都继承自 ObjectisPrototypeOf 可以确定是不是传入对象的原型

* 操作符

一元操作符

1. 递增( ++ )、递减( - - )

递增、递减对任何值都适用,不仅仅适用于整数,还适用于 字符串、布尔值、浮点数和对象。

并遵循以下规则:

  • 包涵 有效数字字符 的字符串先转成数字( 使用 Number 转换 ),再进行运算,原本字符串变量会变为数值变量
  • 包涵 非有效数字字符( 字母…),将变量设为 NaN( 因为使用 Number 转换 ),再进行运算,原本字符串变量会变为数值变量
  • 对于布尔值变量,将 false 转换为 0true 转换为 1,再进行运算,原布尔值变量转为数值变量
  • 浮点数直接进行运算操作
  • 对于对象,先调用对象的 valueOf 方法,对返回值应用前面的规则,若对象没有 valueOf 方法,则调用 toString 方法应用前面的规则,原本对象变量转为数值变量

2. 加( + )、减( - )

一元加操作符放在数值前面,不会对数值有任何影响,但对非数值应用一元加操作符时,该操作符会向 Number 一样去转换该变量,原变量的值不受影响

一元减操作符主要用于将数值变成负数,当对非数值应用时,会像一元加操作符一样先转换,再将获得的结果取负( 结果为正,返回负,结果为负,返回正 )

位操作符

ECMA 所有数值都以 64 位格式存储,但在操作时会将其转换为 32 位的整数,第 32 位表示符号,正数以 二进制 格式存储, 负数以 二进制补码 形式存储

当将一个负数以二进制字符串输出时,只会得到一个带负号的该值的绝对值的二进制

// 返回 "-100"
-4.toString(2)

对特殊的 NaNInfinity 值应用位操作时,这两个值会被当作 0 处理

对非数值应用位操作时,会先使用 Number 将其转换为数值,不会改变原变量

1. 按位非( ~ 一元)

结果就是返回操作数值的反码( 包括符号位 ),按位非的操作本质是:操作数的负值减 1 ( 负数是按二进制补码形式存储的 )

2. 按位与( & )

将两个操作数的 每一位 都比较,只有同一位的都是 1 ,相应位返回 1,否则返回 0


a: 1 1 0 0 1
b: 0 0 0 1 1
  0 0 0 0 1 // => 结果

3. 按位或( | )

将两个操作数的 每一位 都比较,只有同一位的都是 0,相应位返回 0,否则返回 1


a: 1 1 0 0 1
b: 0 0 0 1 1
  1 1 0 1 1 // => 结果

4. 按位异或( ^ )

只有两个操作数同一位上的数不相同时,才返回 1,相同则返回 0


a: 1 1 0 0 1
b: 0 0 0 1 1
  1 1 0 1 0 // => 结果

5. 左移( << )

会将操作数所有位向左移动指定的位数( 符号位除外 ) ,右面空出的位数补 0
2 << 5 // => 64 - 1000000

6. 有符号右移( >> )

将操作数所有位向右移动指定位数( 符号位除外 ),左侧空出的位数使用符号位的数值来填充( 正数填充 0 ,负数填充 1 )

7. 无符号右移( >>> )

会将 32 位全部向右移动指定位数,左侧空位以 0 填充,而且会将表示负数的二进制补码当成表示正数的二进制码

布尔操作符

1. 逻辑非( ! )

将操作数转换为布尔值再取反

2. 逻辑与( && )

只有两个操作数都为真,才会返回真

逻辑与可以应用于任何类型的操作数,只要有一个操作数不是布尔值,则返回结果可能就不是布尔值

逻辑与属于短路操作,如果第一个操作数就能决定结果( false ),那么就不会对第二个操作数求值

返回结果遵循一下规则:

  • 两个操作数都能够表示为 true,则返回第二个操作数
  • 只要有一个操作数表示为 false,则返回该操作数

例:
1 && 2 // => 2
1 && 0 // => 0
0 && 1 // => 0

3. 逻辑或( || )

与逻辑或一样,只要有一个操作数不是布尔值,则返回可能不是布尔值

逻辑或也是短路操作符,只要第一个操作数能够确定结果( true ),则不会对第二个操作数进行求值

返回结果遵循一下规则:

  • 只要有一个操作数能表示为 true,则返回该操作数
  • 两个操作数都表示为 false,则返回第二个操作数
乘性操作符

乘性操作符包括:乘法、除法、求模,在操作数为非数值的情况下,会先调用 Number 进行转换

1. 乘法( * )

规则:

  1. 乘积超过表示范围,使用 Infinity 表示
  2. 有一个操作数为 NaN,则返回 NaN
  3. Infinity与 0 相乘,返回 NaN

2. 除法( / )

规则:

  1. 商超过表示范围,则使用 Infinity 或者 -Infinity 表示
  2. 有一个操作数为 NaN,则返回 NaN
  3. InfinityInfinity 除,返回 NaN
  4. 零 被 零 除,返回 NaN
  5. 任何数除以 0 ,返回 Infinity 或者 -Infinity

3. 求模( % )

规则:

  1. 被除数无限大,除数有限大,则返回 NaN ( Infinity % 2 // => NaN )
  2. 除数为 0 ,返回 NaN
  3. 无限大 被 无限大 除,返回 NaN
  4. 被除数为 0 ,返回 0
关系操作符

非数值转换规则:

  1. 若两个操作数都是字符串,则比较两个字符串的字符编码值( "A" < "a" // => true )
  2. 如果有一个操作数是数值,则将另一个操作数转换为数值( Number ),再进行比较
  3. 如果一个操作数是对象,则先调用 valueOf 方法,再依照前面的规则比较,如果没有 valueOf 方法,则调用 toString 方法,再按照前面规则比较

任何数和 NaN 比较,都返回 false

相等操作符

相等、不想等:先转换,再比较
全等、不全等:仅比较,不转换

相等、不想等转换规则:

  • 如果有一个操作数是布尔值,则在比较之前,先将其转换为数值
  • 如果一个操作数是字符串,一个是数值,则比较前先将字符串转换为数值( Number )
  • 若有一个操作数是对象,则先调用其 valueOf 方法,将得到的结果按照前面的规则进行比较
  • nullundefined 是相等的
  • 有一个操作数为 NaN,返回 false
  • 两个对象比较地址是否指向同一对象

 

函数

函数参数使用 arguments 类数组 接收,它和命名参数永远是同步的,但是它们的内存空间是独立的

arguments 的长度由传入的参数个数决定,而不是由声明的参数列表个数决定

 
没有函数重载,后定义的函数总会覆盖先定义的函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值