第3章 类型、值和变量

3.2 文本

3.2.1 字符串直接量

建议:在javascript中使用单引号表示字符串,在HTML中使用双引号表示字符串;

3.2.2 转义字符

\n 换行符

\r 回车符

3.3 布尔值

undefined null 0 -0 NaN "" 会转化为false,其他值转化为true

3.6 包装对象

字符串通过new String()构造函数创建一个临时对象,这个对象继承了字符串的方法,并被用来处理属性的引用,一旦引用结束,这个对象自动销毁。

数字和布尔值也具有各自的方法 Number() Boolean()

null和undefined没有包装对象

3.10 变量作用域

在函数体内,局部变量的优先级高于同名的全局变量

第5章 语句

严格模式和非严格模式之间的区别:

  • 严格模式中禁止使用with语句
  • 严格模式中所有变量要先声明,否则将会抛出一个引用错误异常
  • 严格模式用调用的函数中的一个this值是undefined,在非严格模式中,this值总是全局变量。这可以用来判断是否支持严格模式var hasStrictMode = (fuction(){"use strict";return this === undefined}())
  • 严格模式中,当通过call()或apply()来调用函数时,其中的this就是call()或apply()传入的第一个参数
  • 严格模式中,给只读属性和给不可扩展的对象创建新成员都将抛出一个类型错误
  • 严格模式中,传入eval()的代码不能再调用程序所在的上下文中声明变量或定义函数
  • 严格模式中,函数里的arguments对象拥有传入函数值的静态副本,在非严格模式中,arguments里的数组元素和函数参数都指向同一个值的引用
  • 严格模式中试图删除一个不可配置的属性将抛出一个类型错误
  • 严格模式中,在一个对象直接量中定义两个或多个同名属性将产生一个语法错误
  • 严格模式中,函数声明中存在两个或多个同名参数将产生一个语法错误
  • 严格模式中,不允许使用八进制直接量
  • 严格模式中,arguments,caller和arguments.callee都将抛出一个类型错误。

第6章 对象

6.1 创建对象

6.1.3 原型

object.prototype没有原型对象,它不继承任何属性,所有内置函数都继承自它

6.1.4 Object.create()

使用Object.create()创建一个新对象,其中第一个参数是这个对象的原型

var o = Object.create(null); //o是一个没有原型的对象

6.2 属性的查询和设置

当使用方括号([])运算符来获取属性的值时,方括号内的表达式必须返回字符串,或者是一个可以返回字符串的值

6.3 删除属性

delete运算符只能删除自有属性,不能删除继承属性。

delete表达式删除成功后,返回true

6.4 检测属性

propertyIsEnumerable()只有检测到是自有属性,且这个属性的可枚举性为true时才返回true

6.5 枚举属性

对象继承的内置方法不可枚举,但在代码中给对象添加的属性都是可枚举的(除非将他们转换为不可枚举的)

ECMAScript5定义了两个用以枚举属性名称的函数:

  • Object.keys(),返回一个由对象中可枚举的自有属性的名称组成的数组
  • Object.getOwnPropertyNames(),只返回对象的所有自有属性的名称

第7章 数组

7.5 数组元素的添加和删除

用delete删除数组元素与为其赋undefined值是类似的,注意:使用delete删除数组元素的时候不会修改数组的length属性

7.8.3 sort()

为了按照其他方式而非字符顺序进行数组排序,必须给sort()方法传递一个比较函数,该函数决定了它的两个参数在排好序的数组中的先后顺序。假设第一个参数在前,比较函数应该返回一个小于0的数,第一个参数在后,比较函数返回一个大于0的数

7.9 ECMAScript5中定义的数组方法

  1. forEach() 该方法遍历数组,为每个元素调用指定的函数
  2. map()该方法调用数组的每个元素传递给指定的函数,并返回一个数组。
    var a = [1,2,3];
    b = a.map(function(x){
    return x*x
    }); //b = [1,4,9]
  3. filter()该方法返回的数组元素是调动的数组的一个子集,传递的函数是用来逻辑判定的
    var a = [1,2,3,4,5];
    samllValue = a.filter(function(x){
    return x < 3
    }); //[1,2]
  4. every()和some()

    every()当且仅当针对数组中所有元素调用判定函数都返回true,它才返回true。

    some()当针对数组中所有元素调用判定函数都返回false,它才返回false
    var a = [1,2,3,4,5];
    a.every(function(x){ return x < 0 }) //true
    a.every(function(x){ return x % 2 === 0}) //false
    a.some(function(x){ return x % 2 === 0 }) //true
    a.some(isNaN) //false

一旦every()和some()确认返回什么值他们就会停止遍历数组元素

5. reduce()和reduceRight() 使用指定的函数将数组元素进行组合,生成单个值

javascript var a = [1,2,3,4,5]; var sum = a.reduce(function(x,y){return x + y },0); //15 var max = a.reduce(function(x,y){ return (x>y) ? x : y;}) //5

reduce()第一个参数执行化简操作的函数,该函数的x参数是数组的元素,y参数是上一次操作的结果值,第二个参数是一个传递给函数的初始值,当没有初始值时默认为数组第一个元素

reduceRight()按照数组的索引从高到低处理数组

7.11 类数组对象

javascript数组的一些特性是其他对象所没有的:

  • 当有新的元素添加到列表时,自动更新length属性
  • 设置length属性为一个较小值时将截断数组
  • 从Array.prototype中继承一些有用的方法
  • 其类属性为Array

第8章 函数

8.7 函数的属性方法和构造函数

8.7.3 call()和apply()

要想以对象o的方法来调用f函数,可以这样使用:

f.call(o)
f.apply(o)

call()和apply()的第一个实参是要调用函数的母体,在函数内通过this来获得它的引用

区别:

对call()来说,第一个实参之后的所有实参都是要传入待调用函数的值,所传入参数一一列出

apply()第一个实参之后的参数可以以参数数组的形式传入

8.7.4 bind()

当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新函数。新函数将会把原始函数f()当做o的方法来调用,传入新函数的任何实参都将传入原始函数

function f(y){ return this.x + y; }
var o = { x : 1};
var g = f.bind(o);
g(2) //3

第9章 类和模块

9.2 类和构造函数

9.2.1 构造函数和类的标识符

a instanceof b 本质是检测a对象是否继承自b.prototype

第10章 正则表达式的模式匹配

10.1 正则表达式的定义

一个正则表达式直接量会在执行到它时转化为一个正则对象,同一段代码每次运算都返回同一个对象

10.1.1 直接量字符
^ $ . * + ? = ! : | \ / () [] {}

在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀\

10.1.2 字符类

将直接量字符单独放进方括号内就组成了字符类,一个字符类可以匹配它所包含的任意字符

/[abc]/        匹配a,b,c中任意一个
/[^abc]/ 匹配abc之外的所有字符
/[a-zA-Z0-9]/ 匹配拉丁字母表中任何字母和数字
/[...]/ 匹配方括号内任意字符
/[^...]/ 匹配不在方括号内任意字符
/./ 匹配除换行符和其他Unicode行终止符之外的任意字符
/\w/ 匹配任何ASCII字符组成的单词 等价于/[a-zA-Z0-9]/
/\W/ 匹配任何不是ASCII字符组成的单词 等价于/[^a-zA-Z0-9]/
/\d/ 匹配任何ASCII数字 等价于/[0-9]/
/\D/ 匹配除ASCII数字之外的任何字符 等价于/[^0-9]/
/\s/ 匹配任何Unicode空白符
/\S/ 匹配任何非Unicode空白符
10.3 重复

正则表达式的重复字符语法

{n,m}          匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或者更多
{n} 匹配前一项n次
? 匹配前一项0次或1次 等价于{0,1}
+ 匹配前一项1次或多次 等价于{1,}
* 匹配前一项0次或多次 等价于{0,}

使用?,*时要注意,由于这些字符串可能匹配0个字符,因此他们允许什么都不匹配

非贪婪的重复

非贪婪的重复即尽可能少的匹配,只须在待匹配的字符后跟随一个问号即可

10.1.4 选择分组和引用

字符"|"用于分隔供选择的字符

/\d{3}|[a-z]{4}/匹配的是三位数字或者四个小写字母

