《JavaScript高级程序设计》第2-3章 js中的数据类型和其他一些基本概念

《JavaScript高级程序设计》第2-3章

2HTML中使用JavaScript

<script>元素

这个元素由Netscape创造并在Netscape Navigator 2中首先实现。有几个个属性

Async:可选,表示应该立即下载脚本,但不妨碍页面中的其他操作,只适用于外部脚本;

defer:可选,表示脚本可以延迟到文档完全被解析和显示之后再执行,只适用于外部脚本;

src:表示包含要执行代码的外部文件;

type:可选,默认为text/javascript

带有src属性的<script>元素不应该在其<script>标签之间包含额外的JavaScript代码,如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码被忽略。

<script><img>元素非常相似,即它的src属性可以是指向当前的HTML页面所在域之外的某个域中的完整URL

<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。同defer相似,设置async告诉浏览器立即下载文件,但与defer不同的是,标记为async的脚本并不保证按照指定它们的先后顺序执行。

异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。


XHTML中使用javascript代码时,可以使用一个CData片段来包含javascript代码,不然解析可能会出现语法错误。

文档模式:准标准模式与标准模式非常接近,它们的差异几乎可以忽略不计,因此有人提到“标准模式”时,有可能是指这两种模式中的任何一种。

<noscript>元素:

在浏览器不支持脚本或支持脚本,但脚本被禁用时,显示noscript元素中的内容。


3基本概念

ECMAScript的语法大量借鉴了C及其类C语言(如JavaPerl)的语法。

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

标识符

第一个字符必须是一个字母、下划线或一个美元符号,其他字符可以是字母、下划线、美元符号或数字。

推荐使用驼峰

严格模式:ECMAScript5引入了严格模式的概念,严格模式是为JavaScript定义了一种不同的解析与执行模型。

关键字

breakdoinstancesoftypeofcaseelsenewvarcatchfinallyreturnvoidcontinueforswitchwhiledebuggerfunctionthiswithdefaultifthrowdeleteintry

保留字

abstractenumintshortbooleanexportinterfacestaticbyteextendslongsupercharfinalnativesynchronizedclassfloatpackagethrowsconstgotoprivatetransientdebuggerimplementsprotectedvolatitledoubleimportpublic

5版新增保留字:letyield

ECMA-2625版对evalarguments还施加了限制,在严格模式下,这两个名字也不能作为标识符或属性名。

变量

ECMAScript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。

在函数中定义变量省略var时,会创建一个全局变量。

可以使用一条语句定义多个变量,只要把每个变量(初始化或不初始化均可)用逗号分开即可。

数据类型:

ECMAScript中有5种简单数据类型(也称基本数据类型):UndefinedNullBooleanNumberString,还有1种复杂数据类型—Objectobject本质上是由一组无序的名值对组成的。

typeof操作符:检测给定变量的数据类型,返回下列某个字符串,注意是操作符不是函数

undefined如果这个值未定义

boolean如果这个值是布尔值

string如果这个值是字符串

number如果这个值是数值

object如果这个值是对象或null

funtion如果这个值是函数

Undefined类型

Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined

对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型,会返回undefined值。

Null类型

Null类型是第二个只有一个值的数据类型,这个特殊值是null。作为空对象指针

实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true

alert(null == undefined);   //true

Boolean类型

该类型只有两个值:truefalse

String类型:任何非空字符串—true     “”—false

Number类型:任何非零数字值(包括无穷大)—true     0NaN—false

Object类型:任何对象—true     null—false

Undefined类型:undefined—false

Number类型

其中,八进制字面值第一位必须是零,八进制在严格模式下是无效的,会导致支持的JavaScript引擎抛出错误;

十六进制字面值的前两位必须是0x

对于那些极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。

关于浮点数值计算会产生舍入误差的问题,是基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家。

如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值,Infinity是不能参与计算的,可以用isFinite()函数判断是否是有穷的。

NaN:即非数值是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。

两个特点:(1)任何涉及NaN的操作都会返回NaN;(2NaN与任何值都不相等,包括NaN本身。

isNaN()函数:这个函数接收一个参数,这个参数可以是任何类型,函数帮我们确定这个参数是否“不是数值”,isNaN在接收到参数后会尝试将这个值转换为数值。

isNaN(NaN)   //true

isNaN(10)   //false

isNaN(“10”)   //false(可以被转换成数值10

isNaN(“blue”)   //false

isNaN(true)   //false(可以被转换成数值1

数值转换

1)如果是Boolean值,truefalse将分别被转换为10

