通读JavaScript红皮书(补三章)

╰+攻爆jí腚メ 2023-07-13 12:25 82阅读 0赞

接上一篇文章,之前晚上读到了JavaScript的Number数据结构,所以今天继续往下看。

3.12JavaScript的五种数据类型

3.12.5 String

字符串类型,可以用单引号和双引号表示,所以两种都是有效的。

字符字面量

也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。
在这里插入图片描述

字符串的特点

字符串一旦创建,它们的值就不能改变,要改变某个变量保存的字符串,首先要毁掉原来的字符串,然后再用另一个包含新值的字符串填充该变量。

转换为字符串

  1. toString()方法
  2. var age = 11;
  3. var ageAsString = age.toString(); // 字符串"11" var found = true;
  4. var foundAsString = found.toString(); // 字符串"true"

也可以按照对应的格式进行输出:

  1. var num = 10;
  2. alert(num.toString()); // "10"
  3. alert(num.toString(2)); // "1010"
  4. alert(num.toString(8)); // "12"
  5. alert(num.toString(10)); // "10"
  6. alert(num.toString(16)); // "a"

3.12.6 Object

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

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

Object 的每个实例都具有下列属性和方法:

  • constructor:保存着用于创建当前对象的函数,对于前面的例子而言,构造函数constructor就是Object().
  • hasOwnProperty(propertyName):用于检查给定的属性再当前对象实例中(而不是在实例的原型中)是否存在,函数的属性名必须以字符串形式指定(例如:o.hasOwnProperty("name"))
  • isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够哦使用for-in语句来枚举,函数的属性名必须以字符串形式指定。
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
  • toString():返回对象的字符串表示。
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值 相同。

3.13 操作符

递增递减操作符(–,++)

  1. var s1 = "2";
  2. var s2 = "z";
  3. var b = false;
  4. var f = 1.1;
  5. var o = { valueOf: function() { return -1; } };
  6. s1++; // 值变成数值 3
  7. s2++; // 值变成 NaN
  8. b++; // 值变成数值 1
  9. f--; // 值变成 0.10000000000000009(由于浮点舍入错误所致)
  10. o--; // 值变成数值-2

一元运算符

  1. var s1 = "01";
  2. var s2 = "1.1";
  3. var s3 = "z";
  4. var b = false;
  5. var f = 1.1;
  6. var o = { valueOf: function() { return -1; } };
  7. s1 = +s1; // 值变成数值 1
  8. s2 = +s2; // 值变成数值 1.1
  9. s3 = +s3; // 值变成
  10. NaN b = +b; // 值变成数值
  11. 0 f = +f; // 值未变,仍然是 1.1
  12. o = +o; // 值变成数值-1

位操作符

对于有符号的整数,32位中的前 31位用于表示整数的值。第 32位用于表示数值的符号:0表示正 数,1 表示负数。

正数

以 纯二进制格式存储,31位中的每一位都表示 2的幂。第一位(叫做位 0)表示 2的0次幂,第二位表示 2的1次幂,以此 类推。没有用到的位以 0 填充,即忽略不计。例如,数值 18 的二进制表示是 00000000000000000000000000010010,或者更简洁的 10010。这是 5个有效位,这 5位本身就决定了实 际的值

在这里插入图片描述

负数

负数同样以二进制码存储,但使用的格式是二进制补码。计算一个数值的二进制补码,需要经过下 列 3个步骤:
(1) 求这个数值绝对值的二进制码(例如,要求-18的二进制补码,先求 18的二进制码);
(2) 求二进制反码,即将 0替换为 1,将 1替换为 0;
(3) 得到的二进制反码加 1。
在这里插入图片描述

按位非

正数非

在这里插入图片描述

负数非

在这里插入图片描述

按位与

在这里插入图片描述
简而言之,按位与操作只在两个数值的对应位都是 1时才返回 1,任何一位是 0,结果都是 0。 下面看一个对 25和 3执行按位与操作的例子:

  1. var result = 25 & 3;
  2. alert(result); //1

可见,对 25和 3执行按位与操作的结果是 1。为什么呢?请看其底层操作:
在这里插入图片描述

按位或

在这里插入图片描述

按位异或(^)

在这里插入图片描述
不同点在于,1^1 =0.

左移

左移操作符由两个小于号(<<)表示,这个操作符会将数值的所有位向左移动指定的位数。

  1. var oldValue = 2; // 等于二进制的 10
  2. var newValue = oldValue << 5; // 等于二进制的 1000000,十进制的 64

右移

有符号右移

有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即 正负号标记)。

  1. var oldValue = 64; // 等于二进制的 1000000
  2. var newValue = oldValue >> 5; // 等于二进制的 10 ,即十进制的 2

无符号右移

正数

无符号右移操作符由 3个大于号(>>>)表示,这个操作符会将数值的所有 32位都向右移动。

对正 数来说,无符号右移的结果与有符号右移相同。仍以前面有符号右移的代码为例,如果将 64 无符号右 移 5位,结果仍然还是 2:

  1. var oldValue = 64; // 等于二进制的 1000000
  2. var newValue = oldValue >>> 5; // 等于二进制的 10 ,即十进制的 2
负数

无符号右移操作符会把负数的二进制码当成正数的二进制码。而且,由于负数以其绝对 值的二进制补码形式表示,因此就会导致无符号右移后的结果非常之大,如下面的例子所示:

  1. var oldValue = -64; // 等于二进制的 11111111111111111111111111000000
  2. var newValue = oldValue >>> 5; // 等于十进制的 134217726

这里,当对-64 执行无符号右移 5 位的操作后,得到的结果是 134217726。之所以结果如此之大, 是因为-64的二进制码为 11111111111111111111111111000000,而且无符号右移操作会把这个二进制码当 成正数的二进制码,换算成十进制就是 4294967232。如果把这个值右移 5 位,结果就变成了 00000111111111111111111111111110,即十进制的 134217726。

今晚也先到这
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,82人围观)

还没有评论,来说两句吧...

相关阅读

    相关 通读cheerio API

    所谓工欲善其事,必先利其器,所以通读了[cheerio][]的API,顺便翻译了一遍,有些地方因为知道的比较少,不知道什么意思,保留了英文,希望各位不吝告诉我,然后一起把这个翻

    相关 通读策略

    一:通读策略的流程图: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly