javascript高级程序设计第四版读书笔记-第五章 基本引用类型

19.如何创建一个指定的本地时间?
Dete只能接收时间戳,有两种方法可以将字符串参数变为时间戳,他们是Date隐式调用的,
分别是Date.parse() 创建的是GTM时间,Date.UTC()创建的是本地时间
Date.UTC()方法也返回日期的毫秒表示,但使用的是跟 Date.parse()不同的信息来生成这个值。
传给 Date.UTC()的参数是年、零起点月数(1 月是 0,2 月是 1,以此类推)、日(131)、时(023)、 分、秒和毫秒。这些参数中,只有前两个(年和月)是必需的。如果不提供日,那么默认为 1 日。其他
参数的默认值都是 0。下面是使用 Date.UTC()的两个例子:
// GMT 时间 2000 年 1 月 1 日零点

let y2k = new Date(Date.UTC(2000, 0)); 

// GMT 时间 2005 年 5 月 5 日下午 5 点 55 分 55 秒

let allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); // 年月日

20.如何记录一个代码运行的时间?
ECMAScript 还提供了 Date.now()方法,返回表示方法执行时日期和时间的毫秒数。这个方法可
以方便地用在代码分析中:
// 起始时间

let start = Date.now(); 

// 调用函数

doSomething(); 

// 结束时间

let stop = Date.now(), 
result = stop - start; 

21.为什么时间对象可以比较大小?
因为比较对象大小,会先调用对象的valueOf()方法,没有就调用toString方法,而时间对象,的valueOf方法返回的是时间戳,打印对象默认调用toString方法,这些方法Date都重写了

22.RegExp中匹配模式的标记有哪一些,含义是?
 g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
 i:不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。
 m:多行模式,表示查找到一行文本末尾时会继续查找。
 y:粘附模式,表示只查找从 lastIndex 开始及之后的字符串。
 u:Unicode 模式,启用 Unicode 匹配。
 s:dotAll 模式,表示元字符.匹配任何字符(包括\n 或\r)。
**23. 正则表达式中[]、^、 、 、 + 、 ∗ 、?、 ( ) 、 ( ∣ ) 、的含义 ? 正则表达式的两个实例方法? ∗ ∗ 一个 [ ] 匹配一个字符 ; a b c 、{}、+、*、?、()、(|)、的含义?正则表达式的两个实例方法?** 一个[] 匹配一个字符; ^abc +、?、()()、的含义?正则表达式的两个实例方法?一个[]匹配一个字符abc 匹配开头结尾,
{}表示前面的一个字符类型,出现的次数;
{n} 硬性量词。表示出现n次
{n,m} 软性量词。表示至少出现n次最多不能超过m次
{n,} 表示至少出现n次
+表示至少出现1次。{1};
表示出现0次或者多次。{0};
?表示出现0或者1。{0,1}
()表示分组: var strjh = 'hello:123
456789385’; /([0-9]+)*([0-9]+)/
|表示或:(a|b|c) a或b或c

.exec() 和.test()
24.正则表达式中()、(|)、(?=exp)(exp是变量)、(?!exp)、.、\d和D、\s和S、\w和W的含义?如何匹配中文?
()表示分组: var strjh = ‘hello:123456789*385’; /([0-9]+)*([0-9]+)/
|表示或:(a|b|c) a或b或c
(?=exp):表示其后紧接指定字符串的字符串
var reg = /e(?=[a-z])/g; //匹配e后面有a-z 的e

(?=exp):表示其后没有紧接字符串的字符串
var reg2 = /e(!l)/g; // 匹配e 后面不是l的e
. [^\n\r] 表示除了换行和回车之外的任意字符。
\d [0-9] 表示数字字符。
\D [^0-9] 表示非数字字符。
\s [\t\n\x0B\f\r] 表示空白字符。
\S [A\t\n\×0B\f\r] 表示非空白字符
\w [a-zA-Z_0-9] 表示单词字符(所有的字母/数字/下划线)。
\W [Aa-zA-Z_0-9] 表示非单词字符