2)如果是数字值,只是简单的传入和返回

3)如果是null值,返回0

4)如果是undefined,返回NaN

5)如果是字符串,只包含数字则转换为对应数字、空字符串转换为0、字符串中包含其他字符转为NaN

parseInt(“”)   //NaN

parseFloat()   //只能解析十进制值,十六进制值会返回0

String类型

ECMAScript中用双引号和单引号表示的字符串完全相同。

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符。

数值、布尔值、对象和字符串值都有toString()方法。但nullundefined值没有这个方法。

Object类型

ECMAScript中的对象其实就是一组数据和功能的集合。

ECMAScript中,Object类型是所有它的实例的基础,换句话说,Object类型所具有的任何属性和方法同样存在于更具体的对象中。

操作符

递增和递减操作符直接借鉴自C

四个递增和递减操作符对任何值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象,先将其转换为数值再进行加减。

ECMAScript中的所有数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位的值转换为32位的整数,然后执行操作,最后再将结果转换回64位。

负数同样以二进制码存储,但使用的格式是二进制的补码:

1)求这个数值绝对值的二进制码;

2)求二进制反码,即将0替换位1,将1替换为0

3)得到的二进制反码加1

如果对非数值应用位操作符,会先自动转为数值。

按位非 按位与—&  按位或—| 按位异或—^  左移—<<(左移不会影响符号位) 有符号右移—>>(在符号位右边填补符号位) 无符号右移—>>>(在左侧填补0

逻辑非!(首先将它的操作数变为一个布尔值) 逻辑与—&&(属于短路操作)  逻辑或—||

逻辑与操作可以应用于任何类型的操作数,而不仅仅是布尔值,在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;

逻辑或操作与逻辑与操作类似,不一定返回布尔值。

ECMAScript中定义了3个乘性操作符:乘法、除法、求模

乘法:如果有一个操作数是NaN,则结果是NaN;如果是Infinity0相乘,则结果是NaN;如果是Infinity与非0相乘,则结果是Infinity-Infinity

除法:如果有一个操作数是NaN,则结果是NaN;如果两个操作数都是Infinity,则结果是NaN;如果是零被零除,则结果是NaN;如果是非零的有限数被零除,则结果是Infinity-Infinity

求模:如果被除数是无穷大而除数是有限大的数值,则结果是NaN;如果被除数是有限大而除数是零,则结果是NaN;如果是InfinityInfinity除,则结果是NaN;如果被除数是有限大的数值而除数是无穷大的数值,则结果是被除数;如果被除数是零,则结果是零。

加性操作符

如果有一个操作数是NaN,则结果是NaN

如果有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来。

减法操作符

如果一个数是NaN,则结果是NaN

如果有一个操作数是字符串、布尔值、nullundefined,则先在后台调用Number()函数将其转换为数值,然后再执行减法计算,如果转换的结果是NaN,则减法结果就是NaN

关系操作符:如果两个操作数都是字符串,则比较两个字符串对应的字符编码值;如果一个是数值,则将另一个操作数转换为一个数值,然后执行数值比较;任何操作数与NaN进行关系比较,结果都是false

相等不相等操作符:

如果有一个操作数是布尔值,则先转换成数值;如果一个是字符串,另一个是数值,则将字符串转换为数值;nullundefined是相等的;如果有一个操作数是NaN,则不相等;

由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。

for-in语句

for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。ECMAScript对象的属性没有顺序,因此,通过for-in循环输出的属性名的顺序是不可预测的。但是如果表示要迭代的对象的变量值为nullundefinedfor-in语句会抛出错误,ECMAScript5更正了这一行为。

breakcontinue语句

用于在循环中精确地控制代码的执行,其中,break语句会立即退出循环,强制继续执行循环后面的语句。而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。

breakcontinue语句都可以与label语句联合使用,从而返回代码中特定的位置。这种联合使用的情况多发生在循环嵌套的情况下。

with语句:

With语句的作用是将代码的作用域设置到一个特定的对象中,主要目的是为了简化多次编写同一个对象的工作。在严格模式下不允许使用with语句,否则将视为语法错误。

switch语句:

ECMAScript中的switch语句,可以使用任何数据类型(很多其他类型语言中只能使用数值);每个case的值不一定是常量,可以是变量,甚至是表达式;switch语句在比较值时使用的是全等操作符,因此不发生类型转换。

arguments对象:

严格模式下,重写arguments的值会导致语法错误。

ECMAScript中没有函数重载,如果定义了两个名字相同的函数,则该名字只属于后定义的函数。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值