Follow Me通读JavaScript红皮书(补三章)

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

3.12JavaScript的五种数据类型

3.12.5 String

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

字符字面量

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

字符串的特点

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

转换为字符串

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

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

var num = 10; 
alert(num.toString());         // "10"
 alert(num.toString(2));        // "1010" 
 alert(num.toString(8));        // "12" 
 alert(num.toString(10));       // "10" 
 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 操作符

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

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

一元运算符

var s1 = "01"; 
var s2 = "1.1"; 
var s3 = "z"; 
var b = false; 
var f = 1.1; 
var o = {     valueOf: function() {         return -1;     } }; 
 
s1 = +s1;     // 值变成数值 1 
s2 = +s2;     // 值变成数值 1.1 
s3 = +s3;     // 值变成 
NaN b = +b;       // 值变成数值 
0 f = +f;       // 值未变,仍然是 1.1 
o = +o;       // 值变成数值-1

位操作符

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

正数

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

在这里插入图片描述

扫描二维码关注公众号,回复: 11160700 查看本文章

负数

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

按位非

正数非

在这里插入图片描述

负数非

在这里插入图片描述

按位与

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

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

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

按位或

在这里插入图片描述

按位异或(^)

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

左移

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

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

右移

有符号右移

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

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

无符号右移

正数

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

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

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

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

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

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

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

原创文章 171 获赞 72 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43277404/article/details/104812822