【读书笔记】JavaScript高级程序设计(第3版)

1 JavaScript简介

1.1 JavaScript简史

JavaScript是由Netscape公司于1995年开发的脚本语言。于1997年,JavaScript1.1为蓝本提交给欧洲计算机制造商协会(ECMA, European Computer Manufacturers Association),完成了ECMA-262,即ECMAScript新脚本语言的标准。1998年,ISO/IEC(International Organization for Standardization and International Electrotechnical Commission,国际标准化组织和国际电工委员会)采用ECMAScript作为标准(即ISO/IEC-262)。

1.2 JavaScript实现

一个完整的JavaScript实现由三部分组成,即:

  • 核心(ECMAScript),由ECMA-262定义,提供语言核心功能;
  • 文档对象模型(DOM),提供访问和操作网页内容的方法和接口;
  • 浏览器对象模型(BOM),提供与浏览器交互的方法和接口。

这里写图片描述

1.3 ECMAScript

ECMAScript与Web浏览器没有依赖关系,Web浏览器只是ECMAScript实现可能的宿主环境之一。Node(一种服务端JavaScript平台)和Adobe Flash也是ECMAScript的宿主环境。ECMA-262标准主要规定了ECMAScript语言的以下组成部分:语法、类型、语句、关键字、保留字、操作符、对象。
ECMAScript的版本更迭如下图所示,如今已发布到第6个版本了。其中绿色背景表示发布的是正式版本。
这里写图片描述

1.4 浏览器对于ES5支持情况

支持ECMAScript 5的浏览器有

  • Internet Explorer 9+*
  • Opera 11.6+
  • Safari 5.1+**
  • Chrome 13+
  • Firefox 4+
*  IE9不支持严格模式,IE10添加
** Safari 5.1 仍不支持Function.prototype.bind,尽管Function.prototype.bind现已被Webkit所支持

支持完整ECMAScript 6的浏览器几乎没有,详细信息可见http://kangax.github.io/compat-table/es6/

1.5 文档对象模型(DOM)

文档对象模型(DOM,Document Object Model)是针对XML但经过扩展用于HTML的应用程序编程接口(API,Application Programming Interface)。

DOM核心规定的是如何映射基于XML的文档结构,以便简化对文档中任意部分的访问和操作。

DOM级别见下图所示,每一级都对上一级做了补充和修改:
这里写图片描述

W3C(World Wide Web Consortium,万维网联盟)规划DOM是为了保持Web跨平台的天性,防止Web开发领域出现技术上的两强(Netscape和微软)割据的局面。

1.6 浏览器对象模型(BOM)

浏览器对象模型(BOM,Browser Object Model)提供了编程接口,用于访问和操作浏览器窗口。开发人员使用BOM可以控制浏览器显示的页面以外的部分。
从根本上讲,BOM只处理浏览器窗口和框架;但人们习惯上也把所有针对浏览器的JavaScript扩展算作BOM的一部分。下面就是一些这样的扩展:

  • 弹出浏览器窗口的功能;
  • 移动、缩放和关闭浏览器窗口的功能;
  • 提供浏览器详细信息的navigator对象;
  • 提供浏览器所加载页面的详细信息的location对象;
  • 提供用户显示器分辨率详细信息的screen对象;
  • 对cookies的支持;
  • 像XMLHttpRequest和IE的ActiveXObject这样的自定义对象。

2 语法和数据类型

2.1 语法

  • ECMAScript中一切变量、函数名和操作符都区分大小写
  • 标识符(变量、函数、属性的名字,或函数的参数)有以下要求:
    • 首字符必须是一个字母、下划线(_)或一个美元符号($)
    • 其他字符可以是字母、下划线、美元符号或数字
    • 不建议使用扩展的ASCII或Unicode字母字符
    • 建议使用驼峰大小写格式
  • 严格模式(strict mode)
    • 为JavaScript定义了一种不同的解析和执行模型
    • 对ECMAScript 3中的一些不确定行为进行处理,对某些不安全操作抛出错误
  • EMCAScript的变量是松散类型(可以保存任何类型的数据)
    • 使用var定义的变量,是其作用域中的局部变量
var message; // 全局变量 undefined
function test(){
    var message = "hi";   // 局部变量
}

2.2 数据类型

ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型—Object,Object实质上是由一组无序的名值对组成的。因为ECMAScript是松散类型的,所以提供typeof操作符这种手段,来检测给定变量的数据类型。对一个值使用typeof操作符可能返回下列某个字符串:

  • “undefined”- 如果这个值未初始化或未声明
  • “boolean”- 如果这个值是布尔值;
  • “string”- 如果这个值是字符串;
  • “number”- 如果这个值是数值;
  • “object”- 如果这个值是对象或null
  • “function”- 如果这个值是函数。

Boolean类型

console.log(null == undefined);         // true,undefined值是派生自null值的
console.log(Boolean("Hello World!"));   // true,任何非空字符串
console.log(Boolean(""));               // false,空字符串
console.log(Boolean(-1));               // true,任何非零数字值(包括无穷大)
console.log(Boolean(0) && Boolean(NaN));// false
console.log(Boolean(Object));           // true,任何对象
console.log(Boolean(null));             // false
console.log(Boolean(undefined));        // false                

Number类型

// 整数
var intNum1 = 55;           // 整数 55
var intNum2 = 1.;           // 整数 1
var intNum3 = 10.0;         // 整数 10
// 浮点数
var floatNum1 = 1.1;        // 浮点数 1.1
var floatNum2 = .1;         // 浮点数 0.1 有效,但不推荐
// 科学计数法
var floatNum3 = 3.125e7;    // 浮点数 31250000 科学计数法
var floatNum4 = 3e-7;       // 浮点数 0.0000003 ,对于小数点后带有6个零以上的浮点数值,ECMAScript会将其转换为以e表示的数值
// 精度
var bool = ((0.1 + 0.2) == 0.3);                    //false,浮点数值最高精度是17位小数,算术计算精度远远不如整数,0。1 + 0.2 = 0.30000000000000004。
// 检查数值是否为无穷
console.log(isFinite(Number.NEGATIVE_INFINITY));    // false,负无穷
console.log(isFinite(Number.POSITIVE_INFINITY));    // false,正无穷
console.log(isFinite(Number.MAX_VALUE));            // true
console.log(isFinite(Number.MAX_VALUE + Number.MAX_VALUE));     // true
// 非数值类型
console.log(NaN);                   // NaN,即非数值(Not a Number)是一个特殊的数值
console.log(NaN/10);                // NaN,任何涉及NaN的操作都会返回NaN
console.log(NaN == NaN);            // false;
// 检查是否为非数值类型
console.log(isNaN(NaN));            // true
console.log(isNaN(10));             // false,10是一个数值
console.log(isNaN("10"));           // false,可以被转换为数值10
console.log(isNaN("blue"));         // true,不能被转换为数值
console.log(isNaN(true));           // false,可以被转换为数值1
// 强制转换为数值类型
var num1 = Number("Hello World!");      // NaN
var num2 = Number("");                  // 0
var num3 = Number("0000011");           // 11
var num4 = Number(true);                // 1
// 强制转换为整数类型
var num5 = parseInt("1234blue");        // 1234
var num6 = parseInt("");                // NaN
var num7 = parseInt("0xA");             // 10(十六进制数)
var num8 = parseInt("22.5");            // 22.5
var num9 = parseInt("070");             // ES3认为是八进制数56,ES5认为是十进制数70
var num10 = parseInt("70");             // 70(十进制数)
var num11 = parseInt("0xAF", 16);       // 175,作为16进制来解析0xAF
// parseFloat
var num12 = parseFloat("1234blue");     // 1234(整数,优先解析为整数)
var num13 = parseFloat("3.125e7");      // 31250000

String类型

  • 字符字面量,即转义序列
字面量含义
\n换行
\t制表
\b空格
\r回车
\f进纸
\\斜杠
\’单引号
\”双引号
\xnn以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示“A”
\unnnn以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ
  • 数值、布尔值、对象和字符串值均有toString()方法,但null和undefined值没有这个方法
var age = 11;                       
var ageAsString10 = age.toString();     // "11"
var ageAsString16 = age.toString(16);   // "b"

var found = true;
var foundAsString1 = found.toString();  // "true"

// 在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String()
var nullObject = null
var undefinedObject;
var foundAsString2 = String(found);             // "true",如果值有toString()方法,则调用该方法并返回相应结果
var nullAsString = String(nullObject);          // "null"
var undefinedAsString = String(undefinedObject);// "undefined"

Object类型

// 创建对象 
var o = new Object();
var o = new Object;     // 有效,但不推荐省略圆括号

Object类似所具有的任何属性和方法同样存在于更具体的对象中:

  • Constructor:保存着用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例(而不是实例的原型)中是否存在。
  • isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路易斯·李

点个赞再走呗 :)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值