注意选择项的匹配次序是从左到右,直到发现匹配项,如果左边的选择项匹配,就忽略右边的匹配项

正则表达式圆括号的多种用途:

  • 把单独的项组成子表达式,以便通过"*+?|"进行修饰 /java(script)?/
  • 允许在同一正则表达式的后部引用前面的子表达式 \1引用的是第一个带圆括号的子表达式
|       匹配的是该表达式左边或右边的子表达式
(...) 将几个项组合为一个单元,这个单元可通过“*”,“+”,“?”和“|”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?...) 只组合,把项组合带一个单元,但不记忆与该组相匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式
10.1.5 指定匹配位置
^       匹配字符串的开头,在多行检索中匹配一行的开头
$ 匹配字符串的结尾,在多行检索中匹配一行的结尾
\b 匹配一个单词的边界,简言之就是位于字符\w和\W之间的位置,或位于字符\W和字符串的开头或者结尾之间的位置
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不包括匹配p的那些字符
(?=p) 零宽负向先行断言,要求接下来的字符都不与p匹配
10.1.6 修饰符
  • i 执行不区分大小写的匹配
  • g 执行一个全局匹配
  • m 多行匹配模式

10.2 用于模式匹配的string

search() 返回第一个与之匹配的子串的起始位置,如果找不到匹配则返回-1。该方法不支持全局检索

"javascript".search(/script/i);  //4

replace() 用于检索与替换操作

第一个参数是一个正则表达式,第二个参数是要进行替换的字符串。如正则表达式不带修饰符g,则只替换所匹配的第一个子串

text.replace(/javascript/gi,"JavaScript");
var quote = /"([^"]*)"/g;
text.replace(quote,'"$1"');

match(正则表达式) 返回的是一个由匹配结果组成的数组

"1 plus 2 euqals 3".match(/\d+/g);   //["1", "2", "3"]

split() 这个方法用以将调用它的字符串拆分为一个子串组成的数组

"1, 2, 3, 4".split(/\s*,\s*/);   //["1","2","3","4"]

《Javascript权威指南-第6版》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. gulp 使用入门

    什么是gulp? 用自动化构建工具增强你的工作流程! Gulp 是基于node.js的一个前端自动化构建工具,开发者可以使用它构建自动化工作流程(前端集成开发环境). 使用gulp你可以简化工作量,让 ...

  2. Gen对于break、continue与return的处理

    void tryItOut () {} void wrapItUp () {} void tryFinally() { for (int i = 0; i < 2; i++) { try { t ...

  3. JavaScript -- Opener

    -----028-Window-Opener.html----- <!DOCTYPE html> <html> <head> <meta http-equiv ...

  4. CVPR2019 | Mask Scoring R-CNN 论文解读

    Mask Scoring R-CNN CVPR2019 | Mask Scoring R-CNN 论文解读 作者 | 文永亮 研究方向 | 目标检测.GAN 推荐理由: 本文解读的是一篇发表于CVPR ...

  5. j2ee高级开发技术课程第七周

    来源:https://baike.baidu.com/item/JSON/2462549?fr=aladdin JSON(JavaScript Object Notation, JS 对象标记) 是一 ...

  6. mysql pdo设置显示报错

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    

  7. JavaWeb 简单实现客户信息管理系统

    项目介绍 本项目使用Jsp+Servlet+MySQL实现 功能介绍 查询客户信息:查询数据库中所有客户信息,分页展示 添加客户信息:创建新客户并添加到数据库中 搜索客户信息:根据用户的输入查询客户信 ...

  8. Nginx+uwsgi+Django 的web应用环境部署-完整记录

    Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...

  9. 浅谈.net jenkins svn下自动化集成环境安装 搭建 配置

    本人做.net研发已有3年多了,之前一直偏向于技术研究,自己学了很多技术,现在突然发现学了那么多技术有什么用呢?真正用到的并不多. 现在?算是一只小鸟吧,自嘲下.....毕竟我是90后,很多领导对于9 ...

  10. 设置ul水平居中

    <div class="jdcg-menu-nav"> <ul> <li>基本信息</li> <li>阶段资料</ ...