String基础 、Object类型

ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,
例如:

var lang = "Java";
lang = lang + "Script";

以上示例中的变量lang 开始时包含字符串"Java"。而第二行代码把lang 的值重新定义为"Java"与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10 个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。

转换为字符串

要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。这个方法唯一要做的就是返回相应值的字符串表现。来看下面的例子:

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

数值、布尔值、对象和字符串值(没错,每个字符串也都有一个toString()方法,该方法返回字符串的一个副本)都有toString()方法。但null 和undefined 值没有这个方法。

多数情况下,调用toString()方法不必传递参数。但是,在调用数值的toString()方法时,可以传递一个参数输出数值的基数默认情况下,toString()方法以十进制格式返回数值的字符串表示。而通过传递基数,toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格式表示的字符串值。下面给出几个例子:

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"

在不知道要转换的值是不是null 或undefined 的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。String()函数遵循下列转换规则:

 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
 如果值是null,则返回"null";
 如果值是undefined,则返回"undefined"。

下面再看几个例子:

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"

要把某个值转换为字符串,可以使用加号操作符把它与一个字符 串("")加在一起。

Object类型

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

操作符

自增和自减
操作符对任何值都适用,也就是它们不仅适用于整数,还可以用于字符串、布尔值、浮点数值和对象。在应用于不同的值时,递增和递减操作符遵循下列规则。
 在应用于一个包含有效数字字符的字符串时,先将其转换为
数字值
,再执行加减1 的操作。字符串变量变成数值变量。
 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN
字符串变量变成数值变量。
 在应用于布尔值false 时,先将其转换为0 再执行加减1 的操作。布尔值变量变成数值变量。
 在应用于布尔值true 时,先将其转换为1 再执行加减1 的操作。布尔值变量变成数值变量。
 在应用于浮点数值时,执行加减1 的操作。
 在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的
值。然后对该值应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。

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 num = 25;
num = +num; // 仍然是25

*不过,在对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。
换句话说,布尔值false 和true 将被转换为0 和1,字符串值会被按照一组特殊的规则进行解析,而对象是先调用它们的valueOf()和(或)toString()方法,再转换得到的值。

*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

一元减操作符主要用于表示负数,例如将1 转换成1。下面的例子演示了这个简单的转换过程:

var num = 25;
num = -num; // 变成了-25
在将一元减操作符应用于数值时,该值会变成负数(如上面的例子所示)。而当应用于非数值时,

一元减操作符遵循与一元加操作符相同的规则,最后再将得到的数值转换为负数,如下面的例子所示:

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 位本身就决定了实际的值(如图3-1 所示)。
在这里插入图片描述
负数同样以二进制码存储但使用的格式是二进制补码计算一个数值的二进制补码需要经过下列3 个步骤

(1) 求这个数值绝对值的二进制码(例如,要求18 的二进制补码,先求18 的二进制码);
(2) 求二进制反码,即将0 替换为1,将1 替换为0;
(3) 得到的二进制反码加1。

ECMAScript 会尽力向我们隐藏所有这些信息。换句话说,在以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上了一个负号。如下面的例子所示:

var num = -18;
alert(num.toString(2)); // "-10010"

要把数值18 转换成二进制字符串时,得到的结果是"-10010"。这说明转换过程理解了二进制补码并将其以更合乎逻辑的形式展示了出来。

在ECMAScript 中,当对数值应用位操作符时,后台会发生如下转换过程:64 位的数值被转换成32位数值,然后执行位操作,最后再将32 位的结果转换回64 位数值。这样,表面上看起来就好像是在操作32 位数值,就跟在其他语言中以类似方式执行二进制操作一样。但这个转换过程也导致了一个严重的副效应,即在对特殊的NaN 和Infinity 值应用位操作时,这两个值都会被当成0 来处理。
如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。

如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作。得到的结果将是一个数值。

1. 按位非(NOT)
按位非操作符由一个波浪线~)表示,执行按位非的结果就是返回数值的反码。按位非是ECMAScript 操作符中少数几个与二进制计算有关的操作符之一。下面看一个例子:

var num1 = 25; // 二进制00000000000000000000000000011001
var num2 = ~num1; // 二进制11111111111111111111111111100110
alert(num2); // -26

猜你喜欢

转载自blog.csdn.net/weixin_38547641/article/details/88961981