匹配中文:[\u4e00-\u9fa5],是一个固定用法,中文只能在正则表达式里这样表示。

25.字符串返回字符、字符的马元值的方法?字符串的编码方式?
let message = “abcde”;
console.log(message.charAt(2)); // “c” 返回指定索引处的16位码元

let message = “abcde”;
// Unicode "Latin small letter C"的编码是 U+0063
console.log(message.charCodeAt(2)); // 99
查看指定码元的字符编码。这个方法返回指定索引位置的码元值,索
引以整数指定
JavaScript 字符串使用了两种 Unicode 编码混合的策略:UCS-2 和 UTF-16。对于可以采用 16 位编码 的字符(U+0000~U+FFFF),这两种编码实际上是一样的。
26.字符串拼接,字符串提取的方法即参数的含义?
let result = stringValue.concat(“world”, “!”); //可以有多个参数
console.log(result); // “hello world!”
str slice(截取开始索引,截取结束索引)
str subStirng(截取开始索引,截取结束索引)
str substr(截取开始索引,长度)

ECMAScript 提供了 3 个从字符串中提取子字符串的方法:slice()、substr()和 substring()。这 3个方法都返回调用它们的字符串的一个子字符串,而且都接收一或两个参数。第一个参数表示子字符串开 始的位置,第二个参数表示子字符串结束的位置。对 slice()和 substring()而言,第二个参数是提取结 束的位置(即该位置之前的字符会被提取出来)。对 substr()而言,第二个参数表示返回的子字符串数量。 任何情况下,省略第二个参数都意味着提取到字符串末尾。与 concat()方法一样,slice()、substr() 和 substring()也不会修改调用它们的字符串,而只会返回提取到的原始新字符串值。

let stringValue = "hello world"; 
console.log(stringValue.slice(3)); // "lo world" 
console.log(stringValue.substring(3)); // "lo world" 
console.log(stringValue.substr(3)); // "lo world" 
console.log(stringValue.slice(3, 7)); // "lo w" 
console.log(stringValue.substring(3,7)); // "lo w" 
console.log(stringValue.substr(3, 7)); // "lo worl" 

27.两个字符串搜索方法的用法和参数的含义?
有两个方法用于在字符串中定位子字符串:indexOf()和 lastIndexOf()。
indexOf()表示从前往后,lastIndexOf表示从后往前,没搜到-1,搜到返回下标,第二个可选参数表示开始的位置,

let stringValue = "hello world"; 
console.log(stringValue.indexOf("o", 6)); // 7 
console.log(stringValue.lastIndexOf("o", 6)); // 4 

28.字符串包含方法的用法和参数的含义?清除字符串前后空格的方法?
ECMAScript 6 增加了 3 个用于判断字符串中是否包含另一个字符串的方法:
startsWith()、匹配字符串开头 第二个参数表示,开始的位置
endsWith() 匹配字符串结尾 第二个参数表示,结尾的位置
和 includes()匹配字符串全部,从头到尾, 第二个参数表示,开始的位置

let message = "foobarbaz"; 
console.log(message.startsWith("foo")); // true 
console.log(message.startsWith("foo", 1)); // false 
console.log(message.includes("bar")); // true 
console.log(message.includes("bar", 4)); // false 

trim方法
let trimmedStringValue = stringValue.trim();
console.log(stringValue); // " hello world "

29.字符串的语法迭代与解构?
手动使用迭代器:
let message = “abc”;
let stringIterator = messageSymbol.iterator;
console.log(stringIterator.next()); // {value: “a”, done: false}

在 for-of 循环中可以通过这个迭代器按序访问每个字符:
for (const c of “abcde”) {
console.log©;
}

字符串就可以通过解构操作符来解构了。比如,可以更方便地把字符串分割
为字符数组:
let message = “abcde”;
console.log([…message]); // [“a”, “b”, “c”, “d”, “e”]

30.字符串大小写转换的方法?
let stringValue = “hello world”;
console.log(stringValue.toLocaleUpperCase()); // “HELLO WORLD”
console.log(stringValue.toUpperCase()); // “HELLO WORLD”
console.log(stringValue.toLocaleLowerCase()); // “hello world”
console.log(stringValue.toLowerCase()); // “hello world”

31.字符串模式匹配的方法的作用?将字符串变成数组?
1.match() 一个正则参数,和exec一样,返回匹配的结果为一个数组
2.search() 一个正则参数,返回第一匹配到的字符串的下标
3.replace() 替换字符串
当第二个参数是字符串时,第一参数是字符串或正则表达式,匹配的结果替换为第二个字符串
当第二个参数是函数时,第一参数时正则表达式时并且有分组匹配时,第一个参数为匹配结果,第二个为第一个()的内容,第二个参数()… 返回值是替换的新字符串。
var strjh = “1234563333”;
// 通过分组将两个数字拆开
// 第二个参数是函数,返回值就是替换的类容,
// 函数 用agr1和agr2代表,分组 格式是 参数匹配类容,分组1,分组2 。。。
// 函数在replace内部执行
// match表示第一个
// 匹配成功之后 函数才能执行
console.log(strjh.replace(/([0-9]+)*([0-9]+)/gm, function (match, agr1, agr2) {
console.log(“args”, arguments);
// 0: "123456"
// 1: “123”
// 2: “456”
// 3: 0
// 4: "123
4563333"
return agr2 + '
’ + agr1;
})); //4561233333

    // 在正则外部捕获 用$
    // $2和$1不是变量,代表分组,必须是$编号
    console.log(strjh.replace(/([0-9]+)\*([0-9]+)/, '$2*$1'));
    // 在正则表达式内部捕获 用\   但必须保证前后匹配值必要一样,无法匹配
    console.log(strjh.replace(/([0-9]+)\*(\1)/, '$2*$1'))

4.split() 将字符串分割为数组
两个参数,第一个分割字符串标记,第二个是可选参数 分割的字符串的长度
let colors2 = colorText.split(“,”, 2); // [“red”, “blue”]

32.Global对象什么?URL编码方法有哪一些?区别是?
事实上,不存在全局变量或全局函数这种东西。在全局作用域中定义的变量和函数都会变成 Global 对象的属性 。本书前面介绍的函数, 包括 isNaN()、isFinite()、parseInt()和 parseFloat(),实际上都是 Global 对象的方法。
虽然 ECMA-262 没有规定直接访问 Global 对象的方式,但浏览器将 window 对象实现为 Global 对象的代理。因此,所有全局作用域中声明的变量和函数都变成了 window 的属性。

获取Global对象
let global = function() {
return this;
}();
encodeURI()和 encodeURIComponent()方法用于编码统一资源标识符(URI),以便传给浏览器。
有效的 URI 不能包含某些字符,比如空格。使用 URI 编码方法来编码 URI 可以让浏览器能够理解它们, 同时又以特殊的 UTF-8 编码替换掉所有无效字符。
ecnodeURI()方法用于对整个 URI 进行编码,比如"www.wrox.com/illegal value.js"。而
encodeURIComponent()方法用于编码 URI 中单独的组件,比如前面 URL 中的"illegal value.js"。
9
这两个方法的主要区别是,encodeURI()不会编码属于 URL 组件的特殊字符,比如冒号、斜杠、问号、 井号,而 encodeURIComponent()会编码它发现的所有非标准字符。来看下面的例子:

let uri = "http://www.wrox.com/illegal value.js#start"; 
// "http://www.wrox.com/illegal%20value.js#start" 
console.log(encodeURI(uri)); 
// "http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.js%23start" 
console.log(encodeURIComponent(uri)); 

这里使用 encodeURI()编码后,除空格被替换为%20 之外,没有任何变化。而 encodeURI
Component()方法将所有非字母字符都替换成了相应的编码形式。这就是使用 encodeURI()编码整个
URI,但只使用 encodeURIComponent()编码那些会追加到已有 URI 后面的字符串的原因

33.eval()方法有什么用?有什么特点?
当解释器发现 eval()调用时,会将参数解释为实际的 ECMAScript 语句,然后将其插入到该位置。
通过 eval()执行的代码属于该调用所在上下文,被执行的代码与该上下文拥有相同的作用域链。
通过 eval()定义的任何变量和函数都不会被提升,这是因为在解析代码的时候,它们是被包含在
一个字符串中的。它们只是在 eval()执行的时候才会被创建。
在严格模式下,在 eval()内部创建的变量和函数无法被外部访问。换句话说,最后两个例子会报
错。同样,在严格模式下,赋值给 eval 也会导致错误:
“use strict”;
eval = “hi”; // 导致错误

34.写出求数组中最大、最小值的方法、向上向下取整的方法、写一个N位包含数字和小写字母的随机数
要知道数组中的最大值和最小值,可以像下面这样使用扩展操作符:

let values = [1, 2, 3, 4, 5, 6, 7, 8]; 
let max = Math.max(...val); let mix = Math.min(...val);

 Math.ceil()方法始终向上舍入为最接近的整数。 12
 Math.floor()方法始终向下舍入为最接近的整数。

const str = Math.random().toString(36).substr(2, 10);
console.log(str);   // 'w5jetivt7e'

我们同样获得了一个10位数的随机字符串,
先是 Math.random() 生成 [0, 1) 的数,也就是 0.123312、0.982931之类的,然后调用 number 的 toString方法将其转换成36进制的,按照MDN的说法,36进制的转换应该是包含了字母 a~z 和 数字0~9的,因为这样生成的是 0.89kjna21sa 类似这样的,所以要截取一下小数部分,即从索引 2 开始截取10个字符就是我们想要的随机字符串了
很多开源库都使用此方式为DOM元素创建随机ID。

35.为什么字面量字符串可以调用方法?原始值包装类由那几个?特点是?

let s1 = "some text"; 
let s2 = s1.substring(2); 

这是因为后台进行了很多处理,从而实现了上述操作。具体来说,当第二行访问 s1 时,是以读模式访问的,也就是要从内存中读取变量保存的值。在以读模式访问字符串值的任何时候,后台都会执行以下 3 步:
(1) 创建一个 String 类型的实例;
(2) 调用实例上的特定方法;
(3) 销毁实例。
可以把这 3 步想象成执行了如下 3 行 ECMAScript 代码:

let s1 = new String("some text"); 
let s2 = s1.substring(2); 
s1 = null; 

这种行为可以让原始值拥有对象的行为。对布尔值和数值而言,以上 3 步也会在后台发生,只不过
使用的是 Boolean 和 Number 包装类型而已。
引用类型与原始值包装类型的主要区别在于对象的生命周期。在通过 new 实例化引用类型后,得到
的实例会在离开作用域时被销毁,而自动创建的原始值包装对象则只存在于访问它的那行代码执行期
间。这意味着不能在运行时给原始值添加属性和方法。比如下面的例子:

let s1 = "some text"; 
s1.color = "red"; 
console.log(s1.color); // undefined 

这里的第二行代码尝试给字符串 s1 添加了一个 color 属性。可是,第三行代码访问 color 属性时, 它却不见了。原因就是第二行代码运行时会临时创建一个 String 对象,而当第三行代码执行时,这个对 象已经被销毁了。实际上,第三行代码在这里创建了自己的 String 对象,但这个对象没有 color 属性
有 3 种原始值包装类
型:Boolean、Number 和 String。它们都具备如下特点。
 每种包装类型都映射到同名的原始类型。
 以读模式访问原始值时,后台会实例化一个原始值包装类型的对象,借助这个对象可以操作相
应的数据。
 涉及原始值的语句执行完毕后,包装对象就会被销毁(下次执行会重新创建)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值